diff --git a/.clang-tidy b/.clang-tidy index cf13b7fef..702a29fac 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -32,6 +32,7 @@ Checks: > -readability-magic-numbers, -readability-identifier-length, -readability-avoid-nested-conditional-operator, + -readability-math-missing-parentheses, WarningsAsErrors: "" HeaderFilterRegex: ".*" FormatStyle: none diff --git a/.clangd b/.clangd new file mode 100644 index 000000000..583e16b9f --- /dev/null +++ b/.clangd @@ -0,0 +1,13 @@ +# Use the build dir's compile_commands.json (has correct include paths). +CompilationDatabase: build + +# Fallback: clangd does not resolve relative paths in Add; use absolute paths. +# Disable fmt consteval for clangd so format-string checks are runtime-only; +# avoids false "not a constant expression" from Clang while the project builds with g++. +CompileFlags: + Add: + - -DFMT_CONSTEVAL= + - -isystem + - /home/zwischen/qsyn/build/_deps/spdlog-src/include + - -isystem + - /home/zwischen/qsyn/build/_deps/fmt-src/include diff --git a/.env.default b/.env.default new file mode 100644 index 000000000..a2ee27de4 --- /dev/null +++ b/.env.default @@ -0,0 +1 @@ +IBMQ_API_KEY= \ No newline at end of file diff --git a/.github/workflows/clang-test-macos.yml b/.github/workflows/clang-test-macos.yml index 76c06403f..6998596d3 100644 --- a/.github/workflows/clang-test-macos.yml +++ b/.github/workflows/clang-test-macos.yml @@ -13,12 +13,13 @@ jobs: steps: - name: Check out Git repository uses: actions/checkout@v3 - - name: Download llvm-clang, parallel and coreutils + - name: Download llvm-clang, parallel, coreutils and OpenBLAS run: | - brew install llvm@18 parallel coreutils + brew install llvm@18 parallel coreutils openblas echo 'export PATH="$(brew --prefix)/opt/llvm@18/bin:$PATH"' >> /Users/runner/.bash_profile - echo 'export LDFLAGS="-L$(brew --prefix)/opt/llvm@18/lib"' >> /Users/runner/.bash_profile - echo 'export CPPFLAGS="-I$(brew --prefix)/opt/llvm@18/include"' >> /Users/runner/.bash_profile + echo 'export LDFLAGS="-L$(brew --prefix)/opt/llvm@18/lib -L$(brew --prefix)/opt/openblas/lib $LDFLAGS"' >> /Users/runner/.bash_profile + echo 'export CPPFLAGS="-I$(brew --prefix)/opt/llvm@18/include -I$(brew --prefix)/opt/openblas/include $CPPFLAGS"' >> /Users/runner/.bash_profile + echo 'export CMAKE_PREFIX_PATH="$(brew --prefix)/opt/openblas:$CMAKE_PREFIX_PATH"' >> /Users/runner/.bash_profile - name: Build and test qsyn run: | diff --git a/.gitignore b/.gitignore index 31ac31ed0..268324642 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ debug/ qsyn* !src/qsyn* !src/qsyn/qsyn* +!src/device/qsyn_device_file.cpp # for work-in-progress things wip/ @@ -26,3 +27,8 @@ docs/doc-coverage.info perf.data perf.data.old + +# python environment +.venv/ +.env +__pycache__/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 28ad503d0..240519bf9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,13 @@ set(CMAKE_CXX_FLAGS "") set(CMAKE_CXX_FLAGS_DEBUG "-g") set(CMAKE_CXX_FLAGS_RELEASE "-O3") +# Set BLA_VENDOR before project() so it's available during initialization +# On macOS, we need to specify OpenBLAS explicitly +# On Linux, we'll use pkg-config instead (see find_package(BLAS) below) +if(NOT CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(BLA_VENDOR OpenBLAS CACHE STRING "BLAS vendor to search for") +endif() + include(FetchContent) include(CheckCXXCompilerFlag) set(FETCHCONTENT_UPDATES_DISCONNECTED TRUE) @@ -84,9 +91,34 @@ include(scripts/cmake/target_link_libraries_system.cmake) # find_package(OpenMP REQUIRED) -set(BLA_VENDER OpenBLAS) -find_package(BLAS REQUIRED) -find_package(LAPACK REQUIRED) +# Use pkg-config to find BLAS and LAPACK on Linux where it's available and reliable +# On macOS, OpenBLAS from Homebrew doesn't provide pkg-config files, so use FindBLAS instead +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + find_package(PkgConfig) + if(PKG_CONFIG_FOUND) + pkg_check_modules(BLAS IMPORTED_TARGET blas) + pkg_check_modules(LAPACK IMPORTED_TARGET lapack) + if(BLAS_FOUND AND LAPACK_FOUND) + # Set variables expected by the rest of the build + set(BLAS_LIBRARIES PkgConfig::BLAS) + set(LAPACK_LIBRARIES PkgConfig::LAPACK) + endif() + endif() +endif() + +# If pkg-config didn't find BLAS/LAPACK (or we're not on Linux), use CMake's find_package +if(NOT BLAS_FOUND OR NOT LAPACK_FOUND) + find_package(BLAS REQUIRED) + find_package(LAPACK REQUIRED) +endif() + +# Ensure BLAS_LIBRARIES and LAPACK_LIBRARIES are set +if(NOT BLAS_LIBRARIES) + set(BLAS_LIBRARIES ${BLAS_openblas_LIBRARY}) +endif() +if(NOT LAPACK_LIBRARIES) + set(LAPACK_LIBRARIES ${LAPACK_openblas_LIBRARY}) +endif() FetchContent_Declare( xtl @@ -109,26 +141,6 @@ FetchContent_Declare( GIT_TAG 0.22.0) FetchContent_MakeAvailable(xtensor-blas) -# --- libfort (patched for new CMake) --- -FetchContent_Declare( - libfort - SYSTEM - GIT_REPOSITORY https://github.com/seleznevae/libfort.git - GIT_TAG v0.4.2 - GIT_SHALLOW ON -) - -# turn off libfort's own tests -set(FORT_ENABLE_TESTING OFF CACHE INTERNAL "") - -FetchContent_GetProperties(libfort) -if(NOT libfort_POPULATED) - FetchContent_Populate(libfort) -endif() -# Always bump (even if already populated from a previous configure) -qsyn_bump_min_cmake("${libfort_SOURCE_DIR}" 3.10) -add_subdirectory("${libfort_SOURCE_DIR}" "${libfort_BINARY_DIR}" SYSTEM) - FetchContent_Declare( fmt SYSTEM @@ -185,6 +197,7 @@ FetchContent_Declare( FetchContent_MakeAvailable(cadical) # --- libabc (patched for new CMake) --- +set(READLINE_FOUND FALSE CACHE BOOL "Disable readline in libabc") FetchContent_Declare( libabc SYSTEM @@ -265,7 +278,6 @@ target_link_libraries_system( xtl xtensor xtensor-blas - libfort::fort fmt::fmt spdlog::spdlog Microsoft.GSL::GSL @@ -275,7 +287,6 @@ target_link_libraries_system( target_link_libraries( ${QSYN_LIB_NAME} PRIVATE - lapack # OpenMP::OpenMP_CXX ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) @@ -302,6 +313,13 @@ target_compile_options( target_compile_options( ${CMAKE_PROJECT_NAME} PRIVATE -Wno-missing-field-initializers) +# GCC-specific: disable -Wmaybe-uninitialized (has false positives with templates) +check_cxx_compiler_flag(-Wno-maybe-uninitialized COMPILER_SUPPORTS_WNO_MAYBE_UNINITIALIZED) +if(COMPILER_SUPPORTS_WNO_MAYBE_UNINITIALIZED) + target_compile_options( + ${CMAKE_PROJECT_NAME} PRIVATE -Wno-maybe-uninitialized) +endif() + # GCC 12+ is too strict about restrict warnings in std::string operations # Only apply to GCC, as Clang doesn't support this flag check_cxx_compiler_flag(-Wno-restrict COMPILER_SUPPORTS_WNO_RESTRICT) @@ -327,15 +345,14 @@ target_link_libraries_system( xtl xtensor xtensor-blas - libfort::fort fmt::fmt spdlog::spdlog Microsoft.GSL::GSL - sul::dynamic_bitset) + sul::dynamic_bitset + nlohmann_json::nlohmann_json) target_link_libraries( ${CMAKE_PROJECT_NAME} PRIVATE - lapack # OpenMP::OpenMP_CXX ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES}) @@ -368,7 +385,8 @@ target_link_libraries_system( PRIVATE fmt::fmt spdlog::spdlog - Microsoft.GSL::GSL) + Microsoft.GSL::GSL + sul::dynamic_bitset) target_compile_options( ${UNIT_TEST_NAME} @@ -381,6 +399,14 @@ target_compile_options( PRIVATE -Wno-missing-field-initializers) +# GCC-specific: disable -Wmaybe-uninitialized (has false positives with templates) +if(COMPILER_SUPPORTS_WNO_MAYBE_UNINITIALIZED) + target_compile_options( + ${UNIT_TEST_NAME} + PRIVATE + -Wno-maybe-uninitialized) +endif() + # GCC 12+ is too strict about restrict warnings in std::string operations # Only apply to GCC, as Clang doesn't support this flag if(COMPILER_SUPPORTS_WNO_RESTRICT) diff --git a/Makefile b/Makefile index b19e49ecf..a4169c1c9 100644 --- a/Makefile +++ b/Makefile @@ -93,7 +93,11 @@ test-update: # run clang-format and clang-tidy on the source code lint: - ./scripts/LINT + @if [ -z "$(ARGS)" ]; then \ + ./scripts/LINT; \ + else \ + ./scripts/LINT $(ARGS); \ + fi .PHONY: lint clean: diff --git a/benchmark/fham/convert_fermihedral.py b/benchmark/fham/convert_fermihedral.py new file mode 100644 index 000000000..5c90621c0 --- /dev/null +++ b/benchmark/fham/convert_fermihedral.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python3 +""" +Convert fermihedral model files to qsyn fermionic Hamiltonian (.fham) format. + +Mapping rules: +- Input directory (default): ~/fermihedral/model +- Output directory (default): benchmark/fham +- Each non-empty, non-comment line in a fermihedral file is a single term. +- A term is a list of signed integers, e.g.: + + -1 2 + + Interpretation: + - Sign encodes operator type: + k < 0 → creation operator a_{|k|}^† + k > 0 → annihilation operator a_{|k|} + - Indices are the same in both formats (no off-by-one). + - Coefficient is defaulted to (1, 0) (i.e. 1 + 0j) for every term. + +Example: + fermihedral: -1 2 + qsyn (.fham): (1, 0) 0^ 1 +""" + +from __future__ import annotations + +import argparse +import pathlib +from typing import Iterable + + +def parse_line_to_ops(line: str) -> list[tuple[int, bool]]: + """Parse a single fermihedral term line into (mode, is_creation) ops. + + - Skips comments after '#'. + - Returns an empty list if there are no operator tokens. + """ + # Strip comments + line = line.split("#", maxsplit=1)[0].strip() + if not line: + return [] + + tokens = line.split() + ops: list[tuple[int, bool]] = [] + for tok in tokens: + try: + k = int(tok) + except ValueError: + raise ValueError(f"Invalid integer token '{tok}' in line: {line!r}") + + is_creation = k < 0 + mode = abs(k) # no index shift; 0 is allowed + + ops.append((mode, is_creation)) + return ops + + +def convert_file(src_path: pathlib.Path, dst_path: pathlib.Path) -> None: + """Convert one fermihedral model file to qsyn .fham format.""" + lines: list[str] = src_path.read_text(encoding="utf-8").splitlines() + + # Some fermihedral model files encode Majorana operators using an "mj" + # token on the first line. We currently do not support Majorana terms, so + # skip converting such files but emit a clear warning. + if lines: + first_tokens = lines[0].split() + if any(tok == "mj" for tok in first_tokens): + print( + f"Warning: skipping {src_path} because it uses Majorana operators " + "(mj), which are not supported yet." + ) + return + + out_lines: list[str] = [] + + # Many fermihedral model files start with a non-operator header line + # (e.g., "electronic 10 ac"). We skip the first line unconditionally. + for idx, line in enumerate(lines): + if idx == 0: + continue + stripped = line.strip() + # Preserve blank and comment-only lines for readability + if not stripped or stripped.startswith("#"): + out_lines.append(stripped) + continue + + try: + ops = parse_line_to_ops(line) + except ValueError as e: + raise ValueError(f"Error in file {src_path}, line {line!r}: {e}") from e + + if not ops: + # No operators after stripping comments; skip the line + continue + + # Default coefficient (1, 0) as requested + pieces: list[str] = ["(1, 0)"] + for mode, is_creation in ops: + pieces.append(f"{mode}{'^' if is_creation else ''}") + + out_lines.append(" ".join(pieces)) + + dst_path.parent.mkdir(parents=True, exist_ok=True) + dst_path.write_text("\n".join(out_lines) + "\n", encoding="utf-8") + + +def iter_model_files(src_dir: pathlib.Path) -> Iterable[pathlib.Path]: + """Yield all regular files under src_dir (non-recursive).""" + if not src_dir.exists(): + raise FileNotFoundError(f"Source directory does not exist: {src_dir}") + for p in sorted(src_dir.iterdir()): + if p.is_file(): + yield p + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Convert fermihedral model files to qsyn .fham format." + ) + parser.add_argument( + "--src", + type=pathlib.Path, + default=pathlib.Path("~").expanduser() / "fermihedral" / "model", + help="Source directory containing fermihedral model files " + "(default: ~/fermihedral/model)", + ) + parser.add_argument( + "--dst", + type=pathlib.Path, + default=pathlib.Path("benchmark") / "fham", + help="Destination directory for converted .fham files " + "(default: benchmark/fham)", + ) + parser.add_argument( + "--suffix", + type=str, + default=".fham", + help="Suffix to append to converted filenames (default: .fham)", + ) + + args = parser.parse_args() + + src_dir: pathlib.Path = args.src + dst_dir: pathlib.Path = args.dst + suffix: str = args.suffix + + for src_file in iter_model_files(src_dir): + dst_name = src_file.name + suffix if not src_file.name.endswith(suffix) else src_file.name + dst_path = dst_dir / dst_name + convert_file(src_file, dst_path) + print(f"Converted {src_file} -> {dst_path}") + + +if __name__ == "__main__": + main() + diff --git a/benchmark/fham/electron-10.fham b/benchmark/fham/electron-10.fham new file mode 100644 index 000000000..50ee4a1b8 --- /dev/null +++ b/benchmark/fham/electron-10.fham @@ -0,0 +1,810 @@ +(1, 0) 1 1^ +(1, 0) 1 2^ +(1, 0) 1 5^ +(1, 0) 2 1^ +(1, 0) 2 2^ +(1, 0) 2 5^ +(1, 0) 3 3^ +(1, 0) 4 4^ +(1, 0) 5 1^ +(1, 0) 5 2^ +(1, 0) 5 5^ +(1, 0) 6 6^ +(1, 0) 6 7^ +(1, 0) 6 10^ +(1, 0) 7 6^ +(1, 0) 7 7^ +(1, 0) 7 10^ +(1, 0) 8 8^ +(1, 0) 9 9^ +(1, 0) 10 6^ +(1, 0) 10 7^ +(1, 0) 10 10^ +(1, 0) 1 1 1^ 1^ +(1, 0) 1 1 1^ 2^ +(1, 0) 1 1 1^ 5^ +(1, 0) 1 1 2^ 1^ +(1, 0) 1 1 2^ 2^ +(1, 0) 1 1 2^ 5^ +(1, 0) 1 1 3^ 3^ +(1, 0) 1 1 4^ 4^ +(1, 0) 1 1 5^ 1^ +(1, 0) 1 1 5^ 2^ +(1, 0) 1 1 5^ 5^ +(1, 0) 1 2 1^ 1^ +(1, 0) 1 2 1^ 2^ +(1, 0) 1 2 1^ 5^ +(1, 0) 1 2 2^ 1^ +(1, 0) 1 2 2^ 2^ +(1, 0) 1 2 2^ 5^ +(1, 0) 1 2 3^ 3^ +(1, 0) 1 2 4^ 4^ +(1, 0) 1 2 5^ 1^ +(1, 0) 1 2 5^ 2^ +(1, 0) 1 2 5^ 5^ +(1, 0) 1 3 1^ 3^ +(1, 0) 1 3 2^ 3^ +(1, 0) 1 3 3^ 1^ +(1, 0) 1 3 3^ 2^ +(1, 0) 1 3 3^ 5^ +(1, 0) 1 3 5^ 3^ +(1, 0) 1 4 1^ 4^ +(1, 0) 1 4 2^ 4^ +(1, 0) 1 4 4^ 1^ +(1, 0) 1 4 4^ 2^ +(1, 0) 1 4 4^ 5^ +(1, 0) 1 4 5^ 4^ +(1, 0) 1 5 1^ 1^ +(1, 0) 1 5 1^ 2^ +(1, 0) 1 5 1^ 5^ +(1, 0) 1 5 2^ 1^ +(1, 0) 1 5 2^ 2^ +(1, 0) 1 5 2^ 5^ +(1, 0) 1 5 3^ 3^ +(1, 0) 1 5 4^ 4^ +(1, 0) 1 5 5^ 1^ +(1, 0) 1 5 5^ 2^ +(1, 0) 1 5 5^ 5^ +(1, 0) 1 6 6^ 1^ +(1, 0) 1 6 6^ 2^ +(1, 0) 1 6 6^ 5^ +(1, 0) 1 6 7^ 1^ +(1, 0) 1 6 7^ 2^ +(1, 0) 1 6 7^ 5^ +(1, 0) 1 6 8^ 3^ +(1, 0) 1 6 9^ 4^ +(1, 0) 1 6 10^ 1^ +(1, 0) 1 6 10^ 2^ +(1, 0) 1 6 10^ 5^ +(1, 0) 1 7 6^ 1^ +(1, 0) 1 7 6^ 2^ +(1, 0) 1 7 6^ 5^ +(1, 0) 1 7 7^ 1^ +(1, 0) 1 7 7^ 2^ +(1, 0) 1 7 7^ 5^ +(1, 0) 1 7 8^ 3^ +(1, 0) 1 7 9^ 4^ +(1, 0) 1 7 10^ 1^ +(1, 0) 1 7 10^ 2^ +(1, 0) 1 7 10^ 5^ +(1, 0) 1 8 6^ 3^ +(1, 0) 1 8 7^ 3^ +(1, 0) 1 8 8^ 1^ +(1, 0) 1 8 8^ 2^ +(1, 0) 1 8 8^ 5^ +(1, 0) 1 8 10^ 3^ +(1, 0) 1 9 6^ 4^ +(1, 0) 1 9 7^ 4^ +(1, 0) 1 9 9^ 1^ +(1, 0) 1 9 9^ 2^ +(1, 0) 1 9 9^ 5^ +(1, 0) 1 9 10^ 4^ +(1, 0) 1 10 6^ 1^ +(1, 0) 1 10 6^ 2^ +(1, 0) 1 10 6^ 5^ +(1, 0) 1 10 7^ 1^ +(1, 0) 1 10 7^ 2^ +(1, 0) 1 10 7^ 5^ +(1, 0) 1 10 8^ 3^ +(1, 0) 1 10 9^ 4^ +(1, 0) 1 10 10^ 1^ +(1, 0) 1 10 10^ 2^ +(1, 0) 1 10 10^ 5^ +(1, 0) 2 1 1^ 1^ +(1, 0) 2 1 1^ 2^ +(1, 0) 2 1 1^ 5^ +(1, 0) 2 1 2^ 1^ +(1, 0) 2 1 2^ 2^ +(1, 0) 2 1 2^ 5^ +(1, 0) 2 1 3^ 3^ +(1, 0) 2 1 4^ 4^ +(1, 0) 2 1 5^ 1^ +(1, 0) 2 1 5^ 2^ +(1, 0) 2 1 5^ 5^ +(1, 0) 2 2 1^ 1^ +(1, 0) 2 2 1^ 2^ +(1, 0) 2 2 1^ 5^ +(1, 0) 2 2 2^ 1^ +(1, 0) 2 2 2^ 2^ +(1, 0) 2 2 2^ 5^ +(1, 0) 2 2 3^ 3^ +(1, 0) 2 2 4^ 4^ +(1, 0) 2 2 5^ 1^ +(1, 0) 2 2 5^ 2^ +(1, 0) 2 2 5^ 5^ +(1, 0) 2 3 1^ 3^ +(1, 0) 2 3 2^ 3^ +(1, 0) 2 3 3^ 1^ +(1, 0) 2 3 3^ 2^ +(1, 0) 2 3 3^ 5^ +(1, 0) 2 3 5^ 3^ +(1, 0) 2 4 1^ 4^ +(1, 0) 2 4 2^ 4^ +(1, 0) 2 4 4^ 1^ +(1, 0) 2 4 4^ 2^ +(1, 0) 2 4 4^ 5^ +(1, 0) 2 4 5^ 4^ +(1, 0) 2 5 1^ 1^ +(1, 0) 2 5 1^ 2^ +(1, 0) 2 5 1^ 5^ +(1, 0) 2 5 2^ 1^ +(1, 0) 2 5 2^ 2^ +(1, 0) 2 5 2^ 5^ +(1, 0) 2 5 3^ 3^ +(1, 0) 2 5 4^ 4^ +(1, 0) 2 5 5^ 1^ +(1, 0) 2 5 5^ 2^ +(1, 0) 2 5 5^ 5^ +(1, 0) 2 6 6^ 1^ +(1, 0) 2 6 6^ 2^ +(1, 0) 2 6 6^ 5^ +(1, 0) 2 6 7^ 1^ +(1, 0) 2 6 7^ 2^ +(1, 0) 2 6 7^ 5^ +(1, 0) 2 6 8^ 3^ +(1, 0) 2 6 9^ 4^ +(1, 0) 2 6 10^ 1^ +(1, 0) 2 6 10^ 2^ +(1, 0) 2 6 10^ 5^ +(1, 0) 2 7 6^ 1^ +(1, 0) 2 7 6^ 2^ +(1, 0) 2 7 6^ 5^ +(1, 0) 2 7 7^ 1^ +(1, 0) 2 7 7^ 2^ +(1, 0) 2 7 7^ 5^ +(1, 0) 2 7 8^ 3^ +(1, 0) 2 7 9^ 4^ +(1, 0) 2 7 10^ 1^ +(1, 0) 2 7 10^ 2^ +(1, 0) 2 7 10^ 5^ +(1, 0) 2 8 6^ 3^ +(1, 0) 2 8 7^ 3^ +(1, 0) 2 8 8^ 1^ +(1, 0) 2 8 8^ 2^ +(1, 0) 2 8 8^ 5^ +(1, 0) 2 8 10^ 3^ +(1, 0) 2 9 6^ 4^ +(1, 0) 2 9 7^ 4^ +(1, 0) 2 9 9^ 1^ +(1, 0) 2 9 9^ 2^ +(1, 0) 2 9 9^ 5^ +(1, 0) 2 9 10^ 4^ +(1, 0) 2 10 6^ 1^ +(1, 0) 2 10 6^ 2^ +(1, 0) 2 10 6^ 5^ +(1, 0) 2 10 7^ 1^ +(1, 0) 2 10 7^ 2^ +(1, 0) 2 10 7^ 5^ +(1, 0) 2 10 8^ 3^ +(1, 0) 2 10 9^ 4^ +(1, 0) 2 10 10^ 1^ +(1, 0) 2 10 10^ 2^ +(1, 0) 2 10 10^ 5^ +(1, 0) 3 1 1^ 3^ +(1, 0) 3 1 2^ 3^ +(1, 0) 3 1 3^ 1^ +(1, 0) 3 1 3^ 2^ +(1, 0) 3 1 3^ 5^ +(1, 0) 3 1 5^ 3^ +(1, 0) 3 2 1^ 3^ +(1, 0) 3 2 2^ 3^ +(1, 0) 3 2 3^ 1^ +(1, 0) 3 2 3^ 2^ +(1, 0) 3 2 3^ 5^ +(1, 0) 3 2 5^ 3^ +(1, 0) 3 3 1^ 1^ +(1, 0) 3 3 1^ 2^ +(1, 0) 3 3 1^ 5^ +(1, 0) 3 3 2^ 1^ +(1, 0) 3 3 2^ 2^ +(1, 0) 3 3 2^ 5^ +(1, 0) 3 3 3^ 3^ +(1, 0) 3 3 4^ 4^ +(1, 0) 3 3 5^ 1^ +(1, 0) 3 3 5^ 2^ +(1, 0) 3 3 5^ 5^ +(1, 0) 3 4 3^ 4^ +(1, 0) 3 4 4^ 3^ +(1, 0) 3 5 1^ 3^ +(1, 0) 3 5 2^ 3^ +(1, 0) 3 5 3^ 1^ +(1, 0) 3 5 3^ 2^ +(1, 0) 3 5 3^ 5^ +(1, 0) 3 5 5^ 3^ +(1, 0) 3 6 6^ 3^ +(1, 0) 3 6 7^ 3^ +(1, 0) 3 6 8^ 1^ +(1, 0) 3 6 8^ 2^ +(1, 0) 3 6 8^ 5^ +(1, 0) 3 6 10^ 3^ +(1, 0) 3 7 6^ 3^ +(1, 0) 3 7 7^ 3^ +(1, 0) 3 7 8^ 1^ +(1, 0) 3 7 8^ 2^ +(1, 0) 3 7 8^ 5^ +(1, 0) 3 7 10^ 3^ +(1, 0) 3 8 6^ 1^ +(1, 0) 3 8 6^ 2^ +(1, 0) 3 8 6^ 5^ +(1, 0) 3 8 7^ 1^ +(1, 0) 3 8 7^ 2^ +(1, 0) 3 8 7^ 5^ +(1, 0) 3 8 8^ 3^ +(1, 0) 3 8 9^ 4^ +(1, 0) 3 8 10^ 1^ +(1, 0) 3 8 10^ 2^ +(1, 0) 3 8 10^ 5^ +(1, 0) 3 9 8^ 4^ +(1, 0) 3 9 9^ 3^ +(1, 0) 3 10 6^ 3^ +(1, 0) 3 10 7^ 3^ +(1, 0) 3 10 8^ 1^ +(1, 0) 3 10 8^ 2^ +(1, 0) 3 10 8^ 5^ +(1, 0) 3 10 10^ 3^ +(1, 0) 4 1 1^ 4^ +(1, 0) 4 1 2^ 4^ +(1, 0) 4 1 4^ 1^ +(1, 0) 4 1 4^ 2^ +(1, 0) 4 1 4^ 5^ +(1, 0) 4 1 5^ 4^ +(1, 0) 4 2 1^ 4^ +(1, 0) 4 2 2^ 4^ +(1, 0) 4 2 4^ 1^ +(1, 0) 4 2 4^ 2^ +(1, 0) 4 2 4^ 5^ +(1, 0) 4 2 5^ 4^ +(1, 0) 4 3 3^ 4^ +(1, 0) 4 3 4^ 3^ +(1, 0) 4 4 1^ 1^ +(1, 0) 4 4 1^ 2^ +(1, 0) 4 4 1^ 5^ +(1, 0) 4 4 2^ 1^ +(1, 0) 4 4 2^ 2^ +(1, 0) 4 4 2^ 5^ +(1, 0) 4 4 3^ 3^ +(1, 0) 4 4 4^ 4^ +(1, 0) 4 4 5^ 1^ +(1, 0) 4 4 5^ 2^ +(1, 0) 4 4 5^ 5^ +(1, 0) 4 5 1^ 4^ +(1, 0) 4 5 2^ 4^ +(1, 0) 4 5 4^ 1^ +(1, 0) 4 5 4^ 2^ +(1, 0) 4 5 4^ 5^ +(1, 0) 4 5 5^ 4^ +(1, 0) 4 6 6^ 4^ +(1, 0) 4 6 7^ 4^ +(1, 0) 4 6 9^ 1^ +(1, 0) 4 6 9^ 2^ +(1, 0) 4 6 9^ 5^ +(1, 0) 4 6 10^ 4^ +(1, 0) 4 7 6^ 4^ +(1, 0) 4 7 7^ 4^ +(1, 0) 4 7 9^ 1^ +(1, 0) 4 7 9^ 2^ +(1, 0) 4 7 9^ 5^ +(1, 0) 4 7 10^ 4^ +(1, 0) 4 8 8^ 4^ +(1, 0) 4 8 9^ 3^ +(1, 0) 4 9 6^ 1^ +(1, 0) 4 9 6^ 2^ +(1, 0) 4 9 6^ 5^ +(1, 0) 4 9 7^ 1^ +(1, 0) 4 9 7^ 2^ +(1, 0) 4 9 7^ 5^ +(1, 0) 4 9 8^ 3^ +(1, 0) 4 9 9^ 4^ +(1, 0) 4 9 10^ 1^ +(1, 0) 4 9 10^ 2^ +(1, 0) 4 9 10^ 5^ +(1, 0) 4 10 6^ 4^ +(1, 0) 4 10 7^ 4^ +(1, 0) 4 10 9^ 1^ +(1, 0) 4 10 9^ 2^ +(1, 0) 4 10 9^ 5^ +(1, 0) 4 10 10^ 4^ +(1, 0) 5 1 1^ 1^ +(1, 0) 5 1 1^ 2^ +(1, 0) 5 1 1^ 5^ +(1, 0) 5 1 2^ 1^ +(1, 0) 5 1 2^ 2^ +(1, 0) 5 1 2^ 5^ +(1, 0) 5 1 3^ 3^ +(1, 0) 5 1 4^ 4^ +(1, 0) 5 1 5^ 1^ +(1, 0) 5 1 5^ 2^ +(1, 0) 5 1 5^ 5^ +(1, 0) 5 2 1^ 1^ +(1, 0) 5 2 1^ 2^ +(1, 0) 5 2 1^ 5^ +(1, 0) 5 2 2^ 1^ +(1, 0) 5 2 2^ 2^ +(1, 0) 5 2 2^ 5^ +(1, 0) 5 2 3^ 3^ +(1, 0) 5 2 4^ 4^ +(1, 0) 5 2 5^ 1^ +(1, 0) 5 2 5^ 2^ +(1, 0) 5 2 5^ 5^ +(1, 0) 5 3 1^ 3^ +(1, 0) 5 3 2^ 3^ +(1, 0) 5 3 3^ 1^ +(1, 0) 5 3 3^ 2^ +(1, 0) 5 3 3^ 5^ +(1, 0) 5 3 5^ 3^ +(1, 0) 5 4 1^ 4^ +(1, 0) 5 4 2^ 4^ +(1, 0) 5 4 4^ 1^ +(1, 0) 5 4 4^ 2^ +(1, 0) 5 4 4^ 5^ +(1, 0) 5 4 5^ 4^ +(1, 0) 5 5 1^ 1^ +(1, 0) 5 5 1^ 2^ +(1, 0) 5 5 1^ 5^ +(1, 0) 5 5 2^ 1^ +(1, 0) 5 5 2^ 2^ +(1, 0) 5 5 2^ 5^ +(1, 0) 5 5 3^ 3^ +(1, 0) 5 5 4^ 4^ +(1, 0) 5 5 5^ 1^ +(1, 0) 5 5 5^ 2^ +(1, 0) 5 5 5^ 5^ +(1, 0) 5 6 6^ 1^ +(1, 0) 5 6 6^ 2^ +(1, 0) 5 6 6^ 5^ +(1, 0) 5 6 7^ 1^ +(1, 0) 5 6 7^ 2^ +(1, 0) 5 6 7^ 5^ +(1, 0) 5 6 8^ 3^ +(1, 0) 5 6 9^ 4^ +(1, 0) 5 6 10^ 1^ +(1, 0) 5 6 10^ 2^ +(1, 0) 5 6 10^ 5^ +(1, 0) 5 7 6^ 1^ +(1, 0) 5 7 6^ 2^ +(1, 0) 5 7 6^ 5^ +(1, 0) 5 7 7^ 1^ +(1, 0) 5 7 7^ 2^ +(1, 0) 5 7 7^ 5^ +(1, 0) 5 7 8^ 3^ +(1, 0) 5 7 9^ 4^ +(1, 0) 5 7 10^ 1^ +(1, 0) 5 7 10^ 2^ +(1, 0) 5 7 10^ 5^ +(1, 0) 5 8 6^ 3^ +(1, 0) 5 8 7^ 3^ +(1, 0) 5 8 8^ 1^ +(1, 0) 5 8 8^ 2^ +(1, 0) 5 8 8^ 5^ +(1, 0) 5 8 10^ 3^ +(1, 0) 5 9 6^ 4^ +(1, 0) 5 9 7^ 4^ +(1, 0) 5 9 9^ 1^ +(1, 0) 5 9 9^ 2^ +(1, 0) 5 9 9^ 5^ +(1, 0) 5 9 10^ 4^ +(1, 0) 5 10 6^ 1^ +(1, 0) 5 10 6^ 2^ +(1, 0) 5 10 6^ 5^ +(1, 0) 5 10 7^ 1^ +(1, 0) 5 10 7^ 2^ +(1, 0) 5 10 7^ 5^ +(1, 0) 5 10 8^ 3^ +(1, 0) 5 10 9^ 4^ +(1, 0) 5 10 10^ 1^ +(1, 0) 5 10 10^ 2^ +(1, 0) 5 10 10^ 5^ +(1, 0) 6 1 1^ 6^ +(1, 0) 6 1 1^ 7^ +(1, 0) 6 1 1^ 10^ +(1, 0) 6 1 2^ 6^ +(1, 0) 6 1 2^ 7^ +(1, 0) 6 1 2^ 10^ +(1, 0) 6 1 3^ 8^ +(1, 0) 6 1 4^ 9^ +(1, 0) 6 1 5^ 6^ +(1, 0) 6 1 5^ 7^ +(1, 0) 6 1 5^ 10^ +(1, 0) 6 2 1^ 6^ +(1, 0) 6 2 1^ 7^ +(1, 0) 6 2 1^ 10^ +(1, 0) 6 2 2^ 6^ +(1, 0) 6 2 2^ 7^ +(1, 0) 6 2 2^ 10^ +(1, 0) 6 2 3^ 8^ +(1, 0) 6 2 4^ 9^ +(1, 0) 6 2 5^ 6^ +(1, 0) 6 2 5^ 7^ +(1, 0) 6 2 5^ 10^ +(1, 0) 6 3 1^ 8^ +(1, 0) 6 3 2^ 8^ +(1, 0) 6 3 3^ 6^ +(1, 0) 6 3 3^ 7^ +(1, 0) 6 3 3^ 10^ +(1, 0) 6 3 5^ 8^ +(1, 0) 6 4 1^ 9^ +(1, 0) 6 4 2^ 9^ +(1, 0) 6 4 4^ 6^ +(1, 0) 6 4 4^ 7^ +(1, 0) 6 4 4^ 10^ +(1, 0) 6 4 5^ 9^ +(1, 0) 6 5 1^ 6^ +(1, 0) 6 5 1^ 7^ +(1, 0) 6 5 1^ 10^ +(1, 0) 6 5 2^ 6^ +(1, 0) 6 5 2^ 7^ +(1, 0) 6 5 2^ 10^ +(1, 0) 6 5 3^ 8^ +(1, 0) 6 5 4^ 9^ +(1, 0) 6 5 5^ 6^ +(1, 0) 6 5 5^ 7^ +(1, 0) 6 5 5^ 10^ +(1, 0) 6 6 6^ 6^ +(1, 0) 6 6 6^ 7^ +(1, 0) 6 6 6^ 10^ +(1, 0) 6 6 7^ 6^ +(1, 0) 6 6 7^ 7^ +(1, 0) 6 6 7^ 10^ +(1, 0) 6 6 8^ 8^ +(1, 0) 6 6 9^ 9^ +(1, 0) 6 6 10^ 6^ +(1, 0) 6 6 10^ 7^ +(1, 0) 6 6 10^ 10^ +(1, 0) 6 7 6^ 6^ +(1, 0) 6 7 6^ 7^ +(1, 0) 6 7 6^ 10^ +(1, 0) 6 7 7^ 6^ +(1, 0) 6 7 7^ 7^ +(1, 0) 6 7 7^ 10^ +(1, 0) 6 7 8^ 8^ +(1, 0) 6 7 9^ 9^ +(1, 0) 6 7 10^ 6^ +(1, 0) 6 7 10^ 7^ +(1, 0) 6 7 10^ 10^ +(1, 0) 6 8 6^ 8^ +(1, 0) 6 8 7^ 8^ +(1, 0) 6 8 8^ 6^ +(1, 0) 6 8 8^ 7^ +(1, 0) 6 8 8^ 10^ +(1, 0) 6 8 10^ 8^ +(1, 0) 6 9 6^ 9^ +(1, 0) 6 9 7^ 9^ +(1, 0) 6 9 9^ 6^ +(1, 0) 6 9 9^ 7^ +(1, 0) 6 9 9^ 10^ +(1, 0) 6 9 10^ 9^ +(1, 0) 6 10 6^ 6^ +(1, 0) 6 10 6^ 7^ +(1, 0) 6 10 6^ 10^ +(1, 0) 6 10 7^ 6^ +(1, 0) 6 10 7^ 7^ +(1, 0) 6 10 7^ 10^ +(1, 0) 6 10 8^ 8^ +(1, 0) 6 10 9^ 9^ +(1, 0) 6 10 10^ 6^ +(1, 0) 6 10 10^ 7^ +(1, 0) 6 10 10^ 10^ +(1, 0) 7 1 1^ 6^ +(1, 0) 7 1 1^ 7^ +(1, 0) 7 1 1^ 10^ +(1, 0) 7 1 2^ 6^ +(1, 0) 7 1 2^ 7^ +(1, 0) 7 1 2^ 10^ +(1, 0) 7 1 3^ 8^ +(1, 0) 7 1 4^ 9^ +(1, 0) 7 1 5^ 6^ +(1, 0) 7 1 5^ 7^ +(1, 0) 7 1 5^ 10^ +(1, 0) 7 2 1^ 6^ +(1, 0) 7 2 1^ 7^ +(1, 0) 7 2 1^ 10^ +(1, 0) 7 2 2^ 6^ +(1, 0) 7 2 2^ 7^ +(1, 0) 7 2 2^ 10^ +(1, 0) 7 2 3^ 8^ +(1, 0) 7 2 4^ 9^ +(1, 0) 7 2 5^ 6^ +(1, 0) 7 2 5^ 7^ +(1, 0) 7 2 5^ 10^ +(1, 0) 7 3 1^ 8^ +(1, 0) 7 3 2^ 8^ +(1, 0) 7 3 3^ 6^ +(1, 0) 7 3 3^ 7^ +(1, 0) 7 3 3^ 10^ +(1, 0) 7 3 5^ 8^ +(1, 0) 7 4 1^ 9^ +(1, 0) 7 4 2^ 9^ +(1, 0) 7 4 4^ 6^ +(1, 0) 7 4 4^ 7^ +(1, 0) 7 4 4^ 10^ +(1, 0) 7 4 5^ 9^ +(1, 0) 7 5 1^ 6^ +(1, 0) 7 5 1^ 7^ +(1, 0) 7 5 1^ 10^ +(1, 0) 7 5 2^ 6^ +(1, 0) 7 5 2^ 7^ +(1, 0) 7 5 2^ 10^ +(1, 0) 7 5 3^ 8^ +(1, 0) 7 5 4^ 9^ +(1, 0) 7 5 5^ 6^ +(1, 0) 7 5 5^ 7^ +(1, 0) 7 5 5^ 10^ +(1, 0) 7 6 6^ 6^ +(1, 0) 7 6 6^ 7^ +(1, 0) 7 6 6^ 10^ +(1, 0) 7 6 7^ 6^ +(1, 0) 7 6 7^ 7^ +(1, 0) 7 6 7^ 10^ +(1, 0) 7 6 8^ 8^ +(1, 0) 7 6 9^ 9^ +(1, 0) 7 6 10^ 6^ +(1, 0) 7 6 10^ 7^ +(1, 0) 7 6 10^ 10^ +(1, 0) 7 7 6^ 6^ +(1, 0) 7 7 6^ 7^ +(1, 0) 7 7 6^ 10^ +(1, 0) 7 7 7^ 6^ +(1, 0) 7 7 7^ 7^ +(1, 0) 7 7 7^ 10^ +(1, 0) 7 7 8^ 8^ +(1, 0) 7 7 9^ 9^ +(1, 0) 7 7 10^ 6^ +(1, 0) 7 7 10^ 7^ +(1, 0) 7 7 10^ 10^ +(1, 0) 7 8 6^ 8^ +(1, 0) 7 8 7^ 8^ +(1, 0) 7 8 8^ 6^ +(1, 0) 7 8 8^ 7^ +(1, 0) 7 8 8^ 10^ +(1, 0) 7 8 10^ 8^ +(1, 0) 7 9 6^ 9^ +(1, 0) 7 9 7^ 9^ +(1, 0) 7 9 9^ 6^ +(1, 0) 7 9 9^ 7^ +(1, 0) 7 9 9^ 10^ +(1, 0) 7 9 10^ 9^ +(1, 0) 7 10 6^ 6^ +(1, 0) 7 10 6^ 7^ +(1, 0) 7 10 6^ 10^ +(1, 0) 7 10 7^ 6^ +(1, 0) 7 10 7^ 7^ +(1, 0) 7 10 7^ 10^ +(1, 0) 7 10 8^ 8^ +(1, 0) 7 10 9^ 9^ +(1, 0) 7 10 10^ 6^ +(1, 0) 7 10 10^ 7^ +(1, 0) 7 10 10^ 10^ +(1, 0) 8 1 1^ 8^ +(1, 0) 8 1 2^ 8^ +(1, 0) 8 1 3^ 6^ +(1, 0) 8 1 3^ 7^ +(1, 0) 8 1 3^ 10^ +(1, 0) 8 1 5^ 8^ +(1, 0) 8 2 1^ 8^ +(1, 0) 8 2 2^ 8^ +(1, 0) 8 2 3^ 6^ +(1, 0) 8 2 3^ 7^ +(1, 0) 8 2 3^ 10^ +(1, 0) 8 2 5^ 8^ +(1, 0) 8 3 1^ 6^ +(1, 0) 8 3 1^ 7^ +(1, 0) 8 3 1^ 10^ +(1, 0) 8 3 2^ 6^ +(1, 0) 8 3 2^ 7^ +(1, 0) 8 3 2^ 10^ +(1, 0) 8 3 3^ 8^ +(1, 0) 8 3 4^ 9^ +(1, 0) 8 3 5^ 6^ +(1, 0) 8 3 5^ 7^ +(1, 0) 8 3 5^ 10^ +(1, 0) 8 4 3^ 9^ +(1, 0) 8 4 4^ 8^ +(1, 0) 8 5 1^ 8^ +(1, 0) 8 5 2^ 8^ +(1, 0) 8 5 3^ 6^ +(1, 0) 8 5 3^ 7^ +(1, 0) 8 5 3^ 10^ +(1, 0) 8 5 5^ 8^ +(1, 0) 8 6 6^ 8^ +(1, 0) 8 6 7^ 8^ +(1, 0) 8 6 8^ 6^ +(1, 0) 8 6 8^ 7^ +(1, 0) 8 6 8^ 10^ +(1, 0) 8 6 10^ 8^ +(1, 0) 8 7 6^ 8^ +(1, 0) 8 7 7^ 8^ +(1, 0) 8 7 8^ 6^ +(1, 0) 8 7 8^ 7^ +(1, 0) 8 7 8^ 10^ +(1, 0) 8 7 10^ 8^ +(1, 0) 8 8 6^ 6^ +(1, 0) 8 8 6^ 7^ +(1, 0) 8 8 6^ 10^ +(1, 0) 8 8 7^ 6^ +(1, 0) 8 8 7^ 7^ +(1, 0) 8 8 7^ 10^ +(1, 0) 8 8 8^ 8^ +(1, 0) 8 8 9^ 9^ +(1, 0) 8 8 10^ 6^ +(1, 0) 8 8 10^ 7^ +(1, 0) 8 8 10^ 10^ +(1, 0) 8 9 8^ 9^ +(1, 0) 8 9 9^ 8^ +(1, 0) 8 10 6^ 8^ +(1, 0) 8 10 7^ 8^ +(1, 0) 8 10 8^ 6^ +(1, 0) 8 10 8^ 7^ +(1, 0) 8 10 8^ 10^ +(1, 0) 8 10 10^ 8^ +(1, 0) 9 1 1^ 9^ +(1, 0) 9 1 2^ 9^ +(1, 0) 9 1 4^ 6^ +(1, 0) 9 1 4^ 7^ +(1, 0) 9 1 4^ 10^ +(1, 0) 9 1 5^ 9^ +(1, 0) 9 2 1^ 9^ +(1, 0) 9 2 2^ 9^ +(1, 0) 9 2 4^ 6^ +(1, 0) 9 2 4^ 7^ +(1, 0) 9 2 4^ 10^ +(1, 0) 9 2 5^ 9^ +(1, 0) 9 3 3^ 9^ +(1, 0) 9 3 4^ 8^ +(1, 0) 9 4 1^ 6^ +(1, 0) 9 4 1^ 7^ +(1, 0) 9 4 1^ 10^ +(1, 0) 9 4 2^ 6^ +(1, 0) 9 4 2^ 7^ +(1, 0) 9 4 2^ 10^ +(1, 0) 9 4 3^ 8^ +(1, 0) 9 4 4^ 9^ +(1, 0) 9 4 5^ 6^ +(1, 0) 9 4 5^ 7^ +(1, 0) 9 4 5^ 10^ +(1, 0) 9 5 1^ 9^ +(1, 0) 9 5 2^ 9^ +(1, 0) 9 5 4^ 6^ +(1, 0) 9 5 4^ 7^ +(1, 0) 9 5 4^ 10^ +(1, 0) 9 5 5^ 9^ +(1, 0) 9 6 6^ 9^ +(1, 0) 9 6 7^ 9^ +(1, 0) 9 6 9^ 6^ +(1, 0) 9 6 9^ 7^ +(1, 0) 9 6 9^ 10^ +(1, 0) 9 6 10^ 9^ +(1, 0) 9 7 6^ 9^ +(1, 0) 9 7 7^ 9^ +(1, 0) 9 7 9^ 6^ +(1, 0) 9 7 9^ 7^ +(1, 0) 9 7 9^ 10^ +(1, 0) 9 7 10^ 9^ +(1, 0) 9 8 8^ 9^ +(1, 0) 9 8 9^ 8^ +(1, 0) 9 9 6^ 6^ +(1, 0) 9 9 6^ 7^ +(1, 0) 9 9 6^ 10^ +(1, 0) 9 9 7^ 6^ +(1, 0) 9 9 7^ 7^ +(1, 0) 9 9 7^ 10^ +(1, 0) 9 9 8^ 8^ +(1, 0) 9 9 9^ 9^ +(1, 0) 9 9 10^ 6^ +(1, 0) 9 9 10^ 7^ +(1, 0) 9 9 10^ 10^ +(1, 0) 9 10 6^ 9^ +(1, 0) 9 10 7^ 9^ +(1, 0) 9 10 9^ 6^ +(1, 0) 9 10 9^ 7^ +(1, 0) 9 10 9^ 10^ +(1, 0) 9 10 10^ 9^ +(1, 0) 10 1 1^ 6^ +(1, 0) 10 1 1^ 7^ +(1, 0) 10 1 1^ 10^ +(1, 0) 10 1 2^ 6^ +(1, 0) 10 1 2^ 7^ +(1, 0) 10 1 2^ 10^ +(1, 0) 10 1 3^ 8^ +(1, 0) 10 1 4^ 9^ +(1, 0) 10 1 5^ 6^ +(1, 0) 10 1 5^ 7^ +(1, 0) 10 1 5^ 10^ +(1, 0) 10 2 1^ 6^ +(1, 0) 10 2 1^ 7^ +(1, 0) 10 2 1^ 10^ +(1, 0) 10 2 2^ 6^ +(1, 0) 10 2 2^ 7^ +(1, 0) 10 2 2^ 10^ +(1, 0) 10 2 3^ 8^ +(1, 0) 10 2 4^ 9^ +(1, 0) 10 2 5^ 6^ +(1, 0) 10 2 5^ 7^ +(1, 0) 10 2 5^ 10^ +(1, 0) 10 3 1^ 8^ +(1, 0) 10 3 2^ 8^ +(1, 0) 10 3 3^ 6^ +(1, 0) 10 3 3^ 7^ +(1, 0) 10 3 3^ 10^ +(1, 0) 10 3 5^ 8^ +(1, 0) 10 4 1^ 9^ +(1, 0) 10 4 2^ 9^ +(1, 0) 10 4 4^ 6^ +(1, 0) 10 4 4^ 7^ +(1, 0) 10 4 4^ 10^ +(1, 0) 10 4 5^ 9^ +(1, 0) 10 5 1^ 6^ +(1, 0) 10 5 1^ 7^ +(1, 0) 10 5 1^ 10^ +(1, 0) 10 5 2^ 6^ +(1, 0) 10 5 2^ 7^ +(1, 0) 10 5 2^ 10^ +(1, 0) 10 5 3^ 8^ +(1, 0) 10 5 4^ 9^ +(1, 0) 10 5 5^ 6^ +(1, 0) 10 5 5^ 7^ +(1, 0) 10 5 5^ 10^ +(1, 0) 10 6 6^ 6^ +(1, 0) 10 6 6^ 7^ +(1, 0) 10 6 6^ 10^ +(1, 0) 10 6 7^ 6^ +(1, 0) 10 6 7^ 7^ +(1, 0) 10 6 7^ 10^ +(1, 0) 10 6 8^ 8^ +(1, 0) 10 6 9^ 9^ +(1, 0) 10 6 10^ 6^ +(1, 0) 10 6 10^ 7^ +(1, 0) 10 6 10^ 10^ +(1, 0) 10 7 6^ 6^ +(1, 0) 10 7 6^ 7^ +(1, 0) 10 7 6^ 10^ +(1, 0) 10 7 7^ 6^ +(1, 0) 10 7 7^ 7^ +(1, 0) 10 7 7^ 10^ +(1, 0) 10 7 8^ 8^ +(1, 0) 10 7 9^ 9^ +(1, 0) 10 7 10^ 6^ +(1, 0) 10 7 10^ 7^ +(1, 0) 10 7 10^ 10^ +(1, 0) 10 8 6^ 8^ +(1, 0) 10 8 7^ 8^ +(1, 0) 10 8 8^ 6^ +(1, 0) 10 8 8^ 7^ +(1, 0) 10 8 8^ 10^ +(1, 0) 10 8 10^ 8^ +(1, 0) 10 9 6^ 9^ +(1, 0) 10 9 7^ 9^ +(1, 0) 10 9 9^ 6^ +(1, 0) 10 9 9^ 7^ +(1, 0) 10 9 9^ 10^ +(1, 0) 10 9 10^ 9^ +(1, 0) 10 10 6^ 6^ +(1, 0) 10 10 6^ 7^ +(1, 0) 10 10 6^ 10^ +(1, 0) 10 10 7^ 6^ +(1, 0) 10 10 7^ 7^ +(1, 0) 10 10 7^ 10^ +(1, 0) 10 10 8^ 8^ +(1, 0) 10 10 9^ 9^ +(1, 0) 10 10 10^ 6^ +(1, 0) 10 10 10^ 7^ +(1, 0) 10 10 10^ 10^ diff --git a/benchmark/fham/electron-12.fham b/benchmark/fham/electron-12.fham new file mode 100644 index 000000000..d563c4e24 --- /dev/null +++ b/benchmark/fham/electron-12.fham @@ -0,0 +1,1860 @@ +(1, 0) 1 1^ +(1, 0) 1 2^ +(1, 0) 1 3^ +(1, 0) 1 6^ +(1, 0) 2 1^ +(1, 0) 2 2^ +(1, 0) 2 3^ +(1, 0) 2 6^ +(1, 0) 3 1^ +(1, 0) 3 2^ +(1, 0) 3 3^ +(1, 0) 3 6^ +(1, 0) 4 4^ +(1, 0) 5 5^ +(1, 0) 6 1^ +(1, 0) 6 2^ +(1, 0) 6 3^ +(1, 0) 6 6^ +(1, 0) 7 7^ +(1, 0) 7 8^ +(1, 0) 7 9^ +(1, 0) 7 12^ +(1, 0) 8 7^ +(1, 0) 8 8^ +(1, 0) 8 9^ +(1, 0) 8 12^ +(1, 0) 9 7^ +(1, 0) 9 8^ +(1, 0) 9 9^ +(1, 0) 9 12^ +(1, 0) 10 10^ +(1, 0) 11 11^ +(1, 0) 12 7^ +(1, 0) 12 8^ +(1, 0) 12 9^ +(1, 0) 12 12^ +(1, 0) 1 1 1^ 1^ +(1, 0) 1 1 1^ 2^ +(1, 0) 1 1 1^ 3^ +(1, 0) 1 1 1^ 6^ +(1, 0) 1 1 2^ 1^ +(1, 0) 1 1 2^ 2^ +(1, 0) 1 1 2^ 3^ +(1, 0) 1 1 2^ 6^ +(1, 0) 1 1 3^ 1^ +(1, 0) 1 1 3^ 2^ +(1, 0) 1 1 3^ 3^ +(1, 0) 1 1 3^ 6^ +(1, 0) 1 1 4^ 4^ +(1, 0) 1 1 5^ 5^ +(1, 0) 1 1 6^ 1^ +(1, 0) 1 1 6^ 2^ +(1, 0) 1 1 6^ 3^ +(1, 0) 1 1 6^ 6^ +(1, 0) 1 2 1^ 1^ +(1, 0) 1 2 1^ 2^ +(1, 0) 1 2 1^ 3^ +(1, 0) 1 2 1^ 6^ +(1, 0) 1 2 2^ 1^ +(1, 0) 1 2 2^ 2^ +(1, 0) 1 2 2^ 3^ +(1, 0) 1 2 2^ 6^ +(1, 0) 1 2 3^ 1^ +(1, 0) 1 2 3^ 2^ +(1, 0) 1 2 3^ 3^ +(1, 0) 1 2 3^ 6^ +(1, 0) 1 2 4^ 4^ +(1, 0) 1 2 5^ 5^ +(1, 0) 1 2 6^ 1^ +(1, 0) 1 2 6^ 2^ +(1, 0) 1 2 6^ 3^ +(1, 0) 1 2 6^ 6^ +(1, 0) 1 3 1^ 1^ +(1, 0) 1 3 1^ 2^ +(1, 0) 1 3 1^ 3^ +(1, 0) 1 3 1^ 6^ +(1, 0) 1 3 2^ 1^ +(1, 0) 1 3 2^ 2^ +(1, 0) 1 3 2^ 3^ +(1, 0) 1 3 2^ 6^ +(1, 0) 1 3 3^ 1^ +(1, 0) 1 3 3^ 2^ +(1, 0) 1 3 3^ 3^ +(1, 0) 1 3 3^ 6^ +(1, 0) 1 3 4^ 4^ +(1, 0) 1 3 5^ 5^ +(1, 0) 1 3 6^ 1^ +(1, 0) 1 3 6^ 2^ +(1, 0) 1 3 6^ 3^ +(1, 0) 1 3 6^ 6^ +(1, 0) 1 4 1^ 4^ +(1, 0) 1 4 2^ 4^ +(1, 0) 1 4 3^ 4^ +(1, 0) 1 4 4^ 1^ +(1, 0) 1 4 4^ 2^ +(1, 0) 1 4 4^ 3^ +(1, 0) 1 4 4^ 6^ +(1, 0) 1 4 6^ 4^ +(1, 0) 1 5 1^ 5^ +(1, 0) 1 5 2^ 5^ +(1, 0) 1 5 3^ 5^ +(1, 0) 1 5 5^ 1^ +(1, 0) 1 5 5^ 2^ +(1, 0) 1 5 5^ 3^ +(1, 0) 1 5 5^ 6^ +(1, 0) 1 5 6^ 5^ +(1, 0) 1 6 1^ 1^ +(1, 0) 1 6 1^ 2^ +(1, 0) 1 6 1^ 3^ +(1, 0) 1 6 1^ 6^ +(1, 0) 1 6 2^ 1^ +(1, 0) 1 6 2^ 2^ +(1, 0) 1 6 2^ 3^ +(1, 0) 1 6 2^ 6^ +(1, 0) 1 6 3^ 1^ +(1, 0) 1 6 3^ 2^ +(1, 0) 1 6 3^ 3^ +(1, 0) 1 6 3^ 6^ +(1, 0) 1 6 4^ 4^ +(1, 0) 1 6 5^ 5^ +(1, 0) 1 6 6^ 1^ +(1, 0) 1 6 6^ 2^ +(1, 0) 1 6 6^ 3^ +(1, 0) 1 6 6^ 6^ +(1, 0) 1 7 7^ 1^ +(1, 0) 1 7 7^ 2^ +(1, 0) 1 7 7^ 3^ +(1, 0) 1 7 7^ 6^ +(1, 0) 1 7 8^ 1^ +(1, 0) 1 7 8^ 2^ +(1, 0) 1 7 8^ 3^ +(1, 0) 1 7 8^ 6^ +(1, 0) 1 7 9^ 1^ +(1, 0) 1 7 9^ 2^ +(1, 0) 1 7 9^ 3^ +(1, 0) 1 7 9^ 6^ +(1, 0) 1 7 10^ 4^ +(1, 0) 1 7 11^ 5^ +(1, 0) 1 7 12^ 1^ +(1, 0) 1 7 12^ 2^ +(1, 0) 1 7 12^ 3^ +(1, 0) 1 7 12^ 6^ +(1, 0) 1 8 7^ 1^ +(1, 0) 1 8 7^ 2^ +(1, 0) 1 8 7^ 3^ +(1, 0) 1 8 7^ 6^ +(1, 0) 1 8 8^ 1^ +(1, 0) 1 8 8^ 2^ +(1, 0) 1 8 8^ 3^ +(1, 0) 1 8 8^ 6^ +(1, 0) 1 8 9^ 1^ +(1, 0) 1 8 9^ 2^ +(1, 0) 1 8 9^ 3^ +(1, 0) 1 8 9^ 6^ +(1, 0) 1 8 10^ 4^ +(1, 0) 1 8 11^ 5^ +(1, 0) 1 8 12^ 1^ +(1, 0) 1 8 12^ 2^ +(1, 0) 1 8 12^ 3^ +(1, 0) 1 8 12^ 6^ +(1, 0) 1 9 7^ 1^ +(1, 0) 1 9 7^ 2^ +(1, 0) 1 9 7^ 3^ +(1, 0) 1 9 7^ 6^ +(1, 0) 1 9 8^ 1^ +(1, 0) 1 9 8^ 2^ +(1, 0) 1 9 8^ 3^ +(1, 0) 1 9 8^ 6^ +(1, 0) 1 9 9^ 1^ +(1, 0) 1 9 9^ 2^ +(1, 0) 1 9 9^ 3^ +(1, 0) 1 9 9^ 6^ +(1, 0) 1 9 10^ 4^ +(1, 0) 1 9 11^ 5^ +(1, 0) 1 9 12^ 1^ +(1, 0) 1 9 12^ 2^ +(1, 0) 1 9 12^ 3^ +(1, 0) 1 9 12^ 6^ +(1, 0) 1 10 7^ 4^ +(1, 0) 1 10 8^ 4^ +(1, 0) 1 10 9^ 4^ +(1, 0) 1 10 10^ 1^ +(1, 0) 1 10 10^ 2^ +(1, 0) 1 10 10^ 3^ +(1, 0) 1 10 10^ 6^ +(1, 0) 1 10 12^ 4^ +(1, 0) 1 11 7^ 5^ +(1, 0) 1 11 8^ 5^ +(1, 0) 1 11 9^ 5^ +(1, 0) 1 11 11^ 1^ +(1, 0) 1 11 11^ 2^ +(1, 0) 1 11 11^ 3^ +(1, 0) 1 11 11^ 6^ +(1, 0) 1 11 12^ 5^ +(1, 0) 1 12 7^ 1^ +(1, 0) 1 12 7^ 2^ +(1, 0) 1 12 7^ 3^ +(1, 0) 1 12 7^ 6^ +(1, 0) 1 12 8^ 1^ +(1, 0) 1 12 8^ 2^ +(1, 0) 1 12 8^ 3^ +(1, 0) 1 12 8^ 6^ +(1, 0) 1 12 9^ 1^ +(1, 0) 1 12 9^ 2^ +(1, 0) 1 12 9^ 3^ +(1, 0) 1 12 9^ 6^ +(1, 0) 1 12 10^ 4^ +(1, 0) 1 12 11^ 5^ +(1, 0) 1 12 12^ 1^ +(1, 0) 1 12 12^ 2^ +(1, 0) 1 12 12^ 3^ +(1, 0) 1 12 12^ 6^ +(1, 0) 2 1 1^ 1^ +(1, 0) 2 1 1^ 2^ +(1, 0) 2 1 1^ 3^ +(1, 0) 2 1 1^ 6^ +(1, 0) 2 1 2^ 1^ +(1, 0) 2 1 2^ 2^ +(1, 0) 2 1 2^ 3^ +(1, 0) 2 1 2^ 6^ +(1, 0) 2 1 3^ 1^ +(1, 0) 2 1 3^ 2^ +(1, 0) 2 1 3^ 3^ +(1, 0) 2 1 3^ 6^ +(1, 0) 2 1 4^ 4^ +(1, 0) 2 1 5^ 5^ +(1, 0) 2 1 6^ 1^ +(1, 0) 2 1 6^ 2^ +(1, 0) 2 1 6^ 3^ +(1, 0) 2 1 6^ 6^ +(1, 0) 2 2 1^ 1^ +(1, 0) 2 2 1^ 2^ +(1, 0) 2 2 1^ 3^ +(1, 0) 2 2 1^ 6^ +(1, 0) 2 2 2^ 1^ +(1, 0) 2 2 2^ 2^ +(1, 0) 2 2 2^ 3^ +(1, 0) 2 2 2^ 6^ +(1, 0) 2 2 3^ 1^ +(1, 0) 2 2 3^ 2^ +(1, 0) 2 2 3^ 3^ +(1, 0) 2 2 3^ 6^ +(1, 0) 2 2 4^ 4^ +(1, 0) 2 2 5^ 5^ +(1, 0) 2 2 6^ 1^ +(1, 0) 2 2 6^ 2^ +(1, 0) 2 2 6^ 3^ +(1, 0) 2 2 6^ 6^ +(1, 0) 2 3 1^ 1^ +(1, 0) 2 3 1^ 2^ +(1, 0) 2 3 1^ 3^ +(1, 0) 2 3 1^ 6^ +(1, 0) 2 3 2^ 1^ +(1, 0) 2 3 2^ 2^ +(1, 0) 2 3 2^ 3^ +(1, 0) 2 3 2^ 6^ +(1, 0) 2 3 3^ 1^ +(1, 0) 2 3 3^ 2^ +(1, 0) 2 3 3^ 3^ +(1, 0) 2 3 3^ 6^ +(1, 0) 2 3 4^ 4^ +(1, 0) 2 3 5^ 5^ +(1, 0) 2 3 6^ 1^ +(1, 0) 2 3 6^ 2^ +(1, 0) 2 3 6^ 3^ +(1, 0) 2 3 6^ 6^ +(1, 0) 2 4 1^ 4^ +(1, 0) 2 4 2^ 4^ +(1, 0) 2 4 3^ 4^ +(1, 0) 2 4 4^ 1^ +(1, 0) 2 4 4^ 2^ +(1, 0) 2 4 4^ 3^ +(1, 0) 2 4 4^ 6^ +(1, 0) 2 4 6^ 4^ +(1, 0) 2 5 1^ 5^ +(1, 0) 2 5 2^ 5^ +(1, 0) 2 5 3^ 5^ +(1, 0) 2 5 5^ 1^ +(1, 0) 2 5 5^ 2^ +(1, 0) 2 5 5^ 3^ +(1, 0) 2 5 5^ 6^ +(1, 0) 2 5 6^ 5^ +(1, 0) 2 6 1^ 1^ +(1, 0) 2 6 1^ 2^ +(1, 0) 2 6 1^ 3^ +(1, 0) 2 6 1^ 6^ +(1, 0) 2 6 2^ 1^ +(1, 0) 2 6 2^ 2^ +(1, 0) 2 6 2^ 3^ +(1, 0) 2 6 2^ 6^ +(1, 0) 2 6 3^ 1^ +(1, 0) 2 6 3^ 2^ +(1, 0) 2 6 3^ 3^ +(1, 0) 2 6 3^ 6^ +(1, 0) 2 6 4^ 4^ +(1, 0) 2 6 5^ 5^ +(1, 0) 2 6 6^ 1^ +(1, 0) 2 6 6^ 2^ +(1, 0) 2 6 6^ 3^ +(1, 0) 2 6 6^ 6^ +(1, 0) 2 7 7^ 1^ +(1, 0) 2 7 7^ 2^ +(1, 0) 2 7 7^ 3^ +(1, 0) 2 7 7^ 6^ +(1, 0) 2 7 8^ 1^ +(1, 0) 2 7 8^ 2^ +(1, 0) 2 7 8^ 3^ +(1, 0) 2 7 8^ 6^ +(1, 0) 2 7 9^ 1^ +(1, 0) 2 7 9^ 2^ +(1, 0) 2 7 9^ 3^ +(1, 0) 2 7 9^ 6^ +(1, 0) 2 7 10^ 4^ +(1, 0) 2 7 11^ 5^ +(1, 0) 2 7 12^ 1^ +(1, 0) 2 7 12^ 2^ +(1, 0) 2 7 12^ 3^ +(1, 0) 2 7 12^ 6^ +(1, 0) 2 8 7^ 1^ +(1, 0) 2 8 7^ 2^ +(1, 0) 2 8 7^ 3^ +(1, 0) 2 8 7^ 6^ +(1, 0) 2 8 8^ 1^ +(1, 0) 2 8 8^ 2^ +(1, 0) 2 8 8^ 3^ +(1, 0) 2 8 8^ 6^ +(1, 0) 2 8 9^ 1^ +(1, 0) 2 8 9^ 2^ +(1, 0) 2 8 9^ 3^ +(1, 0) 2 8 9^ 6^ +(1, 0) 2 8 10^ 4^ +(1, 0) 2 8 11^ 5^ +(1, 0) 2 8 12^ 1^ +(1, 0) 2 8 12^ 2^ +(1, 0) 2 8 12^ 3^ +(1, 0) 2 8 12^ 6^ +(1, 0) 2 9 7^ 1^ +(1, 0) 2 9 7^ 2^ +(1, 0) 2 9 7^ 3^ +(1, 0) 2 9 7^ 6^ +(1, 0) 2 9 8^ 1^ +(1, 0) 2 9 8^ 2^ +(1, 0) 2 9 8^ 3^ +(1, 0) 2 9 8^ 6^ +(1, 0) 2 9 9^ 1^ +(1, 0) 2 9 9^ 2^ +(1, 0) 2 9 9^ 3^ +(1, 0) 2 9 9^ 6^ +(1, 0) 2 9 10^ 4^ +(1, 0) 2 9 11^ 5^ +(1, 0) 2 9 12^ 1^ +(1, 0) 2 9 12^ 2^ +(1, 0) 2 9 12^ 3^ +(1, 0) 2 9 12^ 6^ +(1, 0) 2 10 7^ 4^ +(1, 0) 2 10 8^ 4^ +(1, 0) 2 10 9^ 4^ +(1, 0) 2 10 10^ 1^ +(1, 0) 2 10 10^ 2^ +(1, 0) 2 10 10^ 3^ +(1, 0) 2 10 10^ 6^ +(1, 0) 2 10 12^ 4^ +(1, 0) 2 11 7^ 5^ +(1, 0) 2 11 8^ 5^ +(1, 0) 2 11 9^ 5^ +(1, 0) 2 11 11^ 1^ +(1, 0) 2 11 11^ 2^ +(1, 0) 2 11 11^ 3^ +(1, 0) 2 11 11^ 6^ +(1, 0) 2 11 12^ 5^ +(1, 0) 2 12 7^ 1^ +(1, 0) 2 12 7^ 2^ +(1, 0) 2 12 7^ 3^ +(1, 0) 2 12 7^ 6^ +(1, 0) 2 12 8^ 1^ +(1, 0) 2 12 8^ 2^ +(1, 0) 2 12 8^ 3^ +(1, 0) 2 12 8^ 6^ +(1, 0) 2 12 9^ 1^ +(1, 0) 2 12 9^ 2^ +(1, 0) 2 12 9^ 3^ +(1, 0) 2 12 9^ 6^ +(1, 0) 2 12 10^ 4^ +(1, 0) 2 12 11^ 5^ +(1, 0) 2 12 12^ 1^ +(1, 0) 2 12 12^ 2^ +(1, 0) 2 12 12^ 3^ +(1, 0) 2 12 12^ 6^ +(1, 0) 3 1 1^ 1^ +(1, 0) 3 1 1^ 2^ +(1, 0) 3 1 1^ 3^ +(1, 0) 3 1 1^ 6^ +(1, 0) 3 1 2^ 1^ +(1, 0) 3 1 2^ 2^ +(1, 0) 3 1 2^ 3^ +(1, 0) 3 1 2^ 6^ +(1, 0) 3 1 3^ 1^ +(1, 0) 3 1 3^ 2^ +(1, 0) 3 1 3^ 3^ +(1, 0) 3 1 3^ 6^ +(1, 0) 3 1 4^ 4^ +(1, 0) 3 1 5^ 5^ +(1, 0) 3 1 6^ 1^ +(1, 0) 3 1 6^ 2^ +(1, 0) 3 1 6^ 3^ +(1, 0) 3 1 6^ 6^ +(1, 0) 3 2 1^ 1^ +(1, 0) 3 2 1^ 2^ +(1, 0) 3 2 1^ 3^ +(1, 0) 3 2 1^ 6^ +(1, 0) 3 2 2^ 1^ +(1, 0) 3 2 2^ 2^ +(1, 0) 3 2 2^ 3^ +(1, 0) 3 2 2^ 6^ +(1, 0) 3 2 3^ 1^ +(1, 0) 3 2 3^ 2^ +(1, 0) 3 2 3^ 3^ +(1, 0) 3 2 3^ 6^ +(1, 0) 3 2 4^ 4^ +(1, 0) 3 2 5^ 5^ +(1, 0) 3 2 6^ 1^ +(1, 0) 3 2 6^ 2^ +(1, 0) 3 2 6^ 3^ +(1, 0) 3 2 6^ 6^ +(1, 0) 3 3 1^ 1^ +(1, 0) 3 3 1^ 2^ +(1, 0) 3 3 1^ 3^ +(1, 0) 3 3 1^ 6^ +(1, 0) 3 3 2^ 1^ +(1, 0) 3 3 2^ 2^ +(1, 0) 3 3 2^ 3^ +(1, 0) 3 3 2^ 6^ +(1, 0) 3 3 3^ 1^ +(1, 0) 3 3 3^ 2^ +(1, 0) 3 3 3^ 3^ +(1, 0) 3 3 3^ 6^ +(1, 0) 3 3 4^ 4^ +(1, 0) 3 3 5^ 5^ +(1, 0) 3 3 6^ 1^ +(1, 0) 3 3 6^ 2^ +(1, 0) 3 3 6^ 3^ +(1, 0) 3 3 6^ 6^ +(1, 0) 3 4 1^ 4^ +(1, 0) 3 4 2^ 4^ +(1, 0) 3 4 3^ 4^ +(1, 0) 3 4 4^ 1^ +(1, 0) 3 4 4^ 2^ +(1, 0) 3 4 4^ 3^ +(1, 0) 3 4 4^ 6^ +(1, 0) 3 4 6^ 4^ +(1, 0) 3 5 1^ 5^ +(1, 0) 3 5 2^ 5^ +(1, 0) 3 5 3^ 5^ +(1, 0) 3 5 5^ 1^ +(1, 0) 3 5 5^ 2^ +(1, 0) 3 5 5^ 3^ +(1, 0) 3 5 5^ 6^ +(1, 0) 3 5 6^ 5^ +(1, 0) 3 6 1^ 1^ +(1, 0) 3 6 1^ 2^ +(1, 0) 3 6 1^ 3^ +(1, 0) 3 6 1^ 6^ +(1, 0) 3 6 2^ 1^ +(1, 0) 3 6 2^ 2^ +(1, 0) 3 6 2^ 3^ +(1, 0) 3 6 2^ 6^ +(1, 0) 3 6 3^ 1^ +(1, 0) 3 6 3^ 2^ +(1, 0) 3 6 3^ 3^ +(1, 0) 3 6 3^ 6^ +(1, 0) 3 6 4^ 4^ +(1, 0) 3 6 5^ 5^ +(1, 0) 3 6 6^ 1^ +(1, 0) 3 6 6^ 2^ +(1, 0) 3 6 6^ 3^ +(1, 0) 3 6 6^ 6^ +(1, 0) 3 7 7^ 1^ +(1, 0) 3 7 7^ 2^ +(1, 0) 3 7 7^ 3^ +(1, 0) 3 7 7^ 6^ +(1, 0) 3 7 8^ 1^ +(1, 0) 3 7 8^ 2^ +(1, 0) 3 7 8^ 3^ +(1, 0) 3 7 8^ 6^ +(1, 0) 3 7 9^ 1^ +(1, 0) 3 7 9^ 2^ +(1, 0) 3 7 9^ 3^ +(1, 0) 3 7 9^ 6^ +(1, 0) 3 7 10^ 4^ +(1, 0) 3 7 11^ 5^ +(1, 0) 3 7 12^ 1^ +(1, 0) 3 7 12^ 2^ +(1, 0) 3 7 12^ 3^ +(1, 0) 3 7 12^ 6^ +(1, 0) 3 8 7^ 1^ +(1, 0) 3 8 7^ 2^ +(1, 0) 3 8 7^ 3^ +(1, 0) 3 8 7^ 6^ +(1, 0) 3 8 8^ 1^ +(1, 0) 3 8 8^ 2^ +(1, 0) 3 8 8^ 3^ +(1, 0) 3 8 8^ 6^ +(1, 0) 3 8 9^ 1^ +(1, 0) 3 8 9^ 2^ +(1, 0) 3 8 9^ 3^ +(1, 0) 3 8 9^ 6^ +(1, 0) 3 8 10^ 4^ +(1, 0) 3 8 11^ 5^ +(1, 0) 3 8 12^ 1^ +(1, 0) 3 8 12^ 2^ +(1, 0) 3 8 12^ 3^ +(1, 0) 3 8 12^ 6^ +(1, 0) 3 9 7^ 1^ +(1, 0) 3 9 7^ 2^ +(1, 0) 3 9 7^ 3^ +(1, 0) 3 9 7^ 6^ +(1, 0) 3 9 8^ 1^ +(1, 0) 3 9 8^ 2^ +(1, 0) 3 9 8^ 3^ +(1, 0) 3 9 8^ 6^ +(1, 0) 3 9 9^ 1^ +(1, 0) 3 9 9^ 2^ +(1, 0) 3 9 9^ 3^ +(1, 0) 3 9 9^ 6^ +(1, 0) 3 9 10^ 4^ +(1, 0) 3 9 11^ 5^ +(1, 0) 3 9 12^ 1^ +(1, 0) 3 9 12^ 2^ +(1, 0) 3 9 12^ 3^ +(1, 0) 3 9 12^ 6^ +(1, 0) 3 10 7^ 4^ +(1, 0) 3 10 8^ 4^ +(1, 0) 3 10 9^ 4^ +(1, 0) 3 10 10^ 1^ +(1, 0) 3 10 10^ 2^ +(1, 0) 3 10 10^ 3^ +(1, 0) 3 10 10^ 6^ +(1, 0) 3 10 12^ 4^ +(1, 0) 3 11 7^ 5^ +(1, 0) 3 11 8^ 5^ +(1, 0) 3 11 9^ 5^ +(1, 0) 3 11 11^ 1^ +(1, 0) 3 11 11^ 2^ +(1, 0) 3 11 11^ 3^ +(1, 0) 3 11 11^ 6^ +(1, 0) 3 11 12^ 5^ +(1, 0) 3 12 7^ 1^ +(1, 0) 3 12 7^ 2^ +(1, 0) 3 12 7^ 3^ +(1, 0) 3 12 7^ 6^ +(1, 0) 3 12 8^ 1^ +(1, 0) 3 12 8^ 2^ +(1, 0) 3 12 8^ 3^ +(1, 0) 3 12 8^ 6^ +(1, 0) 3 12 9^ 1^ +(1, 0) 3 12 9^ 2^ +(1, 0) 3 12 9^ 3^ +(1, 0) 3 12 9^ 6^ +(1, 0) 3 12 10^ 4^ +(1, 0) 3 12 11^ 5^ +(1, 0) 3 12 12^ 1^ +(1, 0) 3 12 12^ 2^ +(1, 0) 3 12 12^ 3^ +(1, 0) 3 12 12^ 6^ +(1, 0) 4 1 1^ 4^ +(1, 0) 4 1 2^ 4^ +(1, 0) 4 1 3^ 4^ +(1, 0) 4 1 4^ 1^ +(1, 0) 4 1 4^ 2^ +(1, 0) 4 1 4^ 3^ +(1, 0) 4 1 4^ 6^ +(1, 0) 4 1 6^ 4^ +(1, 0) 4 2 1^ 4^ +(1, 0) 4 2 2^ 4^ +(1, 0) 4 2 3^ 4^ +(1, 0) 4 2 4^ 1^ +(1, 0) 4 2 4^ 2^ +(1, 0) 4 2 4^ 3^ +(1, 0) 4 2 4^ 6^ +(1, 0) 4 2 6^ 4^ +(1, 0) 4 3 1^ 4^ +(1, 0) 4 3 2^ 4^ +(1, 0) 4 3 3^ 4^ +(1, 0) 4 3 4^ 1^ +(1, 0) 4 3 4^ 2^ +(1, 0) 4 3 4^ 3^ +(1, 0) 4 3 4^ 6^ +(1, 0) 4 3 6^ 4^ +(1, 0) 4 4 1^ 1^ +(1, 0) 4 4 1^ 2^ +(1, 0) 4 4 1^ 3^ +(1, 0) 4 4 1^ 6^ +(1, 0) 4 4 2^ 1^ +(1, 0) 4 4 2^ 2^ +(1, 0) 4 4 2^ 3^ +(1, 0) 4 4 2^ 6^ +(1, 0) 4 4 3^ 1^ +(1, 0) 4 4 3^ 2^ +(1, 0) 4 4 3^ 3^ +(1, 0) 4 4 3^ 6^ +(1, 0) 4 4 4^ 4^ +(1, 0) 4 4 5^ 5^ +(1, 0) 4 4 6^ 1^ +(1, 0) 4 4 6^ 2^ +(1, 0) 4 4 6^ 3^ +(1, 0) 4 4 6^ 6^ +(1, 0) 4 5 4^ 5^ +(1, 0) 4 5 5^ 4^ +(1, 0) 4 6 1^ 4^ +(1, 0) 4 6 2^ 4^ +(1, 0) 4 6 3^ 4^ +(1, 0) 4 6 4^ 1^ +(1, 0) 4 6 4^ 2^ +(1, 0) 4 6 4^ 3^ +(1, 0) 4 6 4^ 6^ +(1, 0) 4 6 6^ 4^ +(1, 0) 4 7 7^ 4^ +(1, 0) 4 7 8^ 4^ +(1, 0) 4 7 9^ 4^ +(1, 0) 4 7 10^ 1^ +(1, 0) 4 7 10^ 2^ +(1, 0) 4 7 10^ 3^ +(1, 0) 4 7 10^ 6^ +(1, 0) 4 7 12^ 4^ +(1, 0) 4 8 7^ 4^ +(1, 0) 4 8 8^ 4^ +(1, 0) 4 8 9^ 4^ +(1, 0) 4 8 10^ 1^ +(1, 0) 4 8 10^ 2^ +(1, 0) 4 8 10^ 3^ +(1, 0) 4 8 10^ 6^ +(1, 0) 4 8 12^ 4^ +(1, 0) 4 9 7^ 4^ +(1, 0) 4 9 8^ 4^ +(1, 0) 4 9 9^ 4^ +(1, 0) 4 9 10^ 1^ +(1, 0) 4 9 10^ 2^ +(1, 0) 4 9 10^ 3^ +(1, 0) 4 9 10^ 6^ +(1, 0) 4 9 12^ 4^ +(1, 0) 4 10 7^ 1^ +(1, 0) 4 10 7^ 2^ +(1, 0) 4 10 7^ 3^ +(1, 0) 4 10 7^ 6^ +(1, 0) 4 10 8^ 1^ +(1, 0) 4 10 8^ 2^ +(1, 0) 4 10 8^ 3^ +(1, 0) 4 10 8^ 6^ +(1, 0) 4 10 9^ 1^ +(1, 0) 4 10 9^ 2^ +(1, 0) 4 10 9^ 3^ +(1, 0) 4 10 9^ 6^ +(1, 0) 4 10 10^ 4^ +(1, 0) 4 10 11^ 5^ +(1, 0) 4 10 12^ 1^ +(1, 0) 4 10 12^ 2^ +(1, 0) 4 10 12^ 3^ +(1, 0) 4 10 12^ 6^ +(1, 0) 4 11 10^ 5^ +(1, 0) 4 11 11^ 4^ +(1, 0) 4 12 7^ 4^ +(1, 0) 4 12 8^ 4^ +(1, 0) 4 12 9^ 4^ +(1, 0) 4 12 10^ 1^ +(1, 0) 4 12 10^ 2^ +(1, 0) 4 12 10^ 3^ +(1, 0) 4 12 10^ 6^ +(1, 0) 4 12 12^ 4^ +(1, 0) 5 1 1^ 5^ +(1, 0) 5 1 2^ 5^ +(1, 0) 5 1 3^ 5^ +(1, 0) 5 1 5^ 1^ +(1, 0) 5 1 5^ 2^ +(1, 0) 5 1 5^ 3^ +(1, 0) 5 1 5^ 6^ +(1, 0) 5 1 6^ 5^ +(1, 0) 5 2 1^ 5^ +(1, 0) 5 2 2^ 5^ +(1, 0) 5 2 3^ 5^ +(1, 0) 5 2 5^ 1^ +(1, 0) 5 2 5^ 2^ +(1, 0) 5 2 5^ 3^ +(1, 0) 5 2 5^ 6^ +(1, 0) 5 2 6^ 5^ +(1, 0) 5 3 1^ 5^ +(1, 0) 5 3 2^ 5^ +(1, 0) 5 3 3^ 5^ +(1, 0) 5 3 5^ 1^ +(1, 0) 5 3 5^ 2^ +(1, 0) 5 3 5^ 3^ +(1, 0) 5 3 5^ 6^ +(1, 0) 5 3 6^ 5^ +(1, 0) 5 4 4^ 5^ +(1, 0) 5 4 5^ 4^ +(1, 0) 5 5 1^ 1^ +(1, 0) 5 5 1^ 2^ +(1, 0) 5 5 1^ 3^ +(1, 0) 5 5 1^ 6^ +(1, 0) 5 5 2^ 1^ +(1, 0) 5 5 2^ 2^ +(1, 0) 5 5 2^ 3^ +(1, 0) 5 5 2^ 6^ +(1, 0) 5 5 3^ 1^ +(1, 0) 5 5 3^ 2^ +(1, 0) 5 5 3^ 3^ +(1, 0) 5 5 3^ 6^ +(1, 0) 5 5 4^ 4^ +(1, 0) 5 5 5^ 5^ +(1, 0) 5 5 6^ 1^ +(1, 0) 5 5 6^ 2^ +(1, 0) 5 5 6^ 3^ +(1, 0) 5 5 6^ 6^ +(1, 0) 5 6 1^ 5^ +(1, 0) 5 6 2^ 5^ +(1, 0) 5 6 3^ 5^ +(1, 0) 5 6 5^ 1^ +(1, 0) 5 6 5^ 2^ +(1, 0) 5 6 5^ 3^ +(1, 0) 5 6 5^ 6^ +(1, 0) 5 6 6^ 5^ +(1, 0) 5 7 7^ 5^ +(1, 0) 5 7 8^ 5^ +(1, 0) 5 7 9^ 5^ +(1, 0) 5 7 11^ 1^ +(1, 0) 5 7 11^ 2^ +(1, 0) 5 7 11^ 3^ +(1, 0) 5 7 11^ 6^ +(1, 0) 5 7 12^ 5^ +(1, 0) 5 8 7^ 5^ +(1, 0) 5 8 8^ 5^ +(1, 0) 5 8 9^ 5^ +(1, 0) 5 8 11^ 1^ +(1, 0) 5 8 11^ 2^ +(1, 0) 5 8 11^ 3^ +(1, 0) 5 8 11^ 6^ +(1, 0) 5 8 12^ 5^ +(1, 0) 5 9 7^ 5^ +(1, 0) 5 9 8^ 5^ +(1, 0) 5 9 9^ 5^ +(1, 0) 5 9 11^ 1^ +(1, 0) 5 9 11^ 2^ +(1, 0) 5 9 11^ 3^ +(1, 0) 5 9 11^ 6^ +(1, 0) 5 9 12^ 5^ +(1, 0) 5 10 10^ 5^ +(1, 0) 5 10 11^ 4^ +(1, 0) 5 11 7^ 1^ +(1, 0) 5 11 7^ 2^ +(1, 0) 5 11 7^ 3^ +(1, 0) 5 11 7^ 6^ +(1, 0) 5 11 8^ 1^ +(1, 0) 5 11 8^ 2^ +(1, 0) 5 11 8^ 3^ +(1, 0) 5 11 8^ 6^ +(1, 0) 5 11 9^ 1^ +(1, 0) 5 11 9^ 2^ +(1, 0) 5 11 9^ 3^ +(1, 0) 5 11 9^ 6^ +(1, 0) 5 11 10^ 4^ +(1, 0) 5 11 11^ 5^ +(1, 0) 5 11 12^ 1^ +(1, 0) 5 11 12^ 2^ +(1, 0) 5 11 12^ 3^ +(1, 0) 5 11 12^ 6^ +(1, 0) 5 12 7^ 5^ +(1, 0) 5 12 8^ 5^ +(1, 0) 5 12 9^ 5^ +(1, 0) 5 12 11^ 1^ +(1, 0) 5 12 11^ 2^ +(1, 0) 5 12 11^ 3^ +(1, 0) 5 12 11^ 6^ +(1, 0) 5 12 12^ 5^ +(1, 0) 6 1 1^ 1^ +(1, 0) 6 1 1^ 2^ +(1, 0) 6 1 1^ 3^ +(1, 0) 6 1 1^ 6^ +(1, 0) 6 1 2^ 1^ +(1, 0) 6 1 2^ 2^ +(1, 0) 6 1 2^ 3^ +(1, 0) 6 1 2^ 6^ +(1, 0) 6 1 3^ 1^ +(1, 0) 6 1 3^ 2^ +(1, 0) 6 1 3^ 3^ +(1, 0) 6 1 3^ 6^ +(1, 0) 6 1 4^ 4^ +(1, 0) 6 1 5^ 5^ +(1, 0) 6 1 6^ 1^ +(1, 0) 6 1 6^ 2^ +(1, 0) 6 1 6^ 3^ +(1, 0) 6 1 6^ 6^ +(1, 0) 6 2 1^ 1^ +(1, 0) 6 2 1^ 2^ +(1, 0) 6 2 1^ 3^ +(1, 0) 6 2 1^ 6^ +(1, 0) 6 2 2^ 1^ +(1, 0) 6 2 2^ 2^ +(1, 0) 6 2 2^ 3^ +(1, 0) 6 2 2^ 6^ +(1, 0) 6 2 3^ 1^ +(1, 0) 6 2 3^ 2^ +(1, 0) 6 2 3^ 3^ +(1, 0) 6 2 3^ 6^ +(1, 0) 6 2 4^ 4^ +(1, 0) 6 2 5^ 5^ +(1, 0) 6 2 6^ 1^ +(1, 0) 6 2 6^ 2^ +(1, 0) 6 2 6^ 3^ +(1, 0) 6 2 6^ 6^ +(1, 0) 6 3 1^ 1^ +(1, 0) 6 3 1^ 2^ +(1, 0) 6 3 1^ 3^ +(1, 0) 6 3 1^ 6^ +(1, 0) 6 3 2^ 1^ +(1, 0) 6 3 2^ 2^ +(1, 0) 6 3 2^ 3^ +(1, 0) 6 3 2^ 6^ +(1, 0) 6 3 3^ 1^ +(1, 0) 6 3 3^ 2^ +(1, 0) 6 3 3^ 3^ +(1, 0) 6 3 3^ 6^ +(1, 0) 6 3 4^ 4^ +(1, 0) 6 3 5^ 5^ +(1, 0) 6 3 6^ 1^ +(1, 0) 6 3 6^ 2^ +(1, 0) 6 3 6^ 3^ +(1, 0) 6 3 6^ 6^ +(1, 0) 6 4 1^ 4^ +(1, 0) 6 4 2^ 4^ +(1, 0) 6 4 3^ 4^ +(1, 0) 6 4 4^ 1^ +(1, 0) 6 4 4^ 2^ +(1, 0) 6 4 4^ 3^ +(1, 0) 6 4 4^ 6^ +(1, 0) 6 4 6^ 4^ +(1, 0) 6 5 1^ 5^ +(1, 0) 6 5 2^ 5^ +(1, 0) 6 5 3^ 5^ +(1, 0) 6 5 5^ 1^ +(1, 0) 6 5 5^ 2^ +(1, 0) 6 5 5^ 3^ +(1, 0) 6 5 5^ 6^ +(1, 0) 6 5 6^ 5^ +(1, 0) 6 6 1^ 1^ +(1, 0) 6 6 1^ 2^ +(1, 0) 6 6 1^ 3^ +(1, 0) 6 6 1^ 6^ +(1, 0) 6 6 2^ 1^ +(1, 0) 6 6 2^ 2^ +(1, 0) 6 6 2^ 3^ +(1, 0) 6 6 2^ 6^ +(1, 0) 6 6 3^ 1^ +(1, 0) 6 6 3^ 2^ +(1, 0) 6 6 3^ 3^ +(1, 0) 6 6 3^ 6^ +(1, 0) 6 6 4^ 4^ +(1, 0) 6 6 5^ 5^ +(1, 0) 6 6 6^ 1^ +(1, 0) 6 6 6^ 2^ +(1, 0) 6 6 6^ 3^ +(1, 0) 6 6 6^ 6^ +(1, 0) 6 7 7^ 1^ +(1, 0) 6 7 7^ 2^ +(1, 0) 6 7 7^ 3^ +(1, 0) 6 7 7^ 6^ +(1, 0) 6 7 8^ 1^ +(1, 0) 6 7 8^ 2^ +(1, 0) 6 7 8^ 3^ +(1, 0) 6 7 8^ 6^ +(1, 0) 6 7 9^ 1^ +(1, 0) 6 7 9^ 2^ +(1, 0) 6 7 9^ 3^ +(1, 0) 6 7 9^ 6^ +(1, 0) 6 7 10^ 4^ +(1, 0) 6 7 11^ 5^ +(1, 0) 6 7 12^ 1^ +(1, 0) 6 7 12^ 2^ +(1, 0) 6 7 12^ 3^ +(1, 0) 6 7 12^ 6^ +(1, 0) 6 8 7^ 1^ +(1, 0) 6 8 7^ 2^ +(1, 0) 6 8 7^ 3^ +(1, 0) 6 8 7^ 6^ +(1, 0) 6 8 8^ 1^ +(1, 0) 6 8 8^ 2^ +(1, 0) 6 8 8^ 3^ +(1, 0) 6 8 8^ 6^ +(1, 0) 6 8 9^ 1^ +(1, 0) 6 8 9^ 2^ +(1, 0) 6 8 9^ 3^ +(1, 0) 6 8 9^ 6^ +(1, 0) 6 8 10^ 4^ +(1, 0) 6 8 11^ 5^ +(1, 0) 6 8 12^ 1^ +(1, 0) 6 8 12^ 2^ +(1, 0) 6 8 12^ 3^ +(1, 0) 6 8 12^ 6^ +(1, 0) 6 9 7^ 1^ +(1, 0) 6 9 7^ 2^ +(1, 0) 6 9 7^ 3^ +(1, 0) 6 9 7^ 6^ +(1, 0) 6 9 8^ 1^ +(1, 0) 6 9 8^ 2^ +(1, 0) 6 9 8^ 3^ +(1, 0) 6 9 8^ 6^ +(1, 0) 6 9 9^ 1^ +(1, 0) 6 9 9^ 2^ +(1, 0) 6 9 9^ 3^ +(1, 0) 6 9 9^ 6^ +(1, 0) 6 9 10^ 4^ +(1, 0) 6 9 11^ 5^ +(1, 0) 6 9 12^ 1^ +(1, 0) 6 9 12^ 2^ +(1, 0) 6 9 12^ 3^ +(1, 0) 6 9 12^ 6^ +(1, 0) 6 10 7^ 4^ +(1, 0) 6 10 8^ 4^ +(1, 0) 6 10 9^ 4^ +(1, 0) 6 10 10^ 1^ +(1, 0) 6 10 10^ 2^ +(1, 0) 6 10 10^ 3^ +(1, 0) 6 10 10^ 6^ +(1, 0) 6 10 12^ 4^ +(1, 0) 6 11 7^ 5^ +(1, 0) 6 11 8^ 5^ +(1, 0) 6 11 9^ 5^ +(1, 0) 6 11 11^ 1^ +(1, 0) 6 11 11^ 2^ +(1, 0) 6 11 11^ 3^ +(1, 0) 6 11 11^ 6^ +(1, 0) 6 11 12^ 5^ +(1, 0) 6 12 7^ 1^ +(1, 0) 6 12 7^ 2^ +(1, 0) 6 12 7^ 3^ +(1, 0) 6 12 7^ 6^ +(1, 0) 6 12 8^ 1^ +(1, 0) 6 12 8^ 2^ +(1, 0) 6 12 8^ 3^ +(1, 0) 6 12 8^ 6^ +(1, 0) 6 12 9^ 1^ +(1, 0) 6 12 9^ 2^ +(1, 0) 6 12 9^ 3^ +(1, 0) 6 12 9^ 6^ +(1, 0) 6 12 10^ 4^ +(1, 0) 6 12 11^ 5^ +(1, 0) 6 12 12^ 1^ +(1, 0) 6 12 12^ 2^ +(1, 0) 6 12 12^ 3^ +(1, 0) 6 12 12^ 6^ +(1, 0) 7 1 1^ 7^ +(1, 0) 7 1 1^ 8^ +(1, 0) 7 1 1^ 9^ +(1, 0) 7 1 1^ 12^ +(1, 0) 7 1 2^ 7^ +(1, 0) 7 1 2^ 8^ +(1, 0) 7 1 2^ 9^ +(1, 0) 7 1 2^ 12^ +(1, 0) 7 1 3^ 7^ +(1, 0) 7 1 3^ 8^ +(1, 0) 7 1 3^ 9^ +(1, 0) 7 1 3^ 12^ +(1, 0) 7 1 4^ 10^ +(1, 0) 7 1 5^ 11^ +(1, 0) 7 1 6^ 7^ +(1, 0) 7 1 6^ 8^ +(1, 0) 7 1 6^ 9^ +(1, 0) 7 1 6^ 12^ +(1, 0) 7 2 1^ 7^ +(1, 0) 7 2 1^ 8^ +(1, 0) 7 2 1^ 9^ +(1, 0) 7 2 1^ 12^ +(1, 0) 7 2 2^ 7^ +(1, 0) 7 2 2^ 8^ +(1, 0) 7 2 2^ 9^ +(1, 0) 7 2 2^ 12^ +(1, 0) 7 2 3^ 7^ +(1, 0) 7 2 3^ 8^ +(1, 0) 7 2 3^ 9^ +(1, 0) 7 2 3^ 12^ +(1, 0) 7 2 4^ 10^ +(1, 0) 7 2 5^ 11^ +(1, 0) 7 2 6^ 7^ +(1, 0) 7 2 6^ 8^ +(1, 0) 7 2 6^ 9^ +(1, 0) 7 2 6^ 12^ +(1, 0) 7 3 1^ 7^ +(1, 0) 7 3 1^ 8^ +(1, 0) 7 3 1^ 9^ +(1, 0) 7 3 1^ 12^ +(1, 0) 7 3 2^ 7^ +(1, 0) 7 3 2^ 8^ +(1, 0) 7 3 2^ 9^ +(1, 0) 7 3 2^ 12^ +(1, 0) 7 3 3^ 7^ +(1, 0) 7 3 3^ 8^ +(1, 0) 7 3 3^ 9^ +(1, 0) 7 3 3^ 12^ +(1, 0) 7 3 4^ 10^ +(1, 0) 7 3 5^ 11^ +(1, 0) 7 3 6^ 7^ +(1, 0) 7 3 6^ 8^ +(1, 0) 7 3 6^ 9^ +(1, 0) 7 3 6^ 12^ +(1, 0) 7 4 1^ 10^ +(1, 0) 7 4 2^ 10^ +(1, 0) 7 4 3^ 10^ +(1, 0) 7 4 4^ 7^ +(1, 0) 7 4 4^ 8^ +(1, 0) 7 4 4^ 9^ +(1, 0) 7 4 4^ 12^ +(1, 0) 7 4 6^ 10^ +(1, 0) 7 5 1^ 11^ +(1, 0) 7 5 2^ 11^ +(1, 0) 7 5 3^ 11^ +(1, 0) 7 5 5^ 7^ +(1, 0) 7 5 5^ 8^ +(1, 0) 7 5 5^ 9^ +(1, 0) 7 5 5^ 12^ +(1, 0) 7 5 6^ 11^ +(1, 0) 7 6 1^ 7^ +(1, 0) 7 6 1^ 8^ +(1, 0) 7 6 1^ 9^ +(1, 0) 7 6 1^ 12^ +(1, 0) 7 6 2^ 7^ +(1, 0) 7 6 2^ 8^ +(1, 0) 7 6 2^ 9^ +(1, 0) 7 6 2^ 12^ +(1, 0) 7 6 3^ 7^ +(1, 0) 7 6 3^ 8^ +(1, 0) 7 6 3^ 9^ +(1, 0) 7 6 3^ 12^ +(1, 0) 7 6 4^ 10^ +(1, 0) 7 6 5^ 11^ +(1, 0) 7 6 6^ 7^ +(1, 0) 7 6 6^ 8^ +(1, 0) 7 6 6^ 9^ +(1, 0) 7 6 6^ 12^ +(1, 0) 7 7 7^ 7^ +(1, 0) 7 7 7^ 8^ +(1, 0) 7 7 7^ 9^ +(1, 0) 7 7 7^ 12^ +(1, 0) 7 7 8^ 7^ +(1, 0) 7 7 8^ 8^ +(1, 0) 7 7 8^ 9^ +(1, 0) 7 7 8^ 12^ +(1, 0) 7 7 9^ 7^ +(1, 0) 7 7 9^ 8^ +(1, 0) 7 7 9^ 9^ +(1, 0) 7 7 9^ 12^ +(1, 0) 7 7 10^ 10^ +(1, 0) 7 7 11^ 11^ +(1, 0) 7 7 12^ 7^ +(1, 0) 7 7 12^ 8^ +(1, 0) 7 7 12^ 9^ +(1, 0) 7 7 12^ 12^ +(1, 0) 7 8 7^ 7^ +(1, 0) 7 8 7^ 8^ +(1, 0) 7 8 7^ 9^ +(1, 0) 7 8 7^ 12^ +(1, 0) 7 8 8^ 7^ +(1, 0) 7 8 8^ 8^ +(1, 0) 7 8 8^ 9^ +(1, 0) 7 8 8^ 12^ +(1, 0) 7 8 9^ 7^ +(1, 0) 7 8 9^ 8^ +(1, 0) 7 8 9^ 9^ +(1, 0) 7 8 9^ 12^ +(1, 0) 7 8 10^ 10^ +(1, 0) 7 8 11^ 11^ +(1, 0) 7 8 12^ 7^ +(1, 0) 7 8 12^ 8^ +(1, 0) 7 8 12^ 9^ +(1, 0) 7 8 12^ 12^ +(1, 0) 7 9 7^ 7^ +(1, 0) 7 9 7^ 8^ +(1, 0) 7 9 7^ 9^ +(1, 0) 7 9 7^ 12^ +(1, 0) 7 9 8^ 7^ +(1, 0) 7 9 8^ 8^ +(1, 0) 7 9 8^ 9^ +(1, 0) 7 9 8^ 12^ +(1, 0) 7 9 9^ 7^ +(1, 0) 7 9 9^ 8^ +(1, 0) 7 9 9^ 9^ +(1, 0) 7 9 9^ 12^ +(1, 0) 7 9 10^ 10^ +(1, 0) 7 9 11^ 11^ +(1, 0) 7 9 12^ 7^ +(1, 0) 7 9 12^ 8^ +(1, 0) 7 9 12^ 9^ +(1, 0) 7 9 12^ 12^ +(1, 0) 7 10 7^ 10^ +(1, 0) 7 10 8^ 10^ +(1, 0) 7 10 9^ 10^ +(1, 0) 7 10 10^ 7^ +(1, 0) 7 10 10^ 8^ +(1, 0) 7 10 10^ 9^ +(1, 0) 7 10 10^ 12^ +(1, 0) 7 10 12^ 10^ +(1, 0) 7 11 7^ 11^ +(1, 0) 7 11 8^ 11^ +(1, 0) 7 11 9^ 11^ +(1, 0) 7 11 11^ 7^ +(1, 0) 7 11 11^ 8^ +(1, 0) 7 11 11^ 9^ +(1, 0) 7 11 11^ 12^ +(1, 0) 7 11 12^ 11^ +(1, 0) 7 12 7^ 7^ +(1, 0) 7 12 7^ 8^ +(1, 0) 7 12 7^ 9^ +(1, 0) 7 12 7^ 12^ +(1, 0) 7 12 8^ 7^ +(1, 0) 7 12 8^ 8^ +(1, 0) 7 12 8^ 9^ +(1, 0) 7 12 8^ 12^ +(1, 0) 7 12 9^ 7^ +(1, 0) 7 12 9^ 8^ +(1, 0) 7 12 9^ 9^ +(1, 0) 7 12 9^ 12^ +(1, 0) 7 12 10^ 10^ +(1, 0) 7 12 11^ 11^ +(1, 0) 7 12 12^ 7^ +(1, 0) 7 12 12^ 8^ +(1, 0) 7 12 12^ 9^ +(1, 0) 7 12 12^ 12^ +(1, 0) 8 1 1^ 7^ +(1, 0) 8 1 1^ 8^ +(1, 0) 8 1 1^ 9^ +(1, 0) 8 1 1^ 12^ +(1, 0) 8 1 2^ 7^ +(1, 0) 8 1 2^ 8^ +(1, 0) 8 1 2^ 9^ +(1, 0) 8 1 2^ 12^ +(1, 0) 8 1 3^ 7^ +(1, 0) 8 1 3^ 8^ +(1, 0) 8 1 3^ 9^ +(1, 0) 8 1 3^ 12^ +(1, 0) 8 1 4^ 10^ +(1, 0) 8 1 5^ 11^ +(1, 0) 8 1 6^ 7^ +(1, 0) 8 1 6^ 8^ +(1, 0) 8 1 6^ 9^ +(1, 0) 8 1 6^ 12^ +(1, 0) 8 2 1^ 7^ +(1, 0) 8 2 1^ 8^ +(1, 0) 8 2 1^ 9^ +(1, 0) 8 2 1^ 12^ +(1, 0) 8 2 2^ 7^ +(1, 0) 8 2 2^ 8^ +(1, 0) 8 2 2^ 9^ +(1, 0) 8 2 2^ 12^ +(1, 0) 8 2 3^ 7^ +(1, 0) 8 2 3^ 8^ +(1, 0) 8 2 3^ 9^ +(1, 0) 8 2 3^ 12^ +(1, 0) 8 2 4^ 10^ +(1, 0) 8 2 5^ 11^ +(1, 0) 8 2 6^ 7^ +(1, 0) 8 2 6^ 8^ +(1, 0) 8 2 6^ 9^ +(1, 0) 8 2 6^ 12^ +(1, 0) 8 3 1^ 7^ +(1, 0) 8 3 1^ 8^ +(1, 0) 8 3 1^ 9^ +(1, 0) 8 3 1^ 12^ +(1, 0) 8 3 2^ 7^ +(1, 0) 8 3 2^ 8^ +(1, 0) 8 3 2^ 9^ +(1, 0) 8 3 2^ 12^ +(1, 0) 8 3 3^ 7^ +(1, 0) 8 3 3^ 8^ +(1, 0) 8 3 3^ 9^ +(1, 0) 8 3 3^ 12^ +(1, 0) 8 3 4^ 10^ +(1, 0) 8 3 5^ 11^ +(1, 0) 8 3 6^ 7^ +(1, 0) 8 3 6^ 8^ +(1, 0) 8 3 6^ 9^ +(1, 0) 8 3 6^ 12^ +(1, 0) 8 4 1^ 10^ +(1, 0) 8 4 2^ 10^ +(1, 0) 8 4 3^ 10^ +(1, 0) 8 4 4^ 7^ +(1, 0) 8 4 4^ 8^ +(1, 0) 8 4 4^ 9^ +(1, 0) 8 4 4^ 12^ +(1, 0) 8 4 6^ 10^ +(1, 0) 8 5 1^ 11^ +(1, 0) 8 5 2^ 11^ +(1, 0) 8 5 3^ 11^ +(1, 0) 8 5 5^ 7^ +(1, 0) 8 5 5^ 8^ +(1, 0) 8 5 5^ 9^ +(1, 0) 8 5 5^ 12^ +(1, 0) 8 5 6^ 11^ +(1, 0) 8 6 1^ 7^ +(1, 0) 8 6 1^ 8^ +(1, 0) 8 6 1^ 9^ +(1, 0) 8 6 1^ 12^ +(1, 0) 8 6 2^ 7^ +(1, 0) 8 6 2^ 8^ +(1, 0) 8 6 2^ 9^ +(1, 0) 8 6 2^ 12^ +(1, 0) 8 6 3^ 7^ +(1, 0) 8 6 3^ 8^ +(1, 0) 8 6 3^ 9^ +(1, 0) 8 6 3^ 12^ +(1, 0) 8 6 4^ 10^ +(1, 0) 8 6 5^ 11^ +(1, 0) 8 6 6^ 7^ +(1, 0) 8 6 6^ 8^ +(1, 0) 8 6 6^ 9^ +(1, 0) 8 6 6^ 12^ +(1, 0) 8 7 7^ 7^ +(1, 0) 8 7 7^ 8^ +(1, 0) 8 7 7^ 9^ +(1, 0) 8 7 7^ 12^ +(1, 0) 8 7 8^ 7^ +(1, 0) 8 7 8^ 8^ +(1, 0) 8 7 8^ 9^ +(1, 0) 8 7 8^ 12^ +(1, 0) 8 7 9^ 7^ +(1, 0) 8 7 9^ 8^ +(1, 0) 8 7 9^ 9^ +(1, 0) 8 7 9^ 12^ +(1, 0) 8 7 10^ 10^ +(1, 0) 8 7 11^ 11^ +(1, 0) 8 7 12^ 7^ +(1, 0) 8 7 12^ 8^ +(1, 0) 8 7 12^ 9^ +(1, 0) 8 7 12^ 12^ +(1, 0) 8 8 7^ 7^ +(1, 0) 8 8 7^ 8^ +(1, 0) 8 8 7^ 9^ +(1, 0) 8 8 7^ 12^ +(1, 0) 8 8 8^ 7^ +(1, 0) 8 8 8^ 8^ +(1, 0) 8 8 8^ 9^ +(1, 0) 8 8 8^ 12^ +(1, 0) 8 8 9^ 7^ +(1, 0) 8 8 9^ 8^ +(1, 0) 8 8 9^ 9^ +(1, 0) 8 8 9^ 12^ +(1, 0) 8 8 10^ 10^ +(1, 0) 8 8 11^ 11^ +(1, 0) 8 8 12^ 7^ +(1, 0) 8 8 12^ 8^ +(1, 0) 8 8 12^ 9^ +(1, 0) 8 8 12^ 12^ +(1, 0) 8 9 7^ 7^ +(1, 0) 8 9 7^ 8^ +(1, 0) 8 9 7^ 9^ +(1, 0) 8 9 7^ 12^ +(1, 0) 8 9 8^ 7^ +(1, 0) 8 9 8^ 8^ +(1, 0) 8 9 8^ 9^ +(1, 0) 8 9 8^ 12^ +(1, 0) 8 9 9^ 7^ +(1, 0) 8 9 9^ 8^ +(1, 0) 8 9 9^ 9^ +(1, 0) 8 9 9^ 12^ +(1, 0) 8 9 10^ 10^ +(1, 0) 8 9 11^ 11^ +(1, 0) 8 9 12^ 7^ +(1, 0) 8 9 12^ 8^ +(1, 0) 8 9 12^ 9^ +(1, 0) 8 9 12^ 12^ +(1, 0) 8 10 7^ 10^ +(1, 0) 8 10 8^ 10^ +(1, 0) 8 10 9^ 10^ +(1, 0) 8 10 10^ 7^ +(1, 0) 8 10 10^ 8^ +(1, 0) 8 10 10^ 9^ +(1, 0) 8 10 10^ 12^ +(1, 0) 8 10 12^ 10^ +(1, 0) 8 11 7^ 11^ +(1, 0) 8 11 8^ 11^ +(1, 0) 8 11 9^ 11^ +(1, 0) 8 11 11^ 7^ +(1, 0) 8 11 11^ 8^ +(1, 0) 8 11 11^ 9^ +(1, 0) 8 11 11^ 12^ +(1, 0) 8 11 12^ 11^ +(1, 0) 8 12 7^ 7^ +(1, 0) 8 12 7^ 8^ +(1, 0) 8 12 7^ 9^ +(1, 0) 8 12 7^ 12^ +(1, 0) 8 12 8^ 7^ +(1, 0) 8 12 8^ 8^ +(1, 0) 8 12 8^ 9^ +(1, 0) 8 12 8^ 12^ +(1, 0) 8 12 9^ 7^ +(1, 0) 8 12 9^ 8^ +(1, 0) 8 12 9^ 9^ +(1, 0) 8 12 9^ 12^ +(1, 0) 8 12 10^ 10^ +(1, 0) 8 12 11^ 11^ +(1, 0) 8 12 12^ 7^ +(1, 0) 8 12 12^ 8^ +(1, 0) 8 12 12^ 9^ +(1, 0) 8 12 12^ 12^ +(1, 0) 9 1 1^ 7^ +(1, 0) 9 1 1^ 8^ +(1, 0) 9 1 1^ 9^ +(1, 0) 9 1 1^ 12^ +(1, 0) 9 1 2^ 7^ +(1, 0) 9 1 2^ 8^ +(1, 0) 9 1 2^ 9^ +(1, 0) 9 1 2^ 12^ +(1, 0) 9 1 3^ 7^ +(1, 0) 9 1 3^ 8^ +(1, 0) 9 1 3^ 9^ +(1, 0) 9 1 3^ 12^ +(1, 0) 9 1 4^ 10^ +(1, 0) 9 1 5^ 11^ +(1, 0) 9 1 6^ 7^ +(1, 0) 9 1 6^ 8^ +(1, 0) 9 1 6^ 9^ +(1, 0) 9 1 6^ 12^ +(1, 0) 9 2 1^ 7^ +(1, 0) 9 2 1^ 8^ +(1, 0) 9 2 1^ 9^ +(1, 0) 9 2 1^ 12^ +(1, 0) 9 2 2^ 7^ +(1, 0) 9 2 2^ 8^ +(1, 0) 9 2 2^ 9^ +(1, 0) 9 2 2^ 12^ +(1, 0) 9 2 3^ 7^ +(1, 0) 9 2 3^ 8^ +(1, 0) 9 2 3^ 9^ +(1, 0) 9 2 3^ 12^ +(1, 0) 9 2 4^ 10^ +(1, 0) 9 2 5^ 11^ +(1, 0) 9 2 6^ 7^ +(1, 0) 9 2 6^ 8^ +(1, 0) 9 2 6^ 9^ +(1, 0) 9 2 6^ 12^ +(1, 0) 9 3 1^ 7^ +(1, 0) 9 3 1^ 8^ +(1, 0) 9 3 1^ 9^ +(1, 0) 9 3 1^ 12^ +(1, 0) 9 3 2^ 7^ +(1, 0) 9 3 2^ 8^ +(1, 0) 9 3 2^ 9^ +(1, 0) 9 3 2^ 12^ +(1, 0) 9 3 3^ 7^ +(1, 0) 9 3 3^ 8^ +(1, 0) 9 3 3^ 9^ +(1, 0) 9 3 3^ 12^ +(1, 0) 9 3 4^ 10^ +(1, 0) 9 3 5^ 11^ +(1, 0) 9 3 6^ 7^ +(1, 0) 9 3 6^ 8^ +(1, 0) 9 3 6^ 9^ +(1, 0) 9 3 6^ 12^ +(1, 0) 9 4 1^ 10^ +(1, 0) 9 4 2^ 10^ +(1, 0) 9 4 3^ 10^ +(1, 0) 9 4 4^ 7^ +(1, 0) 9 4 4^ 8^ +(1, 0) 9 4 4^ 9^ +(1, 0) 9 4 4^ 12^ +(1, 0) 9 4 6^ 10^ +(1, 0) 9 5 1^ 11^ +(1, 0) 9 5 2^ 11^ +(1, 0) 9 5 3^ 11^ +(1, 0) 9 5 5^ 7^ +(1, 0) 9 5 5^ 8^ +(1, 0) 9 5 5^ 9^ +(1, 0) 9 5 5^ 12^ +(1, 0) 9 5 6^ 11^ +(1, 0) 9 6 1^ 7^ +(1, 0) 9 6 1^ 8^ +(1, 0) 9 6 1^ 9^ +(1, 0) 9 6 1^ 12^ +(1, 0) 9 6 2^ 7^ +(1, 0) 9 6 2^ 8^ +(1, 0) 9 6 2^ 9^ +(1, 0) 9 6 2^ 12^ +(1, 0) 9 6 3^ 7^ +(1, 0) 9 6 3^ 8^ +(1, 0) 9 6 3^ 9^ +(1, 0) 9 6 3^ 12^ +(1, 0) 9 6 4^ 10^ +(1, 0) 9 6 5^ 11^ +(1, 0) 9 6 6^ 7^ +(1, 0) 9 6 6^ 8^ +(1, 0) 9 6 6^ 9^ +(1, 0) 9 6 6^ 12^ +(1, 0) 9 7 7^ 7^ +(1, 0) 9 7 7^ 8^ +(1, 0) 9 7 7^ 9^ +(1, 0) 9 7 7^ 12^ +(1, 0) 9 7 8^ 7^ +(1, 0) 9 7 8^ 8^ +(1, 0) 9 7 8^ 9^ +(1, 0) 9 7 8^ 12^ +(1, 0) 9 7 9^ 7^ +(1, 0) 9 7 9^ 8^ +(1, 0) 9 7 9^ 9^ +(1, 0) 9 7 9^ 12^ +(1, 0) 9 7 10^ 10^ +(1, 0) 9 7 11^ 11^ +(1, 0) 9 7 12^ 7^ +(1, 0) 9 7 12^ 8^ +(1, 0) 9 7 12^ 9^ +(1, 0) 9 7 12^ 12^ +(1, 0) 9 8 7^ 7^ +(1, 0) 9 8 7^ 8^ +(1, 0) 9 8 7^ 9^ +(1, 0) 9 8 7^ 12^ +(1, 0) 9 8 8^ 7^ +(1, 0) 9 8 8^ 8^ +(1, 0) 9 8 8^ 9^ +(1, 0) 9 8 8^ 12^ +(1, 0) 9 8 9^ 7^ +(1, 0) 9 8 9^ 8^ +(1, 0) 9 8 9^ 9^ +(1, 0) 9 8 9^ 12^ +(1, 0) 9 8 10^ 10^ +(1, 0) 9 8 11^ 11^ +(1, 0) 9 8 12^ 7^ +(1, 0) 9 8 12^ 8^ +(1, 0) 9 8 12^ 9^ +(1, 0) 9 8 12^ 12^ +(1, 0) 9 9 7^ 7^ +(1, 0) 9 9 7^ 8^ +(1, 0) 9 9 7^ 9^ +(1, 0) 9 9 7^ 12^ +(1, 0) 9 9 8^ 7^ +(1, 0) 9 9 8^ 8^ +(1, 0) 9 9 8^ 9^ +(1, 0) 9 9 8^ 12^ +(1, 0) 9 9 9^ 7^ +(1, 0) 9 9 9^ 8^ +(1, 0) 9 9 9^ 9^ +(1, 0) 9 9 9^ 12^ +(1, 0) 9 9 10^ 10^ +(1, 0) 9 9 11^ 11^ +(1, 0) 9 9 12^ 7^ +(1, 0) 9 9 12^ 8^ +(1, 0) 9 9 12^ 9^ +(1, 0) 9 9 12^ 12^ +(1, 0) 9 10 7^ 10^ +(1, 0) 9 10 8^ 10^ +(1, 0) 9 10 9^ 10^ +(1, 0) 9 10 10^ 7^ +(1, 0) 9 10 10^ 8^ +(1, 0) 9 10 10^ 9^ +(1, 0) 9 10 10^ 12^ +(1, 0) 9 10 12^ 10^ +(1, 0) 9 11 7^ 11^ +(1, 0) 9 11 8^ 11^ +(1, 0) 9 11 9^ 11^ +(1, 0) 9 11 11^ 7^ +(1, 0) 9 11 11^ 8^ +(1, 0) 9 11 11^ 9^ +(1, 0) 9 11 11^ 12^ +(1, 0) 9 11 12^ 11^ +(1, 0) 9 12 7^ 7^ +(1, 0) 9 12 7^ 8^ +(1, 0) 9 12 7^ 9^ +(1, 0) 9 12 7^ 12^ +(1, 0) 9 12 8^ 7^ +(1, 0) 9 12 8^ 8^ +(1, 0) 9 12 8^ 9^ +(1, 0) 9 12 8^ 12^ +(1, 0) 9 12 9^ 7^ +(1, 0) 9 12 9^ 8^ +(1, 0) 9 12 9^ 9^ +(1, 0) 9 12 9^ 12^ +(1, 0) 9 12 10^ 10^ +(1, 0) 9 12 11^ 11^ +(1, 0) 9 12 12^ 7^ +(1, 0) 9 12 12^ 8^ +(1, 0) 9 12 12^ 9^ +(1, 0) 9 12 12^ 12^ +(1, 0) 10 1 1^ 10^ +(1, 0) 10 1 2^ 10^ +(1, 0) 10 1 3^ 10^ +(1, 0) 10 1 4^ 7^ +(1, 0) 10 1 4^ 8^ +(1, 0) 10 1 4^ 9^ +(1, 0) 10 1 4^ 12^ +(1, 0) 10 1 6^ 10^ +(1, 0) 10 2 1^ 10^ +(1, 0) 10 2 2^ 10^ +(1, 0) 10 2 3^ 10^ +(1, 0) 10 2 4^ 7^ +(1, 0) 10 2 4^ 8^ +(1, 0) 10 2 4^ 9^ +(1, 0) 10 2 4^ 12^ +(1, 0) 10 2 6^ 10^ +(1, 0) 10 3 1^ 10^ +(1, 0) 10 3 2^ 10^ +(1, 0) 10 3 3^ 10^ +(1, 0) 10 3 4^ 7^ +(1, 0) 10 3 4^ 8^ +(1, 0) 10 3 4^ 9^ +(1, 0) 10 3 4^ 12^ +(1, 0) 10 3 6^ 10^ +(1, 0) 10 4 1^ 7^ +(1, 0) 10 4 1^ 8^ +(1, 0) 10 4 1^ 9^ +(1, 0) 10 4 1^ 12^ +(1, 0) 10 4 2^ 7^ +(1, 0) 10 4 2^ 8^ +(1, 0) 10 4 2^ 9^ +(1, 0) 10 4 2^ 12^ +(1, 0) 10 4 3^ 7^ +(1, 0) 10 4 3^ 8^ +(1, 0) 10 4 3^ 9^ +(1, 0) 10 4 3^ 12^ +(1, 0) 10 4 4^ 10^ +(1, 0) 10 4 5^ 11^ +(1, 0) 10 4 6^ 7^ +(1, 0) 10 4 6^ 8^ +(1, 0) 10 4 6^ 9^ +(1, 0) 10 4 6^ 12^ +(1, 0) 10 5 4^ 11^ +(1, 0) 10 5 5^ 10^ +(1, 0) 10 6 1^ 10^ +(1, 0) 10 6 2^ 10^ +(1, 0) 10 6 3^ 10^ +(1, 0) 10 6 4^ 7^ +(1, 0) 10 6 4^ 8^ +(1, 0) 10 6 4^ 9^ +(1, 0) 10 6 4^ 12^ +(1, 0) 10 6 6^ 10^ +(1, 0) 10 7 7^ 10^ +(1, 0) 10 7 8^ 10^ +(1, 0) 10 7 9^ 10^ +(1, 0) 10 7 10^ 7^ +(1, 0) 10 7 10^ 8^ +(1, 0) 10 7 10^ 9^ +(1, 0) 10 7 10^ 12^ +(1, 0) 10 7 12^ 10^ +(1, 0) 10 8 7^ 10^ +(1, 0) 10 8 8^ 10^ +(1, 0) 10 8 9^ 10^ +(1, 0) 10 8 10^ 7^ +(1, 0) 10 8 10^ 8^ +(1, 0) 10 8 10^ 9^ +(1, 0) 10 8 10^ 12^ +(1, 0) 10 8 12^ 10^ +(1, 0) 10 9 7^ 10^ +(1, 0) 10 9 8^ 10^ +(1, 0) 10 9 9^ 10^ +(1, 0) 10 9 10^ 7^ +(1, 0) 10 9 10^ 8^ +(1, 0) 10 9 10^ 9^ +(1, 0) 10 9 10^ 12^ +(1, 0) 10 9 12^ 10^ +(1, 0) 10 10 7^ 7^ +(1, 0) 10 10 7^ 8^ +(1, 0) 10 10 7^ 9^ +(1, 0) 10 10 7^ 12^ +(1, 0) 10 10 8^ 7^ +(1, 0) 10 10 8^ 8^ +(1, 0) 10 10 8^ 9^ +(1, 0) 10 10 8^ 12^ +(1, 0) 10 10 9^ 7^ +(1, 0) 10 10 9^ 8^ +(1, 0) 10 10 9^ 9^ +(1, 0) 10 10 9^ 12^ +(1, 0) 10 10 10^ 10^ +(1, 0) 10 10 11^ 11^ +(1, 0) 10 10 12^ 7^ +(1, 0) 10 10 12^ 8^ +(1, 0) 10 10 12^ 9^ +(1, 0) 10 10 12^ 12^ +(1, 0) 10 11 10^ 11^ +(1, 0) 10 11 11^ 10^ +(1, 0) 10 12 7^ 10^ +(1, 0) 10 12 8^ 10^ +(1, 0) 10 12 9^ 10^ +(1, 0) 10 12 10^ 7^ +(1, 0) 10 12 10^ 8^ +(1, 0) 10 12 10^ 9^ +(1, 0) 10 12 10^ 12^ +(1, 0) 10 12 12^ 10^ +(1, 0) 11 1 1^ 11^ +(1, 0) 11 1 2^ 11^ +(1, 0) 11 1 3^ 11^ +(1, 0) 11 1 5^ 7^ +(1, 0) 11 1 5^ 8^ +(1, 0) 11 1 5^ 9^ +(1, 0) 11 1 5^ 12^ +(1, 0) 11 1 6^ 11^ +(1, 0) 11 2 1^ 11^ +(1, 0) 11 2 2^ 11^ +(1, 0) 11 2 3^ 11^ +(1, 0) 11 2 5^ 7^ +(1, 0) 11 2 5^ 8^ +(1, 0) 11 2 5^ 9^ +(1, 0) 11 2 5^ 12^ +(1, 0) 11 2 6^ 11^ +(1, 0) 11 3 1^ 11^ +(1, 0) 11 3 2^ 11^ +(1, 0) 11 3 3^ 11^ +(1, 0) 11 3 5^ 7^ +(1, 0) 11 3 5^ 8^ +(1, 0) 11 3 5^ 9^ +(1, 0) 11 3 5^ 12^ +(1, 0) 11 3 6^ 11^ +(1, 0) 11 4 4^ 11^ +(1, 0) 11 4 5^ 10^ +(1, 0) 11 5 1^ 7^ +(1, 0) 11 5 1^ 8^ +(1, 0) 11 5 1^ 9^ +(1, 0) 11 5 1^ 12^ +(1, 0) 11 5 2^ 7^ +(1, 0) 11 5 2^ 8^ +(1, 0) 11 5 2^ 9^ +(1, 0) 11 5 2^ 12^ +(1, 0) 11 5 3^ 7^ +(1, 0) 11 5 3^ 8^ +(1, 0) 11 5 3^ 9^ +(1, 0) 11 5 3^ 12^ +(1, 0) 11 5 4^ 10^ +(1, 0) 11 5 5^ 11^ +(1, 0) 11 5 6^ 7^ +(1, 0) 11 5 6^ 8^ +(1, 0) 11 5 6^ 9^ +(1, 0) 11 5 6^ 12^ +(1, 0) 11 6 1^ 11^ +(1, 0) 11 6 2^ 11^ +(1, 0) 11 6 3^ 11^ +(1, 0) 11 6 5^ 7^ +(1, 0) 11 6 5^ 8^ +(1, 0) 11 6 5^ 9^ +(1, 0) 11 6 5^ 12^ +(1, 0) 11 6 6^ 11^ +(1, 0) 11 7 7^ 11^ +(1, 0) 11 7 8^ 11^ +(1, 0) 11 7 9^ 11^ +(1, 0) 11 7 11^ 7^ +(1, 0) 11 7 11^ 8^ +(1, 0) 11 7 11^ 9^ +(1, 0) 11 7 11^ 12^ +(1, 0) 11 7 12^ 11^ +(1, 0) 11 8 7^ 11^ +(1, 0) 11 8 8^ 11^ +(1, 0) 11 8 9^ 11^ +(1, 0) 11 8 11^ 7^ +(1, 0) 11 8 11^ 8^ +(1, 0) 11 8 11^ 9^ +(1, 0) 11 8 11^ 12^ +(1, 0) 11 8 12^ 11^ +(1, 0) 11 9 7^ 11^ +(1, 0) 11 9 8^ 11^ +(1, 0) 11 9 9^ 11^ +(1, 0) 11 9 11^ 7^ +(1, 0) 11 9 11^ 8^ +(1, 0) 11 9 11^ 9^ +(1, 0) 11 9 11^ 12^ +(1, 0) 11 9 12^ 11^ +(1, 0) 11 10 10^ 11^ +(1, 0) 11 10 11^ 10^ +(1, 0) 11 11 7^ 7^ +(1, 0) 11 11 7^ 8^ +(1, 0) 11 11 7^ 9^ +(1, 0) 11 11 7^ 12^ +(1, 0) 11 11 8^ 7^ +(1, 0) 11 11 8^ 8^ +(1, 0) 11 11 8^ 9^ +(1, 0) 11 11 8^ 12^ +(1, 0) 11 11 9^ 7^ +(1, 0) 11 11 9^ 8^ +(1, 0) 11 11 9^ 9^ +(1, 0) 11 11 9^ 12^ +(1, 0) 11 11 10^ 10^ +(1, 0) 11 11 11^ 11^ +(1, 0) 11 11 12^ 7^ +(1, 0) 11 11 12^ 8^ +(1, 0) 11 11 12^ 9^ +(1, 0) 11 11 12^ 12^ +(1, 0) 11 12 7^ 11^ +(1, 0) 11 12 8^ 11^ +(1, 0) 11 12 9^ 11^ +(1, 0) 11 12 11^ 7^ +(1, 0) 11 12 11^ 8^ +(1, 0) 11 12 11^ 9^ +(1, 0) 11 12 11^ 12^ +(1, 0) 11 12 12^ 11^ +(1, 0) 12 1 1^ 7^ +(1, 0) 12 1 1^ 8^ +(1, 0) 12 1 1^ 9^ +(1, 0) 12 1 1^ 12^ +(1, 0) 12 1 2^ 7^ +(1, 0) 12 1 2^ 8^ +(1, 0) 12 1 2^ 9^ +(1, 0) 12 1 2^ 12^ +(1, 0) 12 1 3^ 7^ +(1, 0) 12 1 3^ 8^ +(1, 0) 12 1 3^ 9^ +(1, 0) 12 1 3^ 12^ +(1, 0) 12 1 4^ 10^ +(1, 0) 12 1 5^ 11^ +(1, 0) 12 1 6^ 7^ +(1, 0) 12 1 6^ 8^ +(1, 0) 12 1 6^ 9^ +(1, 0) 12 1 6^ 12^ +(1, 0) 12 2 1^ 7^ +(1, 0) 12 2 1^ 8^ +(1, 0) 12 2 1^ 9^ +(1, 0) 12 2 1^ 12^ +(1, 0) 12 2 2^ 7^ +(1, 0) 12 2 2^ 8^ +(1, 0) 12 2 2^ 9^ +(1, 0) 12 2 2^ 12^ +(1, 0) 12 2 3^ 7^ +(1, 0) 12 2 3^ 8^ +(1, 0) 12 2 3^ 9^ +(1, 0) 12 2 3^ 12^ +(1, 0) 12 2 4^ 10^ +(1, 0) 12 2 5^ 11^ +(1, 0) 12 2 6^ 7^ +(1, 0) 12 2 6^ 8^ +(1, 0) 12 2 6^ 9^ +(1, 0) 12 2 6^ 12^ +(1, 0) 12 3 1^ 7^ +(1, 0) 12 3 1^ 8^ +(1, 0) 12 3 1^ 9^ +(1, 0) 12 3 1^ 12^ +(1, 0) 12 3 2^ 7^ +(1, 0) 12 3 2^ 8^ +(1, 0) 12 3 2^ 9^ +(1, 0) 12 3 2^ 12^ +(1, 0) 12 3 3^ 7^ +(1, 0) 12 3 3^ 8^ +(1, 0) 12 3 3^ 9^ +(1, 0) 12 3 3^ 12^ +(1, 0) 12 3 4^ 10^ +(1, 0) 12 3 5^ 11^ +(1, 0) 12 3 6^ 7^ +(1, 0) 12 3 6^ 8^ +(1, 0) 12 3 6^ 9^ +(1, 0) 12 3 6^ 12^ +(1, 0) 12 4 1^ 10^ +(1, 0) 12 4 2^ 10^ +(1, 0) 12 4 3^ 10^ +(1, 0) 12 4 4^ 7^ +(1, 0) 12 4 4^ 8^ +(1, 0) 12 4 4^ 9^ +(1, 0) 12 4 4^ 12^ +(1, 0) 12 4 6^ 10^ +(1, 0) 12 5 1^ 11^ +(1, 0) 12 5 2^ 11^ +(1, 0) 12 5 3^ 11^ +(1, 0) 12 5 5^ 7^ +(1, 0) 12 5 5^ 8^ +(1, 0) 12 5 5^ 9^ +(1, 0) 12 5 5^ 12^ +(1, 0) 12 5 6^ 11^ +(1, 0) 12 6 1^ 7^ +(1, 0) 12 6 1^ 8^ +(1, 0) 12 6 1^ 9^ +(1, 0) 12 6 1^ 12^ +(1, 0) 12 6 2^ 7^ +(1, 0) 12 6 2^ 8^ +(1, 0) 12 6 2^ 9^ +(1, 0) 12 6 2^ 12^ +(1, 0) 12 6 3^ 7^ +(1, 0) 12 6 3^ 8^ +(1, 0) 12 6 3^ 9^ +(1, 0) 12 6 3^ 12^ +(1, 0) 12 6 4^ 10^ +(1, 0) 12 6 5^ 11^ +(1, 0) 12 6 6^ 7^ +(1, 0) 12 6 6^ 8^ +(1, 0) 12 6 6^ 9^ +(1, 0) 12 6 6^ 12^ +(1, 0) 12 7 7^ 7^ +(1, 0) 12 7 7^ 8^ +(1, 0) 12 7 7^ 9^ +(1, 0) 12 7 7^ 12^ +(1, 0) 12 7 8^ 7^ +(1, 0) 12 7 8^ 8^ +(1, 0) 12 7 8^ 9^ +(1, 0) 12 7 8^ 12^ +(1, 0) 12 7 9^ 7^ +(1, 0) 12 7 9^ 8^ +(1, 0) 12 7 9^ 9^ +(1, 0) 12 7 9^ 12^ +(1, 0) 12 7 10^ 10^ +(1, 0) 12 7 11^ 11^ +(1, 0) 12 7 12^ 7^ +(1, 0) 12 7 12^ 8^ +(1, 0) 12 7 12^ 9^ +(1, 0) 12 7 12^ 12^ +(1, 0) 12 8 7^ 7^ +(1, 0) 12 8 7^ 8^ +(1, 0) 12 8 7^ 9^ +(1, 0) 12 8 7^ 12^ +(1, 0) 12 8 8^ 7^ +(1, 0) 12 8 8^ 8^ +(1, 0) 12 8 8^ 9^ +(1, 0) 12 8 8^ 12^ +(1, 0) 12 8 9^ 7^ +(1, 0) 12 8 9^ 8^ +(1, 0) 12 8 9^ 9^ +(1, 0) 12 8 9^ 12^ +(1, 0) 12 8 10^ 10^ +(1, 0) 12 8 11^ 11^ +(1, 0) 12 8 12^ 7^ +(1, 0) 12 8 12^ 8^ +(1, 0) 12 8 12^ 9^ +(1, 0) 12 8 12^ 12^ +(1, 0) 12 9 7^ 7^ +(1, 0) 12 9 7^ 8^ +(1, 0) 12 9 7^ 9^ +(1, 0) 12 9 7^ 12^ +(1, 0) 12 9 8^ 7^ +(1, 0) 12 9 8^ 8^ +(1, 0) 12 9 8^ 9^ +(1, 0) 12 9 8^ 12^ +(1, 0) 12 9 9^ 7^ +(1, 0) 12 9 9^ 8^ +(1, 0) 12 9 9^ 9^ +(1, 0) 12 9 9^ 12^ +(1, 0) 12 9 10^ 10^ +(1, 0) 12 9 11^ 11^ +(1, 0) 12 9 12^ 7^ +(1, 0) 12 9 12^ 8^ +(1, 0) 12 9 12^ 9^ +(1, 0) 12 9 12^ 12^ +(1, 0) 12 10 7^ 10^ +(1, 0) 12 10 8^ 10^ +(1, 0) 12 10 9^ 10^ +(1, 0) 12 10 10^ 7^ +(1, 0) 12 10 10^ 8^ +(1, 0) 12 10 10^ 9^ +(1, 0) 12 10 10^ 12^ +(1, 0) 12 10 12^ 10^ +(1, 0) 12 11 7^ 11^ +(1, 0) 12 11 8^ 11^ +(1, 0) 12 11 9^ 11^ +(1, 0) 12 11 11^ 7^ +(1, 0) 12 11 11^ 8^ +(1, 0) 12 11 11^ 9^ +(1, 0) 12 11 11^ 12^ +(1, 0) 12 11 12^ 11^ +(1, 0) 12 12 7^ 7^ +(1, 0) 12 12 7^ 8^ +(1, 0) 12 12 7^ 9^ +(1, 0) 12 12 7^ 12^ +(1, 0) 12 12 8^ 7^ +(1, 0) 12 12 8^ 8^ +(1, 0) 12 12 8^ 9^ +(1, 0) 12 12 8^ 12^ +(1, 0) 12 12 9^ 7^ +(1, 0) 12 12 9^ 8^ +(1, 0) 12 12 9^ 9^ +(1, 0) 12 12 9^ 12^ +(1, 0) 12 12 10^ 10^ +(1, 0) 12 12 11^ 11^ +(1, 0) 12 12 12^ 7^ +(1, 0) 12 12 12^ 8^ +(1, 0) 12 12 12^ 9^ +(1, 0) 12 12 12^ 12^ diff --git a/benchmark/fham/electron-2.fham b/benchmark/fham/electron-2.fham new file mode 100644 index 000000000..086a49029 --- /dev/null +++ b/benchmark/fham/electron-2.fham @@ -0,0 +1,6 @@ +(1, 0) 1 1^ +(1, 0) 2 2^ +(1, 0) 1 1 1^ 1^ +(1, 0) 1 2 2^ 1^ +(1, 0) 2 1 1^ 2^ +(1, 0) 2 2 2^ 2^ diff --git a/benchmark/fham/electron-4.fham b/benchmark/fham/electron-4.fham new file mode 100644 index 000000000..59b144b7d --- /dev/null +++ b/benchmark/fham/electron-4.fham @@ -0,0 +1,36 @@ +(1, 0) 1 1 1^ 1^ +(1, 0) 1 1 2^ 2^ +(1, 0) 1 2 1^ 2^ +(1, 0) 1 2 2^ 1^ +(1, 0) 1 3 3^ 1^ +(1, 0) 1 3 4^ 2^ +(1, 0) 1 4 3^ 2^ +(1, 0) 1 4 4^ 1^ +(1, 0) 2 1 1^ 2^ +(1, 0) 2 1 2^ 1^ +(1, 0) 2 2 1^ 1^ +(1, 0) 2 2 2^ 2^ +(1, 0) 2 3 3^ 2^ +(1, 0) 2 3 4^ 1^ +(1, 0) 2 4 3^ 1^ +(1, 0) 2 4 4^ 2^ +(1, 0) 3 1 1^ 3^ +(1, 0) 3 1 2^ 4^ +(1, 0) 3 2 1^ 4^ +(1, 0) 3 2 2^ 3^ +(1, 0) 3 3 3^ 3^ +(1, 0) 3 3 4^ 4^ +(1, 0) 3 4 3^ 4^ +(1, 0) 3 4 4^ 3^ +(1, 0) 4 1 1^ 4^ +(1, 0) 4 1 2^ 3^ +(1, 0) 4 2 1^ 3^ +(1, 0) 4 2 2^ 4^ +(1, 0) 4 3 3^ 4^ +(1, 0) 4 3 4^ 3^ +(1, 0) 4 4 3^ 3^ +(1, 0) 4 4 4^ 4^ +(1, 0) 1 1^ +(1, 0) 2 2^ +(1, 0) 3 3^ +(1, 0) 4 4^ diff --git a/benchmark/fham/electron-6.fham b/benchmark/fham/electron-6.fham new file mode 100644 index 000000000..59f28402a --- /dev/null +++ b/benchmark/fham/electron-6.fham @@ -0,0 +1,174 @@ +(1, 0) 1 1 1^ 1^ +(1, 0) 1 1 1^ 3^ +(1, 0) 1 1 2^ 2^ +(1, 0) 1 1 3^ 1^ +(1, 0) 1 1 3^ 3^ +(1, 0) 1 2 1^ 2^ +(1, 0) 1 2 2^ 1^ +(1, 0) 1 2 2^ 3^ +(1, 0) 1 2 3^ 2^ +(1, 0) 1 3 1^ 1^ +(1, 0) 1 3 1^ 3^ +(1, 0) 1 3 2^ 2^ +(1, 0) 1 3 3^ 1^ +(1, 0) 1 3 3^ 3^ +(1, 0) 1 4 4^ 1^ +(1, 0) 1 4 4^ 3^ +(1, 0) 1 4 5^ 2^ +(1, 0) 1 4 6^ 1^ +(1, 0) 1 4 6^ 3^ +(1, 0) 1 5 4^ 2^ +(1, 0) 1 5 5^ 1^ +(1, 0) 1 5 5^ 3^ +(1, 0) 1 5 6^ 2^ +(1, 0) 1 6 4^ 1^ +(1, 0) 1 6 4^ 3^ +(1, 0) 1 6 5^ 2^ +(1, 0) 1 6 6^ 1^ +(1, 0) 1 6 6^ 3^ +(1, 0) 2 1 1^ 2^ +(1, 0) 2 1 2^ 1^ +(1, 0) 2 1 2^ 3^ +(1, 0) 2 1 3^ 2^ +(1, 0) 2 2 1^ 1^ +(1, 0) 2 2 1^ 3^ +(1, 0) 2 2 2^ 2^ +(1, 0) 2 2 3^ 1^ +(1, 0) 2 2 3^ 3^ +(1, 0) 2 3 1^ 2^ +(1, 0) 2 3 2^ 1^ +(1, 0) 2 3 2^ 3^ +(1, 0) 2 3 3^ 2^ +(1, 0) 2 4 4^ 2^ +(1, 0) 2 4 5^ 1^ +(1, 0) 2 4 5^ 3^ +(1, 0) 2 4 6^ 2^ +(1, 0) 2 5 4^ 1^ +(1, 0) 2 5 4^ 3^ +(1, 0) 2 5 5^ 2^ +(1, 0) 2 5 6^ 1^ +(1, 0) 2 5 6^ 3^ +(1, 0) 2 6 4^ 2^ +(1, 0) 2 6 5^ 1^ +(1, 0) 2 6 5^ 3^ +(1, 0) 2 6 6^ 2^ +(1, 0) 3 1 1^ 1^ +(1, 0) 3 1 1^ 3^ +(1, 0) 3 1 2^ 2^ +(1, 0) 3 1 3^ 1^ +(1, 0) 3 1 3^ 3^ +(1, 0) 3 2 1^ 2^ +(1, 0) 3 2 2^ 1^ +(1, 0) 3 2 2^ 3^ +(1, 0) 3 2 3^ 2^ +(1, 0) 3 3 1^ 1^ +(1, 0) 3 3 1^ 3^ +(1, 0) 3 3 2^ 2^ +(1, 0) 3 3 3^ 1^ +(1, 0) 3 3 3^ 3^ +(1, 0) 3 4 4^ 1^ +(1, 0) 3 4 4^ 3^ +(1, 0) 3 4 5^ 2^ +(1, 0) 3 4 6^ 1^ +(1, 0) 3 4 6^ 3^ +(1, 0) 3 5 4^ 2^ +(1, 0) 3 5 5^ 1^ +(1, 0) 3 5 5^ 3^ +(1, 0) 3 5 6^ 2^ +(1, 0) 3 6 4^ 1^ +(1, 0) 3 6 4^ 3^ +(1, 0) 3 6 5^ 2^ +(1, 0) 3 6 6^ 1^ +(1, 0) 3 6 6^ 3^ +(1, 0) 4 1 1^ 4^ +(1, 0) 4 1 1^ 6^ +(1, 0) 4 1 2^ 5^ +(1, 0) 4 1 3^ 4^ +(1, 0) 4 1 3^ 6^ +(1, 0) 4 2 1^ 5^ +(1, 0) 4 2 2^ 4^ +(1, 0) 4 2 2^ 6^ +(1, 0) 4 2 3^ 5^ +(1, 0) 4 3 1^ 4^ +(1, 0) 4 3 1^ 6^ +(1, 0) 4 3 2^ 5^ +(1, 0) 4 3 3^ 4^ +(1, 0) 4 3 3^ 6^ +(1, 0) 4 4 4^ 4^ +(1, 0) 4 4 4^ 6^ +(1, 0) 4 4 5^ 5^ +(1, 0) 4 4 6^ 4^ +(1, 0) 4 4 6^ 6^ +(1, 0) 4 5 4^ 5^ +(1, 0) 4 5 5^ 4^ +(1, 0) 4 5 5^ 6^ +(1, 0) 4 5 6^ 5^ +(1, 0) 4 6 4^ 4^ +(1, 0) 4 6 4^ 6^ +(1, 0) 4 6 5^ 5^ +(1, 0) 4 6 6^ 4^ +(1, 0) 4 6 6^ 6^ +(1, 0) 5 1 1^ 5^ +(1, 0) 5 1 2^ 4^ +(1, 0) 5 1 2^ 6^ +(1, 0) 5 1 3^ 5^ +(1, 0) 5 2 1^ 4^ +(1, 0) 5 2 1^ 6^ +(1, 0) 5 2 2^ 5^ +(1, 0) 5 2 3^ 4^ +(1, 0) 5 2 3^ 6^ +(1, 0) 5 3 1^ 5^ +(1, 0) 5 3 2^ 4^ +(1, 0) 5 3 2^ 6^ +(1, 0) 5 3 3^ 5^ +(1, 0) 5 4 4^ 5^ +(1, 0) 5 4 5^ 4^ +(1, 0) 5 4 5^ 6^ +(1, 0) 5 4 6^ 5^ +(1, 0) 5 5 4^ 4^ +(1, 0) 5 5 4^ 6^ +(1, 0) 5 5 5^ 5^ +(1, 0) 5 5 6^ 4^ +(1, 0) 5 5 6^ 6^ +(1, 0) 5 6 4^ 5^ +(1, 0) 5 6 5^ 4^ +(1, 0) 5 6 5^ 6^ +(1, 0) 5 6 6^ 5^ +(1, 0) 6 1 1^ 4^ +(1, 0) 6 1 1^ 6^ +(1, 0) 6 1 2^ 5^ +(1, 0) 6 1 3^ 4^ +(1, 0) 6 1 3^ 6^ +(1, 0) 6 2 1^ 5^ +(1, 0) 6 2 2^ 4^ +(1, 0) 6 2 2^ 6^ +(1, 0) 6 2 3^ 5^ +(1, 0) 6 3 1^ 4^ +(1, 0) 6 3 1^ 6^ +(1, 0) 6 3 2^ 5^ +(1, 0) 6 3 3^ 4^ +(1, 0) 6 3 3^ 6^ +(1, 0) 6 4 4^ 4^ +(1, 0) 6 4 4^ 6^ +(1, 0) 6 4 5^ 5^ +(1, 0) 6 4 6^ 4^ +(1, 0) 6 4 6^ 6^ +(1, 0) 6 5 4^ 5^ +(1, 0) 6 5 5^ 4^ +(1, 0) 6 5 5^ 6^ +(1, 0) 6 5 6^ 5^ +(1, 0) 6 6 4^ 4^ +(1, 0) 6 6 4^ 6^ +(1, 0) 6 6 5^ 5^ +(1, 0) 6 6 6^ 4^ +(1, 0) 6 6 6^ 6^ +(1, 0) 1 1^ +(1, 0) 1 3^ +(1, 0) 2 2^ +(1, 0) 3 1^ +(1, 0) 3 3^ +(1, 0) 4 4^ +(1, 0) 4 6^ +(1, 0) 5 5^ +(1, 0) 6 4^ +(1, 0) 6 6^ diff --git a/benchmark/fham/electron-8.fham b/benchmark/fham/electron-8.fham new file mode 100644 index 000000000..10f76ab07 --- /dev/null +++ b/benchmark/fham/electron-8.fham @@ -0,0 +1,136 @@ +(1, 0) 1 2 1^ 2^ +(1, 0) 1 2 2^ 1^ +(1, 0) 1 3 1^ 3^ +(1, 0) 1 3 3^ 1^ +(1, 0) 1 4 1^ 4^ +(1, 0) 1 4 4^ 1^ +(1, 0) 1 5 5^ 1^ +(1, 0) 1 5 6^ 2^ +(1, 0) 1 5 7^ 3^ +(1, 0) 1 5 8^ 4^ +(1, 0) 1 6 5^ 2^ +(1, 0) 1 6 6^ 1^ +(1, 0) 1 7 5^ 3^ +(1, 0) 1 7 7^ 1^ +(1, 0) 1 8 5^ 4^ +(1, 0) 1 8 8^ 1^ +(1, 0) 2 1 1^ 2^ +(1, 0) 2 1 2^ 1^ +(1, 0) 2 3 2^ 3^ +(1, 0) 2 3 3^ 2^ +(1, 0) 2 4 2^ 4^ +(1, 0) 2 4 4^ 2^ +(1, 0) 2 5 5^ 2^ +(1, 0) 2 5 6^ 1^ +(1, 0) 2 6 5^ 1^ +(1, 0) 2 6 6^ 2^ +(1, 0) 2 6 7^ 3^ +(1, 0) 2 6 8^ 4^ +(1, 0) 2 7 6^ 3^ +(1, 0) 2 7 7^ 2^ +(1, 0) 2 8 6^ 4^ +(1, 0) 2 8 8^ 2^ +(1, 0) 3 1 1^ 3^ +(1, 0) 3 1 3^ 1^ +(1, 0) 3 2 2^ 3^ +(1, 0) 3 2 3^ 2^ +(1, 0) 3 4 3^ 4^ +(1, 0) 3 4 4^ 3^ +(1, 0) 3 5 5^ 3^ +(1, 0) 3 5 7^ 1^ +(1, 0) 3 6 6^ 3^ +(1, 0) 3 6 7^ 2^ +(1, 0) 3 7 5^ 1^ +(1, 0) 3 7 6^ 2^ +(1, 0) 3 7 7^ 3^ +(1, 0) 3 7 8^ 4^ +(1, 0) 3 8 7^ 4^ +(1, 0) 3 8 8^ 3^ +(1, 0) 4 1 1^ 4^ +(1, 0) 4 1 4^ 1^ +(1, 0) 4 2 2^ 4^ +(1, 0) 4 2 4^ 2^ +(1, 0) 4 3 3^ 4^ +(1, 0) 4 3 4^ 3^ +(1, 0) 4 5 5^ 4^ +(1, 0) 4 5 8^ 1^ +(1, 0) 4 6 6^ 4^ +(1, 0) 4 6 8^ 2^ +(1, 0) 4 7 7^ 4^ +(1, 0) 4 7 8^ 3^ +(1, 0) 4 8 5^ 1^ +(1, 0) 4 8 6^ 2^ +(1, 0) 4 8 7^ 3^ +(1, 0) 4 8 8^ 4^ +(1, 0) 5 1 1^ 5^ +(1, 0) 5 1 2^ 6^ +(1, 0) 5 1 3^ 7^ +(1, 0) 5 1 4^ 8^ +(1, 0) 5 2 1^ 6^ +(1, 0) 5 2 2^ 5^ +(1, 0) 5 3 1^ 7^ +(1, 0) 5 3 3^ 5^ +(1, 0) 5 4 1^ 8^ +(1, 0) 5 4 4^ 5^ +(1, 0) 5 6 5^ 6^ +(1, 0) 5 6 6^ 5^ +(1, 0) 5 7 5^ 7^ +(1, 0) 5 7 7^ 5^ +(1, 0) 5 8 5^ 8^ +(1, 0) 5 8 8^ 5^ +(1, 0) 6 1 1^ 6^ +(1, 0) 6 1 2^ 5^ +(1, 0) 6 2 1^ 5^ +(1, 0) 6 2 2^ 6^ +(1, 0) 6 2 3^ 7^ +(1, 0) 6 2 4^ 8^ +(1, 0) 6 3 2^ 7^ +(1, 0) 6 3 3^ 6^ +(1, 0) 6 4 2^ 8^ +(1, 0) 6 4 4^ 6^ +(1, 0) 6 5 5^ 6^ +(1, 0) 6 5 6^ 5^ +(1, 0) 6 7 6^ 7^ +(1, 0) 6 7 7^ 6^ +(1, 0) 6 8 6^ 8^ +(1, 0) 6 8 8^ 6^ +(1, 0) 7 1 1^ 7^ +(1, 0) 7 1 3^ 5^ +(1, 0) 7 2 2^ 7^ +(1, 0) 7 2 3^ 6^ +(1, 0) 7 3 1^ 5^ +(1, 0) 7 3 2^ 6^ +(1, 0) 7 3 3^ 7^ +(1, 0) 7 3 4^ 8^ +(1, 0) 7 4 3^ 8^ +(1, 0) 7 4 4^ 7^ +(1, 0) 7 5 5^ 7^ +(1, 0) 7 5 7^ 5^ +(1, 0) 7 6 6^ 7^ +(1, 0) 7 6 7^ 6^ +(1, 0) 7 8 7^ 8^ +(1, 0) 7 8 8^ 7^ +(1, 0) 8 1 1^ 8^ +(1, 0) 8 1 4^ 5^ +(1, 0) 8 2 2^ 8^ +(1, 0) 8 2 4^ 6^ +(1, 0) 8 3 3^ 8^ +(1, 0) 8 3 4^ 7^ +(1, 0) 8 4 1^ 5^ +(1, 0) 8 4 2^ 6^ +(1, 0) 8 4 3^ 7^ +(1, 0) 8 4 4^ 8^ +(1, 0) 8 5 5^ 8^ +(1, 0) 8 5 8^ 5^ +(1, 0) 8 6 6^ 8^ +(1, 0) 8 6 8^ 6^ +(1, 0) 8 7 7^ 8^ +(1, 0) 8 7 8^ 7^ +(1, 0) 1 1^ +(1, 0) 2 2^ +(1, 0) 3 3^ +(1, 0) 4 4^ +(1, 0) 5 5^ +(1, 0) 6 6^ +(1, 0) 7 7^ +(1, 0) 8 8^ diff --git a/benchmark/fham/fermi-hubbard-10.fham b/benchmark/fham/fermi-hubbard-10.fham new file mode 100644 index 000000000..10985c175 --- /dev/null +++ b/benchmark/fham/fermi-hubbard-10.fham @@ -0,0 +1,55 @@ +(1, 0) 1^ 1 +(1, 0) 1^ 3 +(1, 0) 1^ 5 +(1, 0) 1^ 7 +(1, 0) 1^ 9 +(1, 0) 3^ 1 +(1, 0) 3^ 3 +(1, 0) 3^ 5 +(1, 0) 3^ 7 +(1, 0) 3^ 9 +(1, 0) 5^ 1 +(1, 0) 5^ 3 +(1, 0) 5^ 5 +(1, 0) 5^ 7 +(1, 0) 5^ 9 +(1, 0) 7^ 1 +(1, 0) 7^ 3 +(1, 0) 7^ 5 +(1, 0) 7^ 7 +(1, 0) 7^ 9 +(1, 0) 9^ 1 +(1, 0) 9^ 3 +(1, 0) 9^ 5 +(1, 0) 9^ 7 +(1, 0) 9^ 9 +(1, 0) 2^ 2 +(1, 0) 2^ 4 +(1, 0) 2^ 6 +(1, 0) 2^ 8 +(1, 0) 2^ 10 +(1, 0) 4^ 2 +(1, 0) 4^ 4 +(1, 0) 4^ 6 +(1, 0) 4^ 8 +(1, 0) 4^ 10 +(1, 0) 6^ 2 +(1, 0) 6^ 4 +(1, 0) 6^ 6 +(1, 0) 6^ 8 +(1, 0) 6^ 10 +(1, 0) 8^ 2 +(1, 0) 8^ 4 +(1, 0) 8^ 6 +(1, 0) 8^ 8 +(1, 0) 8^ 10 +(1, 0) 10^ 2 +(1, 0) 10^ 4 +(1, 0) 10^ 6 +(1, 0) 10^ 8 +(1, 0) 10^ 10 +(1, 0) 2^ 2 0 0 +(1, 0) 4^ 4 2^ 2 +(1, 0) 6^ 6 4^ 4 +(1, 0) 8^ 8 6^ 6 +(1, 0) 10^ 10 8^ 8 diff --git a/benchmark/fham/fermi-hubbard-12.fham b/benchmark/fham/fermi-hubbard-12.fham new file mode 100644 index 000000000..b5b414d01 --- /dev/null +++ b/benchmark/fham/fermi-hubbard-12.fham @@ -0,0 +1,78 @@ +(1, 0) 1^ 1 +(1, 0) 1^ 3 +(1, 0) 1^ 5 +(1, 0) 1^ 7 +(1, 0) 1^ 9 +(1, 0) 1^ 11 +(1, 0) 3^ 1 +(1, 0) 3^ 3 +(1, 0) 3^ 5 +(1, 0) 3^ 7 +(1, 0) 3^ 9 +(1, 0) 3^ 11 +(1, 0) 5^ 1 +(1, 0) 5^ 3 +(1, 0) 5^ 5 +(1, 0) 5^ 7 +(1, 0) 5^ 9 +(1, 0) 5^ 11 +(1, 0) 7^ 1 +(1, 0) 7^ 3 +(1, 0) 7^ 5 +(1, 0) 7^ 7 +(1, 0) 7^ 9 +(1, 0) 7^ 11 +(1, 0) 9^ 1 +(1, 0) 9^ 3 +(1, 0) 9^ 5 +(1, 0) 9^ 7 +(1, 0) 9^ 9 +(1, 0) 9^ 11 +(1, 0) 11^ 1 +(1, 0) 11^ 3 +(1, 0) 11^ 5 +(1, 0) 11^ 7 +(1, 0) 11^ 9 +(1, 0) 11^ 11 +(1, 0) 2^ 2 +(1, 0) 2^ 4 +(1, 0) 2^ 6 +(1, 0) 2^ 8 +(1, 0) 2^ 10 +(1, 0) 2^ 12 +(1, 0) 4^ 2 +(1, 0) 4^ 4 +(1, 0) 4^ 6 +(1, 0) 4^ 8 +(1, 0) 4^ 10 +(1, 0) 4^ 12 +(1, 0) 6^ 2 +(1, 0) 6^ 4 +(1, 0) 6^ 6 +(1, 0) 6^ 8 +(1, 0) 6^ 10 +(1, 0) 6^ 12 +(1, 0) 8^ 2 +(1, 0) 8^ 4 +(1, 0) 8^ 6 +(1, 0) 8^ 8 +(1, 0) 8^ 10 +(1, 0) 8^ 12 +(1, 0) 10^ 2 +(1, 0) 10^ 4 +(1, 0) 10^ 6 +(1, 0) 10^ 8 +(1, 0) 10^ 10 +(1, 0) 10^ 12 +(1, 0) 12^ 2 +(1, 0) 12^ 4 +(1, 0) 12^ 6 +(1, 0) 12^ 8 +(1, 0) 12^ 10 +(1, 0) 12^ 12 +(1, 0) 2^ 2 0 0 +(1, 0) 4^ 4 2^ 2 +(1, 0) 6^ 6 4^ 4 +(1, 0) 8^ 8 6^ 6 +(1, 0) 10^ 10 8^ 8 +(1, 0) 12^ 12 10^ 10 diff --git a/benchmark/fham/fermi-hubbard-14.fham b/benchmark/fham/fermi-hubbard-14.fham new file mode 100644 index 000000000..79c2be006 --- /dev/null +++ b/benchmark/fham/fermi-hubbard-14.fham @@ -0,0 +1,105 @@ +(1, 0) 1^ 1 +(1, 0) 1^ 3 +(1, 0) 1^ 5 +(1, 0) 1^ 7 +(1, 0) 1^ 9 +(1, 0) 1^ 11 +(1, 0) 1^ 13 +(1, 0) 3^ 1 +(1, 0) 3^ 3 +(1, 0) 3^ 5 +(1, 0) 3^ 7 +(1, 0) 3^ 9 +(1, 0) 3^ 11 +(1, 0) 3^ 13 +(1, 0) 5^ 1 +(1, 0) 5^ 3 +(1, 0) 5^ 5 +(1, 0) 5^ 7 +(1, 0) 5^ 9 +(1, 0) 5^ 11 +(1, 0) 5^ 13 +(1, 0) 7^ 1 +(1, 0) 7^ 3 +(1, 0) 7^ 5 +(1, 0) 7^ 7 +(1, 0) 7^ 9 +(1, 0) 7^ 11 +(1, 0) 7^ 13 +(1, 0) 9^ 1 +(1, 0) 9^ 3 +(1, 0) 9^ 5 +(1, 0) 9^ 7 +(1, 0) 9^ 9 +(1, 0) 9^ 11 +(1, 0) 9^ 13 +(1, 0) 11^ 1 +(1, 0) 11^ 3 +(1, 0) 11^ 5 +(1, 0) 11^ 7 +(1, 0) 11^ 9 +(1, 0) 11^ 11 +(1, 0) 11^ 13 +(1, 0) 13^ 1 +(1, 0) 13^ 3 +(1, 0) 13^ 5 +(1, 0) 13^ 7 +(1, 0) 13^ 9 +(1, 0) 13^ 11 +(1, 0) 13^ 13 +(1, 0) 2^ 2 +(1, 0) 2^ 4 +(1, 0) 2^ 6 +(1, 0) 2^ 8 +(1, 0) 2^ 10 +(1, 0) 2^ 12 +(1, 0) 2^ 14 +(1, 0) 4^ 2 +(1, 0) 4^ 4 +(1, 0) 4^ 6 +(1, 0) 4^ 8 +(1, 0) 4^ 10 +(1, 0) 4^ 12 +(1, 0) 4^ 14 +(1, 0) 6^ 2 +(1, 0) 6^ 4 +(1, 0) 6^ 6 +(1, 0) 6^ 8 +(1, 0) 6^ 10 +(1, 0) 6^ 12 +(1, 0) 6^ 14 +(1, 0) 8^ 2 +(1, 0) 8^ 4 +(1, 0) 8^ 6 +(1, 0) 8^ 8 +(1, 0) 8^ 10 +(1, 0) 8^ 12 +(1, 0) 8^ 14 +(1, 0) 10^ 2 +(1, 0) 10^ 4 +(1, 0) 10^ 6 +(1, 0) 10^ 8 +(1, 0) 10^ 10 +(1, 0) 10^ 12 +(1, 0) 10^ 14 +(1, 0) 12^ 2 +(1, 0) 12^ 4 +(1, 0) 12^ 6 +(1, 0) 12^ 8 +(1, 0) 12^ 10 +(1, 0) 12^ 12 +(1, 0) 12^ 14 +(1, 0) 14^ 2 +(1, 0) 14^ 4 +(1, 0) 14^ 6 +(1, 0) 14^ 8 +(1, 0) 14^ 10 +(1, 0) 14^ 12 +(1, 0) 14^ 14 +(1, 0) 2^ 2 0 0 +(1, 0) 4^ 4 2^ 2 +(1, 0) 6^ 6 4^ 4 +(1, 0) 8^ 8 6^ 6 +(1, 0) 10^ 10 8^ 8 +(1, 0) 12^ 12 10^ 10 +(1, 0) 14^ 14 12^ 12 diff --git a/benchmark/fham/fermi-hubbard-16.fham b/benchmark/fham/fermi-hubbard-16.fham new file mode 100644 index 000000000..9cc171703 --- /dev/null +++ b/benchmark/fham/fermi-hubbard-16.fham @@ -0,0 +1,136 @@ +(1, 0) 1^ 1 +(1, 0) 1^ 3 +(1, 0) 1^ 5 +(1, 0) 1^ 7 +(1, 0) 1^ 9 +(1, 0) 1^ 11 +(1, 0) 1^ 13 +(1, 0) 1^ 15 +(1, 0) 3^ 1 +(1, 0) 3^ 3 +(1, 0) 3^ 5 +(1, 0) 3^ 7 +(1, 0) 3^ 9 +(1, 0) 3^ 11 +(1, 0) 3^ 13 +(1, 0) 3^ 15 +(1, 0) 5^ 1 +(1, 0) 5^ 3 +(1, 0) 5^ 5 +(1, 0) 5^ 7 +(1, 0) 5^ 9 +(1, 0) 5^ 11 +(1, 0) 5^ 13 +(1, 0) 5^ 15 +(1, 0) 7^ 1 +(1, 0) 7^ 3 +(1, 0) 7^ 5 +(1, 0) 7^ 7 +(1, 0) 7^ 9 +(1, 0) 7^ 11 +(1, 0) 7^ 13 +(1, 0) 7^ 15 +(1, 0) 9^ 1 +(1, 0) 9^ 3 +(1, 0) 9^ 5 +(1, 0) 9^ 7 +(1, 0) 9^ 9 +(1, 0) 9^ 11 +(1, 0) 9^ 13 +(1, 0) 9^ 15 +(1, 0) 11^ 1 +(1, 0) 11^ 3 +(1, 0) 11^ 5 +(1, 0) 11^ 7 +(1, 0) 11^ 9 +(1, 0) 11^ 11 +(1, 0) 11^ 13 +(1, 0) 11^ 15 +(1, 0) 13^ 1 +(1, 0) 13^ 3 +(1, 0) 13^ 5 +(1, 0) 13^ 7 +(1, 0) 13^ 9 +(1, 0) 13^ 11 +(1, 0) 13^ 13 +(1, 0) 13^ 15 +(1, 0) 15^ 1 +(1, 0) 15^ 3 +(1, 0) 15^ 5 +(1, 0) 15^ 7 +(1, 0) 15^ 9 +(1, 0) 15^ 11 +(1, 0) 15^ 13 +(1, 0) 15^ 15 +(1, 0) 2^ 2 +(1, 0) 2^ 4 +(1, 0) 2^ 6 +(1, 0) 2^ 8 +(1, 0) 2^ 10 +(1, 0) 2^ 12 +(1, 0) 2^ 14 +(1, 0) 2^ 16 +(1, 0) 4^ 2 +(1, 0) 4^ 4 +(1, 0) 4^ 6 +(1, 0) 4^ 8 +(1, 0) 4^ 10 +(1, 0) 4^ 12 +(1, 0) 4^ 14 +(1, 0) 4^ 16 +(1, 0) 6^ 2 +(1, 0) 6^ 4 +(1, 0) 6^ 6 +(1, 0) 6^ 8 +(1, 0) 6^ 10 +(1, 0) 6^ 12 +(1, 0) 6^ 14 +(1, 0) 6^ 16 +(1, 0) 8^ 2 +(1, 0) 8^ 4 +(1, 0) 8^ 6 +(1, 0) 8^ 8 +(1, 0) 8^ 10 +(1, 0) 8^ 12 +(1, 0) 8^ 14 +(1, 0) 8^ 16 +(1, 0) 10^ 2 +(1, 0) 10^ 4 +(1, 0) 10^ 6 +(1, 0) 10^ 8 +(1, 0) 10^ 10 +(1, 0) 10^ 12 +(1, 0) 10^ 14 +(1, 0) 10^ 16 +(1, 0) 12^ 2 +(1, 0) 12^ 4 +(1, 0) 12^ 6 +(1, 0) 12^ 8 +(1, 0) 12^ 10 +(1, 0) 12^ 12 +(1, 0) 12^ 14 +(1, 0) 12^ 16 +(1, 0) 14^ 2 +(1, 0) 14^ 4 +(1, 0) 14^ 6 +(1, 0) 14^ 8 +(1, 0) 14^ 10 +(1, 0) 14^ 12 +(1, 0) 14^ 14 +(1, 0) 14^ 16 +(1, 0) 16^ 2 +(1, 0) 16^ 4 +(1, 0) 16^ 6 +(1, 0) 16^ 8 +(1, 0) 16^ 10 +(1, 0) 16^ 12 +(1, 0) 16^ 14 +(1, 0) 16^ 16 +(1, 0) 2^ 2 0 0 +(1, 0) 4^ 4 2^ 2 +(1, 0) 6^ 6 4^ 4 +(1, 0) 8^ 8 6^ 6 +(1, 0) 10^ 10 8^ 8 +(1, 0) 12^ 12 10^ 10 +(1, 0) 14^ 14 12^ 12 +(1, 0) 16^ 16 14^ 14 diff --git a/benchmark/fham/fermi-hubbard-18.fham b/benchmark/fham/fermi-hubbard-18.fham new file mode 100644 index 000000000..334d63b48 --- /dev/null +++ b/benchmark/fham/fermi-hubbard-18.fham @@ -0,0 +1,171 @@ +(1, 0) 1^ 1 +(1, 0) 1^ 3 +(1, 0) 1^ 5 +(1, 0) 1^ 7 +(1, 0) 1^ 9 +(1, 0) 1^ 11 +(1, 0) 1^ 13 +(1, 0) 1^ 15 +(1, 0) 1^ 17 +(1, 0) 3^ 1 +(1, 0) 3^ 3 +(1, 0) 3^ 5 +(1, 0) 3^ 7 +(1, 0) 3^ 9 +(1, 0) 3^ 11 +(1, 0) 3^ 13 +(1, 0) 3^ 15 +(1, 0) 3^ 17 +(1, 0) 5^ 1 +(1, 0) 5^ 3 +(1, 0) 5^ 5 +(1, 0) 5^ 7 +(1, 0) 5^ 9 +(1, 0) 5^ 11 +(1, 0) 5^ 13 +(1, 0) 5^ 15 +(1, 0) 5^ 17 +(1, 0) 7^ 1 +(1, 0) 7^ 3 +(1, 0) 7^ 5 +(1, 0) 7^ 7 +(1, 0) 7^ 9 +(1, 0) 7^ 11 +(1, 0) 7^ 13 +(1, 0) 7^ 15 +(1, 0) 7^ 17 +(1, 0) 9^ 1 +(1, 0) 9^ 3 +(1, 0) 9^ 5 +(1, 0) 9^ 7 +(1, 0) 9^ 9 +(1, 0) 9^ 11 +(1, 0) 9^ 13 +(1, 0) 9^ 15 +(1, 0) 9^ 17 +(1, 0) 11^ 1 +(1, 0) 11^ 3 +(1, 0) 11^ 5 +(1, 0) 11^ 7 +(1, 0) 11^ 9 +(1, 0) 11^ 11 +(1, 0) 11^ 13 +(1, 0) 11^ 15 +(1, 0) 11^ 17 +(1, 0) 13^ 1 +(1, 0) 13^ 3 +(1, 0) 13^ 5 +(1, 0) 13^ 7 +(1, 0) 13^ 9 +(1, 0) 13^ 11 +(1, 0) 13^ 13 +(1, 0) 13^ 15 +(1, 0) 13^ 17 +(1, 0) 15^ 1 +(1, 0) 15^ 3 +(1, 0) 15^ 5 +(1, 0) 15^ 7 +(1, 0) 15^ 9 +(1, 0) 15^ 11 +(1, 0) 15^ 13 +(1, 0) 15^ 15 +(1, 0) 15^ 17 +(1, 0) 17^ 1 +(1, 0) 17^ 3 +(1, 0) 17^ 5 +(1, 0) 17^ 7 +(1, 0) 17^ 9 +(1, 0) 17^ 11 +(1, 0) 17^ 13 +(1, 0) 17^ 15 +(1, 0) 17^ 17 +(1, 0) 2^ 2 +(1, 0) 2^ 4 +(1, 0) 2^ 6 +(1, 0) 2^ 8 +(1, 0) 2^ 10 +(1, 0) 2^ 12 +(1, 0) 2^ 14 +(1, 0) 2^ 16 +(1, 0) 2^ 18 +(1, 0) 4^ 2 +(1, 0) 4^ 4 +(1, 0) 4^ 6 +(1, 0) 4^ 8 +(1, 0) 4^ 10 +(1, 0) 4^ 12 +(1, 0) 4^ 14 +(1, 0) 4^ 16 +(1, 0) 4^ 18 +(1, 0) 6^ 2 +(1, 0) 6^ 4 +(1, 0) 6^ 6 +(1, 0) 6^ 8 +(1, 0) 6^ 10 +(1, 0) 6^ 12 +(1, 0) 6^ 14 +(1, 0) 6^ 16 +(1, 0) 6^ 18 +(1, 0) 8^ 2 +(1, 0) 8^ 4 +(1, 0) 8^ 6 +(1, 0) 8^ 8 +(1, 0) 8^ 10 +(1, 0) 8^ 12 +(1, 0) 8^ 14 +(1, 0) 8^ 16 +(1, 0) 8^ 18 +(1, 0) 10^ 2 +(1, 0) 10^ 4 +(1, 0) 10^ 6 +(1, 0) 10^ 8 +(1, 0) 10^ 10 +(1, 0) 10^ 12 +(1, 0) 10^ 14 +(1, 0) 10^ 16 +(1, 0) 10^ 18 +(1, 0) 12^ 2 +(1, 0) 12^ 4 +(1, 0) 12^ 6 +(1, 0) 12^ 8 +(1, 0) 12^ 10 +(1, 0) 12^ 12 +(1, 0) 12^ 14 +(1, 0) 12^ 16 +(1, 0) 12^ 18 +(1, 0) 14^ 2 +(1, 0) 14^ 4 +(1, 0) 14^ 6 +(1, 0) 14^ 8 +(1, 0) 14^ 10 +(1, 0) 14^ 12 +(1, 0) 14^ 14 +(1, 0) 14^ 16 +(1, 0) 14^ 18 +(1, 0) 16^ 2 +(1, 0) 16^ 4 +(1, 0) 16^ 6 +(1, 0) 16^ 8 +(1, 0) 16^ 10 +(1, 0) 16^ 12 +(1, 0) 16^ 14 +(1, 0) 16^ 16 +(1, 0) 16^ 18 +(1, 0) 18^ 2 +(1, 0) 18^ 4 +(1, 0) 18^ 6 +(1, 0) 18^ 8 +(1, 0) 18^ 10 +(1, 0) 18^ 12 +(1, 0) 18^ 14 +(1, 0) 18^ 16 +(1, 0) 18^ 18 +(1, 0) 2^ 2 0 0 +(1, 0) 4^ 4 2^ 2 +(1, 0) 6^ 6 4^ 4 +(1, 0) 8^ 8 6^ 6 +(1, 0) 10^ 10 8^ 8 +(1, 0) 12^ 12 10^ 10 +(1, 0) 14^ 14 12^ 12 +(1, 0) 16^ 16 14^ 14 +(1, 0) 18^ 18 16^ 16 diff --git a/benchmark/fham/fermi-hubbard-4.fham b/benchmark/fham/fermi-hubbard-4.fham new file mode 100644 index 000000000..c79db97fb --- /dev/null +++ b/benchmark/fham/fermi-hubbard-4.fham @@ -0,0 +1,10 @@ +(1, 0) 1^ 1 +(1, 0) 1^ 3 +(1, 0) 3^ 1 +(1, 0) 3^ 3 +(1, 0) 2^ 2 +(1, 0) 2^ 4 +(1, 0) 4^ 2 +(1, 0) 4^ 4 +(1, 0) 2^ 2 1^ 1 +(1, 0) 4^ 4 3^ 3 diff --git a/benchmark/fham/fermi-hubbard-6.fham b/benchmark/fham/fermi-hubbard-6.fham new file mode 100644 index 000000000..f7b6af697 --- /dev/null +++ b/benchmark/fham/fermi-hubbard-6.fham @@ -0,0 +1,21 @@ +(1, 0) 1^ 1 +(1, 0) 1^ 3 +(1, 0) 1^ 5 +(1, 0) 3^ 1 +(1, 0) 3^ 3 +(1, 0) 3^ 5 +(1, 0) 5^ 1 +(1, 0) 5^ 3 +(1, 0) 5^ 5 +(1, 0) 2^ 2 +(1, 0) 2^ 4 +(1, 0) 2^ 6 +(1, 0) 4^ 2 +(1, 0) 4^ 4 +(1, 0) 4^ 6 +(1, 0) 6^ 2 +(1, 0) 6^ 4 +(1, 0) 6^ 6 +(1, 0) 2^ 2 1^ 1 +(1, 0) 4^ 4 3^ 3 +(1, 0) 6^ 6 5^ 5 diff --git a/benchmark/fham/fermi-hubbard-8.fham b/benchmark/fham/fermi-hubbard-8.fham new file mode 100644 index 000000000..e5150f463 --- /dev/null +++ b/benchmark/fham/fermi-hubbard-8.fham @@ -0,0 +1,28 @@ +(1, 0) 1 3^ +(1, 0) 1^ 3 +(1, 0) 1 5^ +(1, 0) 1^ 5 +(1, 0) 5 7^ +(1, 0) 5^ 7 +(1, 0) 3 7^ +(1, 0) 3^ 7 +(1, 0) 1 1^ +(1, 0) 3 3^ +(1, 0) 5 5^ +(1, 0) 7 7^ +(1, 0) 2 4^ +(1, 0) 2^ 4 +(1, 0) 2 6^ +(1, 0) 2^ 6 +(1, 0) 6 8^ +(1, 0) 6^ 8 +(1, 0) 4 8^ +(1, 0) 4^ 8 +(1, 0) 2 2^ +(1, 0) 4 4^ +(1, 0) 6 6^ +(1, 0) 8 8^ +(1, 0) 1 1^ 2 2^ +(1, 0) 3 3^ 4 4^ +(1, 0) 5 5^ 6 6^ +(1, 0) 7 7^ 8 8^ diff --git a/benchmark/topology/2n_8.layout b/benchmark/topology/2n_8.layout index 5549e5a23..4fde40b1d 100644 --- a/benchmark/topology/2n_8.layout +++ b/benchmark/topology/2n_8.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1, 2], [0, 3], [0, 3, 4], [1, 2, 5], [2, 5, 6], [3, 4, 7], [4, 7], [5, 6]] SGERROR: [0, 0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1, 2], [0, 3], [0, 3, 4], [1, 2, 5], [2, 5, 6], [3, 4, 7], [4, 7], [5, 6]] -CNOTTIME: [[1, 2], [0, 3], [0, 3, 4], [1, 2, 5], [2, 5, 6], [3, 4, 7], [4, 7], [5, 6]] +CNOTERROR: [[0, 0], [0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0], [0, 0]] +CNOTTIME: [[0, 0], [0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0], [0, 0]] diff --git a/benchmark/topology/brooklyn_65.layout b/benchmark/topology/brooklyn_65.layout index 252f49ca8..7f08a96e8 100644 --- a/benchmark/topology/brooklyn_65.layout +++ b/benchmark/topology/brooklyn_65.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1, 10], [0, 2], [1, 3], [2, 4], [3, 5, 11], [4, 6], [5, 7], [6, 8], [7, 9, 12], [8], [0, 13], [4, 17], [8, 21], [10, 14], [13, 15], [14, 16, 24], [15, 17], [11, 16, 18], [17, 19], [18, 20, 25], [19, 21], [12, 20, 22], [21, 23], [22, 26], [15, 29], [19, 33], [23, 37], [28, 38], [27, 29], [24, 28, 30], [29, 31], [30, 32, 39], [31, 33], [25, 32, 34], [33, 35], [34, 36, 40], [35, 37], [26, 36], [27, 41], [31, 45], [35, 49], [38, 42], [41, 43], [42, 44, 52], [43, 45], [39, 44, 46], [45, 47], [46, 48, 53], [47, 49], [40, 48, 50], [49, 51], [50, 54], [43, 56], [47, 60], [51, 64], [56], [52, 55, 57], [56, 58], [57, 59], [58, 60], [53, 59, 61], [60, 62], [61, 63], [62, 64], [54, 6]] SGERROR: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1, 10], [0, 2], [1, 3], [2, 4], [3, 5, 11], [4, 6], [5, 7], [6, 8], [7, 9, 12], [8], [0, 13], [4, 17], [8, 21], [10, 14], [13, 15], [14, 16, 24], [15, 17], [11, 16, 18], [17, 19], [18, 20, 25], [19, 21], [12, 20, 22], [21, 23], [22, 26], [15, 29], [19, 33], [23, 37], [28, 38], [27, 29], [24, 28, 30], [29, 31], [30, 32, 39], [31, 33], [25, 32, 34], [33, 35], [34, 36, 40], [35, 37], [26, 36], [27, 41], [31, 45], [35, 49], [38, 42], [41, 43], [42, 44, 52], [43, 45], [39, 44, 46], [45, 47], [46, 48, 53], [47, 49], [40, 48, 50], [49, 51], [50, 54], [43, 56], [47, 60], [51, 64], [56], [52, 55, 57], [56, 58], [57, 59], [58, 60], [53, 59, 61], [60, 62], [61, 63], [62, 64], [54, 6]] -CNOTTIME: [[1, 10], [0, 2], [1, 3], [2, 4], [3, 5, 11], [4, 6], [5, 7], [6, 8], [7, 9, 12], [8], [0, 13], [4, 17], [8, 21], [10, 14], [13, 15], [14, 16, 24], [15, 17], [11, 16, 18], [17, 19], [18, 20, 25], [19, 21], [12, 20, 22], [21, 23], [22, 26], [15, 29], [19, 33], [23, 37], [28, 38], [27, 29], [24, 28, 30], [29, 31], [30, 32, 39], [31, 33], [25, 32, 34], [33, 35], [34, 36, 40], [35, 37], [26, 36], [27, 41], [31, 45], [35, 49], [38, 42], [41, 43], [42, 44, 52], [43, 45], [39, 44, 46], [45, 47], [46, 48, 53], [47, 49], [40, 48, 50], [49, 51], [50, 54], [43, 56], [47, 60], [51, 64], [56], [52, 55, 57], [56, 58], [57, 59], [58, 60], [53, 59, 61], [60, 62], [61, 63], [62, 64], [54, 6]] +CNOTERROR: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] +CNOTTIME: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] diff --git a/benchmark/topology/casablanca.layout b/benchmark/topology/casablanca.layout index 47a479735..23bb0a75f 100644 --- a/benchmark/topology/casablanca.layout +++ b/benchmark/topology/casablanca.layout @@ -1,10 +1,10 @@ -// The device of Casablanca -NAME: ibmq_casablanca -QUBITNUM: 7 -GATESET: {x, rz, h, id, sx, cnot} -COUPLINGMAP: [[1], [0,2,3], [1], [1,5], [5], [3,4,6], [5]] -SGERROR: [3e-3, 4e-3, 5e-3, 3e-3, 4e-3, 5e-3, 3e-3] -SGTIME: [3e-3, 4e-3, 5e-3, 3e-3, 4e-3, 5e-3, 3e-3] -CNOTERROR: [[1], [0,2,3], [1], [1,5], [5], [3,4,6], [5]] -// in nanosecond -CNOTTIME: [[1], [0,2,3], [1], [1,5], [5], [3,4,6], [5]] +// The device of Casablanca +NAME: ibmq_casablanca +QUBITNUM: 7 +GATESET: {x, rz, h, id, sx, cnot} +COUPLINGMAP: [[1], [0,2,3], [1], [1,5], [5], [3,4,6], [5]] +SGERROR: [3e-3, 4e-3, 5e-3, 3e-3, 4e-3, 5e-3, 3e-3] +SGTIME: [3e-3, 4e-3, 5e-3, 3e-3, 4e-3, 5e-3, 3e-3] +CNOTERROR: [[0], [0, 0, 0], [0], [0, 0], [0], [0, 0, 0], [0]] +// in nanosecond +CNOTTIME: [[0], [0, 0, 0], [0], [0, 0], [0], [0, 0, 0], [0]] diff --git a/benchmark/topology/example.layout b/benchmark/topology/example.layout index 8b0dd06c5..a002d04e0 100644 --- a/benchmark/topology/example.layout +++ b/benchmark/topology/example.layout @@ -1,14 +1,14 @@ -// The device of example_topology -NAME: example_topology //The comma has to exist -QUBITNUM: 3 -GATESET: {x, rz, h, id, sx, cnot} -// 裡面那層也由小到大 -COUPLINGMAP: [[ 1 ] ,[ 0 , 2], [ 1 ]] -// The order of the following items isn't fixed -// Single Gate Error -SGERROR: [3e-3, 4e-3, 5e-3] -// in nanosecond -SGTIME: [5e-3, 4.5e-3, 5e-3] -CNOTERROR: [[1e-2],[1e-2, 5e-3],[5e-3]] -// in nanosecond -CNOTTIME: [[70],[70, 60],[60]] +// The device of example_topology +NAME: example_topology //The comma has to exist +QUBITNUM: 3 +GATESET: {x, rz, h, id, sx, cnot} +// the inner list is in increasing order +COUPLINGMAP: [[ 1 ] ,[ 0 , 2], [ 1 ]] +// The order of the following items isn't fixed +// Single Gate Error +SGERROR: [3e-3, 4e-3, 5e-3] +// in nanosecond +SGTIME: [5e-3, 4.5e-3, 5e-3] +CNOTERROR: [[1e-2],[1e-2, 5e-3],[5e-3]] +// in nanosecond +CNOTTIME: [[0], [0, 0], [0]] diff --git a/benchmark/topology/guadalupe_16.layout b/benchmark/topology/guadalupe_16.layout index b3959a617..c7bd8cac2 100644 --- a/benchmark/topology/guadalupe_16.layout +++ b/benchmark/topology/guadalupe_16.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1], [0, 2, 4], [1, 3], [2, 5], [1, 7], [3, 8], [7], [4, 6, 10], [5, 9, 11], [8], [7, 12], [8, 14], [10, 13, 15], [12, 14], [11, 13], [1]] SGERROR: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1], [0, 2, 4], [1, 3], [2, 5], [1, 7], [3, 8], [7], [4, 6, 10], [5, 9, 11], [8], [7, 12], [8, 14], [10, 13, 15], [12, 14], [11, 13], [1]] -CNOTTIME: [[1], [0, 2, 4], [1, 3], [2, 5], [1, 7], [3, 8], [7], [4, 6, 10], [5, 9, 11], [8], [7, 12], [8, 14], [10, 13, 15], [12, 14], [11, 13], [1]] +CNOTERROR: [[0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0]] +CNOTTIME: [[0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0]] diff --git a/benchmark/topology/ithaca.layout b/benchmark/topology/ithaca.layout index c86d09023..1eee48546 100644 --- a/benchmark/topology/ithaca.layout +++ b/benchmark/topology/ithaca.layout @@ -1,7 +1,7 @@ NAME: ibm_ithaca QUBITNUM: 65 GATESET: {CX, ID, RZ, SX, X} -// 裡面那層也由小到大 +// the inner list is in increasing order COUPLINGMAP: [[1, 10], [0, 2], [1, 3], [2, 4], [3, 5, 11], [4, 6], [5, 7], [6, 8], [7, 9, 12], [8], [0, 13], [4, 17], [8, 21], [10, 14], [13, 15], [14, 16, 24], [15, 17], [11, 16, 18], [17, 19], [18, 20, 25], [19, 21], [12, 20, 22], [21, 23], [22, 26], [15, 29], [19, 33], [23, 37], [28, 38], [27, 29], [24, 28, 30], [29, 31], [30, 32, 39], [31, 33], [25, 32, 34], [33, 35], [34, 36, 40], [35, 37], [26, 36], [27, 41], [31, 45], [35, 49], [38, 42], [41, 43], [42, 44, 52], [43, 45], [39, 44, 46], [45, 47], [46, 48, 53], [47, 49], [40, 48, 50], [49, 51], [50, 54], [43, 56], [47, 60], [51, 64], [56], [52, 55, 57], [56, 58], [57, 59], [58, 60], [53, 59, 61], [60, 62], [61, 63], [62, 64], [54, 63]] // Single Gate Error SGERROR: [3.0e-04, 1.6e-04, 3.6e-04, 4.0e-04, 2.1e-04, 2.8e-04, 1.7e-04, 2.7e-04, 1.8e-04, 4.7e-04, 2.1e-04, 0.00146, 3.9e-04, 3.8e-04, 1.9e-04, 2.3e-04, 1.8e-04, 3.2e-04, 1.6e-04, 5.1e-04, 0.00242, 2.2e-04, 1.4e-04, 7.7e-04, 1.5e-04, 2.4e-04, 2.7e-04, 0.01, 1.4e-04, 3.0e-04, 1.4e-04, 2.0e-04, 2.1e-04, 2.5e-04, 3.8e-04, 4.1e-04, 2.3e-04, 2.4e-04, 2.3e-04, 3.7e-04, 3.5e-04, 5.0e-04, 3.5e-04, 2.1e-04, 2.8e-04, 1.7e-04, 2.7e-04, 1.8e-04, 4.7e-04, 2.1e-04, 0.00146, 3.9e-04, 3.8e-04, 1.9e-04, 2.3e-04, 1.8e-04, 3.2e-04, 1.6e-04, 5.1e-04, 0.00242, 2.2e-04, 1.4e-04, 7.7e-04, 2.7e-04, 1.8e-04] diff --git a/benchmark/topology/kolkata_27.layout b/benchmark/topology/kolkata_27.layout index 72565a334..9c282711e 100644 --- a/benchmark/topology/kolkata_27.layout +++ b/benchmark/topology/kolkata_27.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1], [0, 2, 4], [1, 3], [2, 5], [1, 7], [3, 8], [7], [4, 6, 10], [5, 9, 11], [8], [7, 12], [8, 14], [10, 13, 15], [12, 14], [11, 13, 16], [12, 18], [14, 19], [18], [15, 17, 21], [16, 20, 22], [19], [18, 23], [19, 25], [21, 24], [23, 25], [22, 24, 26], [2]] SGERROR: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1], [0, 2, 4], [1, 3], [2, 5], [1, 7], [3, 8], [7], [4, 6, 10], [5, 9, 11], [8], [7, 12], [8, 14], [10, 13, 15], [12, 14], [11, 13, 16], [12, 18], [14, 19], [18], [15, 17, 21], [16, 20, 22], [19], [18, 23], [19, 25], [21, 24], [23, 25], [22, 24, 26], [2]] -CNOTTIME: [[1], [0, 2, 4], [1, 3], [2, 5], [1, 7], [3, 8], [7], [4, 6, 10], [5, 9, 11], [8], [7, 12], [8, 14], [10, 13, 15], [12, 14], [11, 13, 16], [12, 18], [14, 19], [18], [15, 17, 21], [16, 20, 22], [19], [18, 23], [19, 25], [21, 24], [23, 25], [22, 24, 26], [2]] +CNOTERROR: [[0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0]] +CNOTTIME: [[0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0]] diff --git a/benchmark/topology/linear_5.layout b/benchmark/topology/linear_5.layout index d75aa274c..df5ca1b95 100644 --- a/benchmark/topology/linear_5.layout +++ b/benchmark/topology/linear_5.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1], [0, 2], [1, 3], [2, 4], [3]] SGERROR: [0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0] -CNOTERROR: [[1], [0, 2], [1, 3], [2, 4], [3]] -CNOTTIME: [[1], [0, 2], [1, 3], [2, 4], [3]] +CNOTERROR: [[0], [0, 0], [0, 0], [0, 0], [0]] +CNOTTIME: [[0], [0, 0], [0, 0], [0, 0], [0]] diff --git a/benchmark/topology/linear_6.layout b/benchmark/topology/linear_6.layout index 5c09c3be3..088084895 100644 --- a/benchmark/topology/linear_6.layout +++ b/benchmark/topology/linear_6.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1], [0, 2], [1, 3], [2, 4], [3, 5], [4]] SGERROR: [0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0] -CNOTERROR: [[1], [0, 2], [1, 3], [2, 4], [3, 5], [4]] -CNOTTIME: [[1], [0, 2], [1, 3], [2, 4], [3, 5], [4]] +CNOTERROR: [[0], [0, 0], [0, 0], [0, 0], [0, 0], [0]] +CNOTTIME: [[0], [0, 0], [0, 0], [0, 0], [0, 0], [0]] diff --git a/benchmark/topology/perth_7.layout b/benchmark/topology/perth_7.layout index 1873d55d2..f818631f0 100644 --- a/benchmark/topology/perth_7.layout +++ b/benchmark/topology/perth_7.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1], [0, 2, 3], [1], [1, 5], [5], [3, 4, 6], [5]] SGERROR: [0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1], [0, 2, 3], [1], [1, 5], [5], [3, 4, 6], [5]] -CNOTTIME: [[1], [0, 2, 3], [1], [1, 5], [5], [3, 4, 6], [5]] +CNOTERROR: [[0], [0, 0, 0], [0], [0, 0], [0], [0, 0, 0], [0]] +CNOTTIME: [[0], [0, 0, 0], [0], [0, 0], [0], [0, 0, 0], [0]] diff --git a/benchmark/topology/quito_5.layout b/benchmark/topology/quito_5.layout index a7743011b..c42e2e596 100644 --- a/benchmark/topology/quito_5.layout +++ b/benchmark/topology/quito_5.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1], [0, 2, 3], [1], [1, 4], [3]] SGERROR: [0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0] -CNOTERROR: [[1], [0, 2, 3], [1], [1, 4], [3]] -CNOTTIME: [[1], [0, 2, 3], [1], [1, 4], [3]] +CNOTERROR: [[0], [0, 0, 0], [0], [0, 0], [0]] +CNOTTIME: [[0], [0, 0, 0], [0], [0, 0], [0]] diff --git a/benchmark/topology/tokyo_20.layout b/benchmark/topology/tokyo_20.layout index 741f4fb09..85268f6ad 100644 --- a/benchmark/topology/tokyo_20.layout +++ b/benchmark/topology/tokyo_20.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1, 5], [0, 2, 6, 7], [1, 3, 6, 7], [2, 4, 8, 9], [3, 8, 9], [0, 6, 10, 11], [1, 2, 5, 7, 10, 11], [1, 2, 6, 8, 12, 13], [3, 4, 7, 9, 12, 13], [3, 4, 8, 14], [5, 6, 11, 15], [5, 6, 10, 12, 16, 17], [7, 8, 11, 13, 16, 17], [7, 8, 12, 14, 18, 19], [9, 13, 18, 19], [10, 16], [11, 12, 15, 17], [11, 12, 16, 18], [13, 14, 17, 19], [13, 14, 1]] SGERROR: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1, 5], [0, 2, 6, 7], [1, 3, 6, 7], [2, 4, 8, 9], [3, 8, 9], [0, 6, 10, 11], [1, 2, 5, 7, 10, 11], [1, 2, 6, 8, 12, 13], [3, 4, 7, 9, 12, 13], [3, 4, 8, 14], [5, 6, 11, 15], [5, 6, 10, 12, 16, 17], [7, 8, 11, 13, 16, 17], [7, 8, 12, 14, 18, 19], [9, 13, 18, 19], [10, 16], [11, 12, 15, 17], [11, 12, 16, 18], [13, 14, 17, 19], [13, 14, 1]] -CNOTTIME: [[1, 5], [0, 2, 6, 7], [1, 3, 6, 7], [2, 4, 8, 9], [3, 8, 9], [0, 6, 10, 11], [1, 2, 5, 7, 10, 11], [1, 2, 6, 8, 12, 13], [3, 4, 7, 9, 12, 13], [3, 4, 8, 14], [5, 6, 11, 15], [5, 6, 10, 12, 16, 17], [7, 8, 11, 13, 16, 17], [7, 8, 12, 14, 18, 19], [9, 13, 18, 19], [10, 16], [11, 12, 15, 17], [11, 12, 16, 18], [13, 14, 17, 19], [13, 14, 1]] +CNOTERROR: [[0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0], [0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0]] +CNOTTIME: [[0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0], [0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0]] diff --git a/benchmark/topology/topo_1121.layout b/benchmark/topology/topo_1121.layout index 74ece2a16..1d78f6f19 100644 --- a/benchmark/topology/topo_1121.layout +++ b/benchmark/topology/topo_1121.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1, 42], [0, 2], [1, 3], [2, 4], [3, 5, 43], [4, 6], [5, 7], [6, 8], [7, 9, 44], [8, 10], [9, 11], [10, 12], [11, 13, 45], [12, 14], [13, 15], [14, 16], [15, 17, 46], [16, 18], [17, 19], [18, 20], [19, 21, 47], [20, 22], [21, 23], [22, 24], [23, 25, 48], [24, 26], [25, 27], [26, 28], [27, 29, 49], [28, 30], [29, 31], [30, 32], [31, 33, 50], [32, 34], [33, 35], [34, 36], [35, 37, 51], [36, 38], [37, 39], [38, 40], [39, 41, 52], [40], [0, 53], [4, 57], [8, 61], [12, 65], [16, 69], [20, 73], [24, 77], [28, 81], [32, 85], [36, 89], [40, 93], [42, 54], [53, 55], [54, 56, 96], [55, 57], [43, 56, 58], [57, 59], [58, 60, 97], [59, 61], [44, 60, 62], [61, 63], [62, 64, 98], [63, 65], [45, 64, 66], [65, 67], [66, 68, 99], [67, 69], [46, 68, 70], [69, 71], [70, 72, 100], [71, 73], [47, 72, 74], [73, 75], [74, 76, 101], [75, 77], [48, 76, 78], [77, 79], [78, 80, 102], [79, 81], [49, 80, 82], [81, 83], [82, 84, 103], [83, 85], [50, 84, 86], [85, 87], [86, 88, 104], [87, 89], [51, 88, 90], [89, 91], [90, 92, 105], [91, 93], [52, 92, 94], [93, 95], [94, 106], [55, 109], [59, 113], [63, 117], [67, 121], [71, 125], [75, 129], [79, 133], [83, 137], [87, 141], [91, 145], [95, 149], [108, 150], [107, 109], [96, 108, 110], [109, 111], [110, 112, 151], [111, 113], [97, 112, 114], [113, 115], [114, 116, 152], [115, 117], [98, 116, 118], [117, 119], [118, 120, 153], [119, 121], [99, 120, 122], [121, 123], [122, 124, 154], [123, 125], [100, 124, 126], [125, 127], [126, 128, 155], [127, 129], [101, 128, 130], [129, 131], [130, 132, 156], [131, 133], [102, 132, 134], [133, 135], [134, 136, 157], [135, 137], [103, 136, 138], [137, 139], [138, 140, 158], [139, 141], [104, 140, 142], [141, 143], [142, 144, 159], [143, 145], [105, 144, 146], [145, 147], [146, 148, 160], [147, 149], [106, 148], [107, 161], [111, 165], [115, 169], [119, 173], [123, 177], [127, 181], [131, 185], [135, 189], [139, 193], [143, 197], [147, 201], [150, 162], [161, 163], [162, 164, 204], [163, 165], [151, 164, 166], [165, 167], [166, 168, 205], [167, 169], [152, 168, 170], [169, 171], [170, 172, 206], [171, 173], [153, 172, 174], [173, 175], [174, 176, 207], [175, 177], [154, 176, 178], [177, 179], [178, 180, 208], [179, 181], [155, 180, 182], [181, 183], [182, 184, 209], [183, 185], [156, 184, 186], [185, 187], [186, 188, 210], [187, 189], [157, 188, 190], [189, 191], [190, 192, 211], [191, 193], [158, 192, 194], [193, 195], [194, 196, 212], [195, 197], [159, 196, 198], [197, 199], [198, 200, 213], [199, 201], [160, 200, 202], [201, 203], [202, 214], [163, 217], [167, 221], [171, 225], [175, 229], [179, 233], [183, 237], [187, 241], [191, 245], [195, 249], [199, 253], [203, 257], [216, 258], [215, 217], [204, 216, 218], [217, 219], [218, 220, 259], [219, 221], [205, 220, 222], [221, 223], [222, 224, 260], [223, 225], [206, 224, 226], [225, 227], [226, 228, 261], [227, 229], [207, 228, 230], [229, 231], [230, 232, 262], [231, 233], [208, 232, 234], [233, 235], [234, 236, 263], [235, 237], [209, 236, 238], [237, 239], [238, 240, 264], [239, 241], [210, 240, 242], [241, 243], [242, 244, 265], [243, 245], [211, 244, 246], [245, 247], [246, 248, 266], [247, 249], [212, 248, 250], [249, 251], [250, 252, 267], [251, 253], [213, 252, 254], [253, 255], [254, 256, 268], [255, 257], [214, 256], [215, 269], [219, 273], [223, 277], [227, 281], [231, 285], [235, 289], [239, 293], [243, 297], [247, 301], [251, 305], [255, 309], [258, 270], [269, 271], [270, 272, 312], [271, 273], [259, 272, 274], [273, 275], [274, 276, 313], [275, 277], [260, 276, 278], [277, 279], [278, 280, 314], [279, 281], [261, 280, 282], [281, 283], [282, 284, 315], [283, 285], [262, 284, 286], [285, 287], [286, 288, 316], [287, 289], [263, 288, 290], [289, 291], [290, 292, 317], [291, 293], [264, 292, 294], [293, 295], [294, 296, 318], [295, 297], [265, 296, 298], [297, 299], [298, 300, 319], [299, 301], [266, 300, 302], [301, 303], [302, 304, 320], [303, 305], [267, 304, 306], [305, 307], [306, 308, 321], [307, 309], [268, 308, 310], [309, 311], [310, 322], [271, 325], [275, 329], [279, 333], [283, 337], [287, 341], [291, 345], [295, 349], [299, 353], [303, 357], [307, 361], [311, 365], [324, 366], [323, 325], [312, 324, 326], [325, 327], [326, 328, 367], [327, 329], [313, 328, 330], [329, 331], [330, 332, 368], [331, 333], [314, 332, 334], [333, 335], [334, 336, 369], [335, 337], [315, 336, 338], [337, 339], [338, 340, 370], [339, 341], [316, 340, 342], [341, 343], [342, 344, 371], [343, 345], [317, 344, 346], [345, 347], [346, 348, 372], [347, 349], [318, 348, 350], [349, 351], [350, 352, 373], [351, 353], [319, 352, 354], [353, 355], [354, 356, 374], [355, 357], [320, 356, 358], [357, 359], [358, 360, 375], [359, 361], [321, 360, 362], [361, 363], [362, 364, 376], [363, 365], [322, 364], [323, 377], [327, 381], [331, 385], [335, 389], [339, 393], [343, 397], [347, 401], [351, 405], [355, 409], [359, 413], [363, 417], [366, 378], [377, 379], [378, 380, 420], [379, 381], [367, 380, 382], [381, 383], [382, 384, 421], [383, 385], [368, 384, 386], [385, 387], [386, 388, 422], [387, 389], [369, 388, 390], [389, 391], [390, 392, 423], [391, 393], [370, 392, 394], [393, 395], [394, 396, 424], [395, 397], [371, 396, 398], [397, 399], [398, 400, 425], [399, 401], [372, 400, 402], [401, 403], [402, 404, 426], [403, 405], [373, 404, 406], [405, 407], [406, 408, 427], [407, 409], [374, 408, 410], [409, 411], [410, 412, 428], [411, 413], [375, 412, 414], [413, 415], [414, 416, 429], [415, 417], [376, 416, 418], [417, 419], [418, 430], [379, 433], [383, 437], [387, 441], [391, 445], [395, 449], [399, 453], [403, 457], [407, 461], [411, 465], [415, 469], [419, 473], [432, 474], [431, 433], [420, 432, 434], [433, 435], [434, 436, 475], [435, 437], [421, 436, 438], [437, 439], [438, 440, 476], [439, 441], [422, 440, 442], [441, 443], [442, 444, 477], [443, 445], [423, 444, 446], [445, 447], [446, 448, 478], [447, 449], [424, 448, 450], [449, 451], [450, 452, 479], [451, 453], [425, 452, 454], [453, 455], [454, 456, 480], [455, 457], [426, 456, 458], [457, 459], [458, 460, 481], [459, 461], [427, 460, 462], [461, 463], [462, 464, 482], [463, 465], [428, 464, 466], [465, 467], [466, 468, 483], [467, 469], [429, 468, 470], [469, 471], [470, 472, 484], [471, 473], [430, 472], [431, 485], [435, 489], [439, 493], [443, 497], [447, 501], [451, 505], [455, 509], [459, 513], [463, 517], [467, 521], [471, 525], [474, 486], [485, 487], [486, 488, 528], [487, 489], [475, 488, 490], [489, 491], [490, 492, 529], [491, 493], [476, 492, 494], [493, 495], [494, 496, 530], [495, 497], [477, 496, 498], [497, 499], [498, 500, 531], [499, 501], [478, 500, 502], [501, 503], [502, 504, 532], [503, 505], [479, 504, 506], [505, 507], [506, 508, 533], [507, 509], [480, 508, 510], [509, 511], [510, 512, 534], [511, 513], [481, 512, 514], [513, 515], [514, 516, 535], [515, 517], [482, 516, 518], [517, 519], [518, 520, 536], [519, 521], [483, 520, 522], [521, 523], [522, 524, 537], [523, 525], [484, 524, 526], [525, 527], [526, 538], [487, 541], [491, 545], [495, 549], [499, 553], [503, 557], [507, 561], [511, 565], [515, 569], [519, 573], [523, 577], [527, 581], [540, 582], [539, 541], [528, 540, 542], [541, 543], [542, 544, 583], [543, 545], [529, 544, 546], [545, 547], [546, 548, 584], [547, 549], [530, 548, 550], [549, 551], [550, 552, 585], [551, 553], [531, 552, 554], [553, 555], [554, 556, 586], [555, 557], [532, 556, 558], [557, 559], [558, 560, 587], [559, 561], [533, 560, 562], [561, 563], [562, 564, 588], [563, 565], [534, 564, 566], [565, 567], [566, 568, 589], [567, 569], [535, 568, 570], [569, 571], [570, 572, 590], [571, 573], [536, 572, 574], [573, 575], [574, 576, 591], [575, 577], [537, 576, 578], [577, 579], [578, 580, 592], [579, 581], [538, 580], [539, 593], [543, 597], [547, 601], [551, 605], [555, 609], [559, 613], [563, 617], [567, 621], [571, 625], [575, 629], [579, 633], [582, 594], [593, 595], [594, 596, 636], [595, 597], [583, 596, 598], [597, 599], [598, 600, 637], [599, 601], [584, 600, 602], [601, 603], [602, 604, 638], [603, 605], [585, 604, 606], [605, 607], [606, 608, 639], [607, 609], [586, 608, 610], [609, 611], [610, 612, 640], [611, 613], [587, 612, 614], [613, 615], [614, 616, 641], [615, 617], [588, 616, 618], [617, 619], [618, 620, 642], [619, 621], [589, 620, 622], [621, 623], [622, 624, 643], [623, 625], [590, 624, 626], [625, 627], [626, 628, 644], [627, 629], [591, 628, 630], [629, 631], [630, 632, 645], [631, 633], [592, 632, 634], [633, 635], [634, 646], [595, 649], [599, 653], [603, 657], [607, 661], [611, 665], [615, 669], [619, 673], [623, 677], [627, 681], [631, 685], [635, 689], [648, 690], [647, 649], [636, 648, 650], [649, 651], [650, 652, 691], [651, 653], [637, 652, 654], [653, 655], [654, 656, 692], [655, 657], [638, 656, 658], [657, 659], [658, 660, 693], [659, 661], [639, 660, 662], [661, 663], [662, 664, 694], [663, 665], [640, 664, 666], [665, 667], [666, 668, 695], [667, 669], [641, 668, 670], [669, 671], [670, 672, 696], [671, 673], [642, 672, 674], [673, 675], [674, 676, 697], [675, 677], [643, 676, 678], [677, 679], [678, 680, 698], [679, 681], [644, 680, 682], [681, 683], [682, 684, 699], [683, 685], [645, 684, 686], [685, 687], [686, 688, 700], [687, 689], [646, 688], [647, 701], [651, 705], [655, 709], [659, 713], [663, 717], [667, 721], [671, 725], [675, 729], [679, 733], [683, 737], [687, 741], [690, 702], [701, 703], [702, 704, 744], [703, 705], [691, 704, 706], [705, 707], [706, 708, 745], [707, 709], [692, 708, 710], [709, 711], [710, 712, 746], [711, 713], [693, 712, 714], [713, 715], [714, 716, 747], [715, 717], [694, 716, 718], [717, 719], [718, 720, 748], [719, 721], [695, 720, 722], [721, 723], [722, 724, 749], [723, 725], [696, 724, 726], [725, 727], [726, 728, 750], [727, 729], [697, 728, 730], [729, 731], [730, 732, 751], [731, 733], [698, 732, 734], [733, 735], [734, 736, 752], [735, 737], [699, 736, 738], [737, 739], [738, 740, 753], [739, 741], [700, 740, 742], [741, 743], [742, 754], [703, 757], [707, 761], [711, 765], [715, 769], [719, 773], [723, 777], [727, 781], [731, 785], [735, 789], [739, 793], [743, 797], [756, 798], [755, 757], [744, 756, 758], [757, 759], [758, 760, 799], [759, 761], [745, 760, 762], [761, 763], [762, 764, 800], [763, 765], [746, 764, 766], [765, 767], [766, 768, 801], [767, 769], [747, 768, 770], [769, 771], [770, 772, 802], [771, 773], [748, 772, 774], [773, 775], [774, 776, 803], [775, 777], [749, 776, 778], [777, 779], [778, 780, 804], [779, 781], [750, 780, 782], [781, 783], [782, 784, 805], [783, 785], [751, 784, 786], [785, 787], [786, 788, 806], [787, 789], [752, 788, 790], [789, 791], [790, 792, 807], [791, 793], [753, 792, 794], [793, 795], [794, 796, 808], [795, 797], [754, 796], [755, 809], [759, 813], [763, 817], [767, 821], [771, 825], [775, 829], [779, 833], [783, 837], [787, 841], [791, 845], [795, 849], [798, 810], [809, 811], [810, 812, 852], [811, 813], [799, 812, 814], [813, 815], [814, 816, 853], [815, 817], [800, 816, 818], [817, 819], [818, 820, 854], [819, 821], [801, 820, 822], [821, 823], [822, 824, 855], [823, 825], [802, 824, 826], [825, 827], [826, 828, 856], [827, 829], [803, 828, 830], [829, 831], [830, 832, 857], [831, 833], [804, 832, 834], [833, 835], [834, 836, 858], [835, 837], [805, 836, 838], [837, 839], [838, 840, 859], [839, 841], [806, 840, 842], [841, 843], [842, 844, 860], [843, 845], [807, 844, 846], [845, 847], [846, 848, 861], [847, 849], [808, 848, 850], [849, 851], [850, 862], [811, 865], [815, 869], [819, 873], [823, 877], [827, 881], [831, 885], [835, 889], [839, 893], [843, 897], [847, 901], [851, 905], [864, 906], [863, 865], [852, 864, 866], [865, 867], [866, 868, 907], [867, 869], [853, 868, 870], [869, 871], [870, 872, 908], [871, 873], [854, 872, 874], [873, 875], [874, 876, 909], [875, 877], [855, 876, 878], [877, 879], [878, 880, 910], [879, 881], [856, 880, 882], [881, 883], [882, 884, 911], [883, 885], [857, 884, 886], [885, 887], [886, 888, 912], [887, 889], [858, 888, 890], [889, 891], [890, 892, 913], [891, 893], [859, 892, 894], [893, 895], [894, 896, 914], [895, 897], [860, 896, 898], [897, 899], [898, 900, 915], [899, 901], [861, 900, 902], [901, 903], [902, 904, 916], [903, 905], [862, 904], [863, 917], [867, 921], [871, 925], [875, 929], [879, 933], [883, 937], [887, 941], [891, 945], [895, 949], [899, 953], [903, 957], [906, 918], [917, 919], [918, 920, 960], [919, 921], [907, 920, 922], [921, 923], [922, 924, 961], [923, 925], [908, 924, 926], [925, 927], [926, 928, 962], [927, 929], [909, 928, 930], [929, 931], [930, 932, 963], [931, 933], [910, 932, 934], [933, 935], [934, 936, 964], [935, 937], [911, 936, 938], [937, 939], [938, 940, 965], [939, 941], [912, 940, 942], [941, 943], [942, 944, 966], [943, 945], [913, 944, 946], [945, 947], [946, 948, 967], [947, 949], [914, 948, 950], [949, 951], [950, 952, 968], [951, 953], [915, 952, 954], [953, 955], [954, 956, 969], [955, 957], [916, 956, 958], [957, 959], [958, 970], [919, 973], [923, 977], [927, 981], [931, 985], [935, 989], [939, 993], [943, 997], [947, 1001], [951, 1005], [955, 1009], [959, 1013], [972, 1014], [971, 973], [960, 972, 974], [973, 975], [974, 976, 1015], [975, 977], [961, 976, 978], [977, 979], [978, 980, 1016], [979, 981], [962, 980, 982], [981, 983], [982, 984, 1017], [983, 985], [963, 984, 986], [985, 987], [986, 988, 1018], [987, 989], [964, 988, 990], [989, 991], [990, 992, 1019], [991, 993], [965, 992, 994], [993, 995], [994, 996, 1020], [995, 997], [966, 996, 998], [997, 999], [998, 1000, 1021], [999, 1001], [967, 1000, 1002], [1001, 1003], [1002, 1004, 1022], [1003, 1005], [968, 1004, 1006], [1005, 1007], [1006, 1008, 1023], [1007, 1009], [969, 1008, 1010], [1009, 1011], [1010, 1012, 1024], [1011, 1013], [970, 1012], [971, 1025], [975, 1029], [979, 1033], [983, 1037], [987, 1041], [991, 1045], [995, 1049], [999, 1053], [1003, 1057], [1007, 1061], [1011, 1065], [1014, 1026], [1025, 1027], [1026, 1028, 1068], [1027, 1029], [1015, 1028, 1030], [1029, 1031], [1030, 1032, 1069], [1031, 1033], [1016, 1032, 1034], [1033, 1035], [1034, 1036, 1070], [1035, 1037], [1017, 1036, 1038], [1037, 1039], [1038, 1040, 1071], [1039, 1041], [1018, 1040, 1042], [1041, 1043], [1042, 1044, 1072], [1043, 1045], [1019, 1044, 1046], [1045, 1047], [1046, 1048, 1073], [1047, 1049], [1020, 1048, 1050], [1049, 1051], [1050, 1052, 1074], [1051, 1053], [1021, 1052, 1054], [1053, 1055], [1054, 1056, 1075], [1055, 1057], [1022, 1056, 1058], [1057, 1059], [1058, 1060, 1076], [1059, 1061], [1023, 1060, 1062], [1061, 1063], [1062, 1064, 1077], [1063, 1065], [1024, 1064, 1066], [1065, 1067], [1066, 1078], [1027, 1080], [1031, 1084], [1035, 1088], [1039, 1092], [1043, 1096], [1047, 1100], [1051, 1104], [1055, 1108], [1059, 1112], [1063, 1116], [1067, 1120], [1080], [1068, 1079, 1081], [1080, 1082], [1081, 1083], [1082, 1084], [1069, 1083, 1085], [1084, 1086], [1085, 1087], [1086, 1088], [1070, 1087, 1089], [1088, 1090], [1089, 1091], [1090, 1092], [1071, 1091, 1093], [1092, 1094], [1093, 1095], [1094, 1096], [1072, 1095, 1097], [1096, 1098], [1097, 1099], [1098, 1100], [1073, 1099, 1101], [1100, 1102], [1101, 1103], [1102, 1104], [1074, 1103, 1105], [1104, 1106], [1105, 1107], [1106, 1108], [1075, 1107, 1109], [1108, 1110], [1109, 1111], [1110, 1112], [1076, 1111, 1113], [1112, 1114], [1113, 1115], [1114, 1116], [1077, 1115, 1117], [1116, 1118], [1117, 1119], [1118, 1120], [1078, 1119]] SGERROR: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1, 42], [0, 2], [1, 3], [2, 4], [3, 5, 43], [4, 6], [5, 7], [6, 8], [7, 9, 44], [8, 10], [9, 11], [10, 12], [11, 13, 45], [12, 14], [13, 15], [14, 16], [15, 17, 46], [16, 18], [17, 19], [18, 20], [19, 21, 47], [20, 22], [21, 23], [22, 24], [23, 25, 48], [24, 26], [25, 27], [26, 28], [27, 29, 49], [28, 30], [29, 31], [30, 32], [31, 33, 50], [32, 34], [33, 35], [34, 36], [35, 37, 51], [36, 38], [37, 39], [38, 40], [39, 41, 52], [40], [0, 53], [4, 57], [8, 61], [12, 65], [16, 69], [20, 73], [24, 77], [28, 81], [32, 85], [36, 89], [40, 93], [42, 54], [53, 55], [54, 56, 96], [55, 57], [43, 56, 58], [57, 59], [58, 60, 97], [59, 61], [44, 60, 62], [61, 63], [62, 64, 98], [63, 65], [45, 64, 66], [65, 67], [66, 68, 99], [67, 69], [46, 68, 70], [69, 71], [70, 72, 100], [71, 73], [47, 72, 74], [73, 75], [74, 76, 101], [75, 77], [48, 76, 78], [77, 79], [78, 80, 102], [79, 81], [49, 80, 82], [81, 83], [82, 84, 103], [83, 85], [50, 84, 86], [85, 87], [86, 88, 104], [87, 89], [51, 88, 90], [89, 91], [90, 92, 105], [91, 93], [52, 92, 94], [93, 95], [94, 106], [55, 109], [59, 113], [63, 117], [67, 121], [71, 125], [75, 129], [79, 133], [83, 137], [87, 141], [91, 145], [95, 149], [108, 150], [107, 109], [96, 108, 110], [109, 111], [110, 112, 151], [111, 113], [97, 112, 114], [113, 115], [114, 116, 152], [115, 117], [98, 116, 118], [117, 119], [118, 120, 153], [119, 121], [99, 120, 122], [121, 123], [122, 124, 154], [123, 125], [100, 124, 126], [125, 127], [126, 128, 155], [127, 129], [101, 128, 130], [129, 131], [130, 132, 156], [131, 133], [102, 132, 134], [133, 135], [134, 136, 157], [135, 137], [103, 136, 138], [137, 139], [138, 140, 158], [139, 141], [104, 140, 142], [141, 143], [142, 144, 159], [143, 145], [105, 144, 146], [145, 147], [146, 148, 160], [147, 149], [106, 148], [107, 161], [111, 165], [115, 169], [119, 173], [123, 177], [127, 181], [131, 185], [135, 189], [139, 193], [143, 197], [147, 201], [150, 162], [161, 163], [162, 164, 204], [163, 165], [151, 164, 166], [165, 167], [166, 168, 205], [167, 169], [152, 168, 170], [169, 171], [170, 172, 206], [171, 173], [153, 172, 174], [173, 175], [174, 176, 207], [175, 177], [154, 176, 178], [177, 179], [178, 180, 208], [179, 181], [155, 180, 182], [181, 183], [182, 184, 209], [183, 185], [156, 184, 186], [185, 187], [186, 188, 210], [187, 189], [157, 188, 190], [189, 191], [190, 192, 211], [191, 193], [158, 192, 194], [193, 195], [194, 196, 212], [195, 197], [159, 196, 198], [197, 199], [198, 200, 213], [199, 201], [160, 200, 202], [201, 203], [202, 214], [163, 217], [167, 221], [171, 225], [175, 229], [179, 233], [183, 237], [187, 241], [191, 245], [195, 249], [199, 253], [203, 257], [216, 258], [215, 217], [204, 216, 218], [217, 219], [218, 220, 259], [219, 221], [205, 220, 222], [221, 223], [222, 224, 260], [223, 225], [206, 224, 226], [225, 227], [226, 228, 261], [227, 229], [207, 228, 230], [229, 231], [230, 232, 262], [231, 233], [208, 232, 234], [233, 235], [234, 236, 263], [235, 237], [209, 236, 238], [237, 239], [238, 240, 264], [239, 241], [210, 240, 242], [241, 243], [242, 244, 265], [243, 245], [211, 244, 246], [245, 247], [246, 248, 266], [247, 249], [212, 248, 250], [249, 251], [250, 252, 267], [251, 253], [213, 252, 254], [253, 255], [254, 256, 268], [255, 257], [214, 256], [215, 269], [219, 273], [223, 277], [227, 281], [231, 285], [235, 289], [239, 293], [243, 297], [247, 301], [251, 305], [255, 309], [258, 270], [269, 271], [270, 272, 312], [271, 273], [259, 272, 274], [273, 275], [274, 276, 313], [275, 277], [260, 276, 278], [277, 279], [278, 280, 314], [279, 281], [261, 280, 282], [281, 283], [282, 284, 315], [283, 285], [262, 284, 286], [285, 287], [286, 288, 316], [287, 289], [263, 288, 290], [289, 291], [290, 292, 317], [291, 293], [264, 292, 294], [293, 295], [294, 296, 318], [295, 297], [265, 296, 298], [297, 299], [298, 300, 319], [299, 301], [266, 300, 302], [301, 303], [302, 304, 320], [303, 305], [267, 304, 306], [305, 307], [306, 308, 321], [307, 309], [268, 308, 310], [309, 311], [310, 322], [271, 325], [275, 329], [279, 333], [283, 337], [287, 341], [291, 345], [295, 349], [299, 353], [303, 357], [307, 361], [311, 365], [324, 366], [323, 325], [312, 324, 326], [325, 327], [326, 328, 367], [327, 329], [313, 328, 330], [329, 331], [330, 332, 368], [331, 333], [314, 332, 334], [333, 335], [334, 336, 369], [335, 337], [315, 336, 338], [337, 339], [338, 340, 370], [339, 341], [316, 340, 342], [341, 343], [342, 344, 371], [343, 345], [317, 344, 346], [345, 347], [346, 348, 372], [347, 349], [318, 348, 350], [349, 351], [350, 352, 373], [351, 353], [319, 352, 354], [353, 355], [354, 356, 374], [355, 357], [320, 356, 358], [357, 359], [358, 360, 375], [359, 361], [321, 360, 362], [361, 363], [362, 364, 376], [363, 365], [322, 364], [323, 377], [327, 381], [331, 385], [335, 389], [339, 393], [343, 397], [347, 401], [351, 405], [355, 409], [359, 413], [363, 417], [366, 378], [377, 379], [378, 380, 420], [379, 381], [367, 380, 382], [381, 383], [382, 384, 421], [383, 385], [368, 384, 386], [385, 387], [386, 388, 422], [387, 389], [369, 388, 390], [389, 391], [390, 392, 423], [391, 393], [370, 392, 394], [393, 395], [394, 396, 424], [395, 397], [371, 396, 398], [397, 399], [398, 400, 425], [399, 401], [372, 400, 402], [401, 403], [402, 404, 426], [403, 405], [373, 404, 406], [405, 407], [406, 408, 427], [407, 409], [374, 408, 410], [409, 411], [410, 412, 428], [411, 413], [375, 412, 414], [413, 415], [414, 416, 429], [415, 417], [376, 416, 418], [417, 419], [418, 430], [379, 433], [383, 437], [387, 441], [391, 445], [395, 449], [399, 453], [403, 457], [407, 461], [411, 465], [415, 469], [419, 473], [432, 474], [431, 433], [420, 432, 434], [433, 435], [434, 436, 475], [435, 437], [421, 436, 438], [437, 439], [438, 440, 476], [439, 441], [422, 440, 442], [441, 443], [442, 444, 477], [443, 445], [423, 444, 446], [445, 447], [446, 448, 478], [447, 449], [424, 448, 450], [449, 451], [450, 452, 479], [451, 453], [425, 452, 454], [453, 455], [454, 456, 480], [455, 457], [426, 456, 458], [457, 459], [458, 460, 481], [459, 461], [427, 460, 462], [461, 463], [462, 464, 482], [463, 465], [428, 464, 466], [465, 467], [466, 468, 483], [467, 469], [429, 468, 470], [469, 471], [470, 472, 484], [471, 473], [430, 472], [431, 485], [435, 489], [439, 493], [443, 497], [447, 501], [451, 505], [455, 509], [459, 513], [463, 517], [467, 521], [471, 525], [474, 486], [485, 487], [486, 488, 528], [487, 489], [475, 488, 490], [489, 491], [490, 492, 529], [491, 493], [476, 492, 494], [493, 495], [494, 496, 530], [495, 497], [477, 496, 498], [497, 499], [498, 500, 531], [499, 501], [478, 500, 502], [501, 503], [502, 504, 532], [503, 505], [479, 504, 506], [505, 507], [506, 508, 533], [507, 509], [480, 508, 510], [509, 511], [510, 512, 534], [511, 513], [481, 512, 514], [513, 515], [514, 516, 535], [515, 517], [482, 516, 518], [517, 519], [518, 520, 536], [519, 521], [483, 520, 522], [521, 523], [522, 524, 537], [523, 525], [484, 524, 526], [525, 527], [526, 538], [487, 541], [491, 545], [495, 549], [499, 553], [503, 557], [507, 561], [511, 565], [515, 569], [519, 573], [523, 577], [527, 581], [540, 582], [539, 541], [528, 540, 542], [541, 543], [542, 544, 583], [543, 545], [529, 544, 546], [545, 547], [546, 548, 584], [547, 549], [530, 548, 550], [549, 551], [550, 552, 585], [551, 553], [531, 552, 554], [553, 555], [554, 556, 586], [555, 557], [532, 556, 558], [557, 559], [558, 560, 587], [559, 561], [533, 560, 562], [561, 563], [562, 564, 588], [563, 565], [534, 564, 566], [565, 567], [566, 568, 589], [567, 569], [535, 568, 570], [569, 571], [570, 572, 590], [571, 573], [536, 572, 574], [573, 575], [574, 576, 591], [575, 577], [537, 576, 578], [577, 579], [578, 580, 592], [579, 581], [538, 580], [539, 593], [543, 597], [547, 601], [551, 605], [555, 609], [559, 613], [563, 617], [567, 621], [571, 625], [575, 629], [579, 633], [582, 594], [593, 595], [594, 596, 636], [595, 597], [583, 596, 598], [597, 599], [598, 600, 637], [599, 601], [584, 600, 602], [601, 603], [602, 604, 638], [603, 605], [585, 604, 606], [605, 607], [606, 608, 639], [607, 609], [586, 608, 610], [609, 611], [610, 612, 640], [611, 613], [587, 612, 614], [613, 615], [614, 616, 641], [615, 617], [588, 616, 618], [617, 619], [618, 620, 642], [619, 621], [589, 620, 622], [621, 623], [622, 624, 643], [623, 625], [590, 624, 626], [625, 627], [626, 628, 644], [627, 629], [591, 628, 630], [629, 631], [630, 632, 645], [631, 633], [592, 632, 634], [633, 635], [634, 646], [595, 649], [599, 653], [603, 657], [607, 661], [611, 665], [615, 669], [619, 673], [623, 677], [627, 681], [631, 685], [635, 689], [648, 690], [647, 649], [636, 648, 650], [649, 651], [650, 652, 691], [651, 653], [637, 652, 654], [653, 655], [654, 656, 692], [655, 657], [638, 656, 658], [657, 659], [658, 660, 693], [659, 661], [639, 660, 662], [661, 663], [662, 664, 694], [663, 665], [640, 664, 666], [665, 667], [666, 668, 695], [667, 669], [641, 668, 670], [669, 671], [670, 672, 696], [671, 673], [642, 672, 674], [673, 675], [674, 676, 697], [675, 677], [643, 676, 678], [677, 679], [678, 680, 698], [679, 681], [644, 680, 682], [681, 683], [682, 684, 699], [683, 685], [645, 684, 686], [685, 687], [686, 688, 700], [687, 689], [646, 688], [647, 701], [651, 705], [655, 709], [659, 713], [663, 717], [667, 721], [671, 725], [675, 729], [679, 733], [683, 737], [687, 741], [690, 702], [701, 703], [702, 704, 744], [703, 705], [691, 704, 706], [705, 707], [706, 708, 745], [707, 709], [692, 708, 710], [709, 711], [710, 712, 746], [711, 713], [693, 712, 714], [713, 715], [714, 716, 747], [715, 717], [694, 716, 718], [717, 719], [718, 720, 748], [719, 721], [695, 720, 722], [721, 723], [722, 724, 749], [723, 725], [696, 724, 726], [725, 727], [726, 728, 750], [727, 729], [697, 728, 730], [729, 731], [730, 732, 751], [731, 733], [698, 732, 734], [733, 735], [734, 736, 752], [735, 737], [699, 736, 738], [737, 739], [738, 740, 753], [739, 741], [700, 740, 742], [741, 743], [742, 754], [703, 757], [707, 761], [711, 765], [715, 769], [719, 773], [723, 777], [727, 781], [731, 785], [735, 789], [739, 793], [743, 797], [756, 798], [755, 757], [744, 756, 758], [757, 759], [758, 760, 799], [759, 761], [745, 760, 762], [761, 763], [762, 764, 800], [763, 765], [746, 764, 766], [765, 767], [766, 768, 801], [767, 769], [747, 768, 770], [769, 771], [770, 772, 802], [771, 773], [748, 772, 774], [773, 775], [774, 776, 803], [775, 777], [749, 776, 778], [777, 779], [778, 780, 804], [779, 781], [750, 780, 782], [781, 783], [782, 784, 805], [783, 785], [751, 784, 786], [785, 787], [786, 788, 806], [787, 789], [752, 788, 790], [789, 791], [790, 792, 807], [791, 793], [753, 792, 794], [793, 795], [794, 796, 808], [795, 797], [754, 796], [755, 809], [759, 813], [763, 817], [767, 821], [771, 825], [775, 829], [779, 833], [783, 837], [787, 841], [791, 845], [795, 849], [798, 810], [809, 811], [810, 812, 852], [811, 813], [799, 812, 814], [813, 815], [814, 816, 853], [815, 817], [800, 816, 818], [817, 819], [818, 820, 854], [819, 821], [801, 820, 822], [821, 823], [822, 824, 855], [823, 825], [802, 824, 826], [825, 827], [826, 828, 856], [827, 829], [803, 828, 830], [829, 831], [830, 832, 857], [831, 833], [804, 832, 834], [833, 835], [834, 836, 858], [835, 837], [805, 836, 838], [837, 839], [838, 840, 859], [839, 841], [806, 840, 842], [841, 843], [842, 844, 860], [843, 845], [807, 844, 846], [845, 847], [846, 848, 861], [847, 849], [808, 848, 850], [849, 851], [850, 862], [811, 865], [815, 869], [819, 873], [823, 877], [827, 881], [831, 885], [835, 889], [839, 893], [843, 897], [847, 901], [851, 905], [864, 906], [863, 865], [852, 864, 866], [865, 867], [866, 868, 907], [867, 869], [853, 868, 870], [869, 871], [870, 872, 908], [871, 873], [854, 872, 874], [873, 875], [874, 876, 909], [875, 877], [855, 876, 878], [877, 879], [878, 880, 910], [879, 881], [856, 880, 882], [881, 883], [882, 884, 911], [883, 885], [857, 884, 886], [885, 887], [886, 888, 912], [887, 889], [858, 888, 890], [889, 891], [890, 892, 913], [891, 893], [859, 892, 894], [893, 895], [894, 896, 914], [895, 897], [860, 896, 898], [897, 899], [898, 900, 915], [899, 901], [861, 900, 902], [901, 903], [902, 904, 916], [903, 905], [862, 904], [863, 917], [867, 921], [871, 925], [875, 929], [879, 933], [883, 937], [887, 941], [891, 945], [895, 949], [899, 953], [903, 957], [906, 918], [917, 919], [918, 920, 960], [919, 921], [907, 920, 922], [921, 923], [922, 924, 961], [923, 925], [908, 924, 926], [925, 927], [926, 928, 962], [927, 929], [909, 928, 930], [929, 931], [930, 932, 963], [931, 933], [910, 932, 934], [933, 935], [934, 936, 964], [935, 937], [911, 936, 938], [937, 939], [938, 940, 965], [939, 941], [912, 940, 942], [941, 943], [942, 944, 966], [943, 945], [913, 944, 946], [945, 947], [946, 948, 967], [947, 949], [914, 948, 950], [949, 951], [950, 952, 968], [951, 953], [915, 952, 954], [953, 955], [954, 956, 969], [955, 957], [916, 956, 958], [957, 959], [958, 970], [919, 973], [923, 977], [927, 981], [931, 985], [935, 989], [939, 993], [943, 997], [947, 1001], [951, 1005], [955, 1009], [959, 1013], [972, 1014], [971, 973], [960, 972, 974], [973, 975], [974, 976, 1015], [975, 977], [961, 976, 978], [977, 979], [978, 980, 1016], [979, 981], [962, 980, 982], [981, 983], [982, 984, 1017], [983, 985], [963, 984, 986], [985, 987], [986, 988, 1018], [987, 989], [964, 988, 990], [989, 991], [990, 992, 1019], [991, 993], [965, 992, 994], [993, 995], [994, 996, 1020], [995, 997], [966, 996, 998], [997, 999], [998, 1000, 1021], [999, 1001], [967, 1000, 1002], [1001, 1003], [1002, 1004, 1022], [1003, 1005], [968, 1004, 1006], [1005, 1007], [1006, 1008, 1023], [1007, 1009], [969, 1008, 1010], [1009, 1011], [1010, 1012, 1024], [1011, 1013], [970, 1012], [971, 1025], [975, 1029], [979, 1033], [983, 1037], [987, 1041], [991, 1045], [995, 1049], [999, 1053], [1003, 1057], [1007, 1061], [1011, 1065], [1014, 1026], [1025, 1027], [1026, 1028, 1068], [1027, 1029], [1015, 1028, 1030], [1029, 1031], [1030, 1032, 1069], [1031, 1033], [1016, 1032, 1034], [1033, 1035], [1034, 1036, 1070], [1035, 1037], [1017, 1036, 1038], [1037, 1039], [1038, 1040, 1071], [1039, 1041], [1018, 1040, 1042], [1041, 1043], [1042, 1044, 1072], [1043, 1045], [1019, 1044, 1046], [1045, 1047], [1046, 1048, 1073], [1047, 1049], [1020, 1048, 1050], [1049, 1051], [1050, 1052, 1074], [1051, 1053], [1021, 1052, 1054], [1053, 1055], [1054, 1056, 1075], [1055, 1057], [1022, 1056, 1058], [1057, 1059], [1058, 1060, 1076], [1059, 1061], [1023, 1060, 1062], [1061, 1063], [1062, 1064, 1077], [1063, 1065], [1024, 1064, 1066], [1065, 1067], [1066, 1078], [1027, 1080], [1031, 1084], [1035, 1088], [1039, 1092], [1043, 1096], [1047, 1100], [1051, 1104], [1055, 1108], [1059, 1112], [1063, 1116], [1067, 1120], [1080], [1068, 1079, 1081], [1080, 1082], [1081, 1083], [1082, 1084], [1069, 1083, 1085], [1084, 1086], [1085, 1087], [1086, 1088], [1070, 1087, 1089], [1088, 1090], [1089, 1091], [1090, 1092], [1071, 1091, 1093], [1092, 1094], [1093, 1095], [1094, 1096], [1072, 1095, 1097], [1096, 1098], [1097, 1099], [1098, 1100], [1073, 1099, 1101], [1100, 1102], [1101, 1103], [1102, 1104], [1074, 1103, 1105], [1104, 1106], [1105, 1107], [1106, 1108], [1075, 1107, 1109], [1108, 1110], [1109, 1111], [1110, 1112], [1076, 1111, 1113], [1112, 1114], [1113, 1115], [1114, 1116], [1077, 1115, 1117], [1116, 1118], [1117, 1119], [1118, 1120], [1078, 1119]] -CNOTTIME: [[1, 42], [0, 2], [1, 3], [2, 4], [3, 5, 43], [4, 6], [5, 7], [6, 8], [7, 9, 44], [8, 10], [9, 11], [10, 12], [11, 13, 45], [12, 14], [13, 15], [14, 16], [15, 17, 46], [16, 18], [17, 19], [18, 20], [19, 21, 47], [20, 22], [21, 23], [22, 24], [23, 25, 48], [24, 26], [25, 27], [26, 28], [27, 29, 49], [28, 30], [29, 31], [30, 32], [31, 33, 50], [32, 34], [33, 35], [34, 36], [35, 37, 51], [36, 38], [37, 39], [38, 40], [39, 41, 52], [40], [0, 53], [4, 57], [8, 61], [12, 65], [16, 69], [20, 73], [24, 77], [28, 81], [32, 85], [36, 89], [40, 93], [42, 54], [53, 55], [54, 56, 96], [55, 57], [43, 56, 58], [57, 59], [58, 60, 97], [59, 61], [44, 60, 62], [61, 63], [62, 64, 98], [63, 65], [45, 64, 66], [65, 67], [66, 68, 99], [67, 69], [46, 68, 70], [69, 71], [70, 72, 100], [71, 73], [47, 72, 74], [73, 75], [74, 76, 101], [75, 77], [48, 76, 78], [77, 79], [78, 80, 102], [79, 81], [49, 80, 82], [81, 83], [82, 84, 103], [83, 85], [50, 84, 86], [85, 87], [86, 88, 104], [87, 89], [51, 88, 90], [89, 91], [90, 92, 105], [91, 93], [52, 92, 94], [93, 95], [94, 106], [55, 109], [59, 113], [63, 117], [67, 121], [71, 125], [75, 129], [79, 133], [83, 137], [87, 141], [91, 145], [95, 149], [108, 150], [107, 109], [96, 108, 110], [109, 111], [110, 112, 151], [111, 113], [97, 112, 114], [113, 115], [114, 116, 152], [115, 117], [98, 116, 118], [117, 119], [118, 120, 153], [119, 121], [99, 120, 122], [121, 123], [122, 124, 154], [123, 125], [100, 124, 126], [125, 127], [126, 128, 155], [127, 129], [101, 128, 130], [129, 131], [130, 132, 156], [131, 133], [102, 132, 134], [133, 135], [134, 136, 157], [135, 137], [103, 136, 138], [137, 139], [138, 140, 158], [139, 141], [104, 140, 142], [141, 143], [142, 144, 159], [143, 145], [105, 144, 146], [145, 147], [146, 148, 160], [147, 149], [106, 148], [107, 161], [111, 165], [115, 169], [119, 173], [123, 177], [127, 181], [131, 185], [135, 189], [139, 193], [143, 197], [147, 201], [150, 162], [161, 163], [162, 164, 204], [163, 165], [151, 164, 166], [165, 167], [166, 168, 205], [167, 169], [152, 168, 170], [169, 171], [170, 172, 206], [171, 173], [153, 172, 174], [173, 175], [174, 176, 207], [175, 177], [154, 176, 178], [177, 179], [178, 180, 208], [179, 181], [155, 180, 182], [181, 183], [182, 184, 209], [183, 185], [156, 184, 186], [185, 187], [186, 188, 210], [187, 189], [157, 188, 190], [189, 191], [190, 192, 211], [191, 193], [158, 192, 194], [193, 195], [194, 196, 212], [195, 197], [159, 196, 198], [197, 199], [198, 200, 213], [199, 201], [160, 200, 202], [201, 203], [202, 214], [163, 217], [167, 221], [171, 225], [175, 229], [179, 233], [183, 237], [187, 241], [191, 245], [195, 249], [199, 253], [203, 257], [216, 258], [215, 217], [204, 216, 218], [217, 219], [218, 220, 259], [219, 221], [205, 220, 222], [221, 223], [222, 224, 260], [223, 225], [206, 224, 226], [225, 227], [226, 228, 261], [227, 229], [207, 228, 230], [229, 231], [230, 232, 262], [231, 233], [208, 232, 234], [233, 235], [234, 236, 263], [235, 237], [209, 236, 238], [237, 239], [238, 240, 264], [239, 241], [210, 240, 242], [241, 243], [242, 244, 265], [243, 245], [211, 244, 246], [245, 247], [246, 248, 266], [247, 249], [212, 248, 250], [249, 251], [250, 252, 267], [251, 253], [213, 252, 254], [253, 255], [254, 256, 268], [255, 257], [214, 256], [215, 269], [219, 273], [223, 277], [227, 281], [231, 285], [235, 289], [239, 293], [243, 297], [247, 301], [251, 305], [255, 309], [258, 270], [269, 271], [270, 272, 312], [271, 273], [259, 272, 274], [273, 275], [274, 276, 313], [275, 277], [260, 276, 278], [277, 279], [278, 280, 314], [279, 281], [261, 280, 282], [281, 283], [282, 284, 315], [283, 285], [262, 284, 286], [285, 287], [286, 288, 316], [287, 289], [263, 288, 290], [289, 291], [290, 292, 317], [291, 293], [264, 292, 294], [293, 295], [294, 296, 318], [295, 297], [265, 296, 298], [297, 299], [298, 300, 319], [299, 301], [266, 300, 302], [301, 303], [302, 304, 320], [303, 305], [267, 304, 306], [305, 307], [306, 308, 321], [307, 309], [268, 308, 310], [309, 311], [310, 322], [271, 325], [275, 329], [279, 333], [283, 337], [287, 341], [291, 345], [295, 349], [299, 353], [303, 357], [307, 361], [311, 365], [324, 366], [323, 325], [312, 324, 326], [325, 327], [326, 328, 367], [327, 329], [313, 328, 330], [329, 331], [330, 332, 368], [331, 333], [314, 332, 334], [333, 335], [334, 336, 369], [335, 337], [315, 336, 338], [337, 339], [338, 340, 370], [339, 341], [316, 340, 342], [341, 343], [342, 344, 371], [343, 345], [317, 344, 346], [345, 347], [346, 348, 372], [347, 349], [318, 348, 350], [349, 351], [350, 352, 373], [351, 353], [319, 352, 354], [353, 355], [354, 356, 374], [355, 357], [320, 356, 358], [357, 359], [358, 360, 375], [359, 361], [321, 360, 362], [361, 363], [362, 364, 376], [363, 365], [322, 364], [323, 377], [327, 381], [331, 385], [335, 389], [339, 393], [343, 397], [347, 401], [351, 405], [355, 409], [359, 413], [363, 417], [366, 378], [377, 379], [378, 380, 420], [379, 381], [367, 380, 382], [381, 383], [382, 384, 421], [383, 385], [368, 384, 386], [385, 387], [386, 388, 422], [387, 389], [369, 388, 390], [389, 391], [390, 392, 423], [391, 393], [370, 392, 394], [393, 395], [394, 396, 424], [395, 397], [371, 396, 398], [397, 399], [398, 400, 425], [399, 401], [372, 400, 402], [401, 403], [402, 404, 426], [403, 405], [373, 404, 406], [405, 407], [406, 408, 427], [407, 409], [374, 408, 410], [409, 411], [410, 412, 428], [411, 413], [375, 412, 414], [413, 415], [414, 416, 429], [415, 417], [376, 416, 418], [417, 419], [418, 430], [379, 433], [383, 437], [387, 441], [391, 445], [395, 449], [399, 453], [403, 457], [407, 461], [411, 465], [415, 469], [419, 473], [432, 474], [431, 433], [420, 432, 434], [433, 435], [434, 436, 475], [435, 437], [421, 436, 438], [437, 439], [438, 440, 476], [439, 441], [422, 440, 442], [441, 443], [442, 444, 477], [443, 445], [423, 444, 446], [445, 447], [446, 448, 478], [447, 449], [424, 448, 450], [449, 451], [450, 452, 479], [451, 453], [425, 452, 454], [453, 455], [454, 456, 480], [455, 457], [426, 456, 458], [457, 459], [458, 460, 481], [459, 461], [427, 460, 462], [461, 463], [462, 464, 482], [463, 465], [428, 464, 466], [465, 467], [466, 468, 483], [467, 469], [429, 468, 470], [469, 471], [470, 472, 484], [471, 473], [430, 472], [431, 485], [435, 489], [439, 493], [443, 497], [447, 501], [451, 505], [455, 509], [459, 513], [463, 517], [467, 521], [471, 525], [474, 486], [485, 487], [486, 488, 528], [487, 489], [475, 488, 490], [489, 491], [490, 492, 529], [491, 493], [476, 492, 494], [493, 495], [494, 496, 530], [495, 497], [477, 496, 498], [497, 499], [498, 500, 531], [499, 501], [478, 500, 502], [501, 503], [502, 504, 532], [503, 505], [479, 504, 506], [505, 507], [506, 508, 533], [507, 509], [480, 508, 510], [509, 511], [510, 512, 534], [511, 513], [481, 512, 514], [513, 515], [514, 516, 535], [515, 517], [482, 516, 518], [517, 519], [518, 520, 536], [519, 521], [483, 520, 522], [521, 523], [522, 524, 537], [523, 525], [484, 524, 526], [525, 527], [526, 538], [487, 541], [491, 545], [495, 549], [499, 553], [503, 557], [507, 561], [511, 565], [515, 569], [519, 573], [523, 577], [527, 581], [540, 582], [539, 541], [528, 540, 542], [541, 543], [542, 544, 583], [543, 545], [529, 544, 546], [545, 547], [546, 548, 584], [547, 549], [530, 548, 550], [549, 551], [550, 552, 585], [551, 553], [531, 552, 554], [553, 555], [554, 556, 586], [555, 557], [532, 556, 558], [557, 559], [558, 560, 587], [559, 561], [533, 560, 562], [561, 563], [562, 564, 588], [563, 565], [534, 564, 566], [565, 567], [566, 568, 589], [567, 569], [535, 568, 570], [569, 571], [570, 572, 590], [571, 573], [536, 572, 574], [573, 575], [574, 576, 591], [575, 577], [537, 576, 578], [577, 579], [578, 580, 592], [579, 581], [538, 580], [539, 593], [543, 597], [547, 601], [551, 605], [555, 609], [559, 613], [563, 617], [567, 621], [571, 625], [575, 629], [579, 633], [582, 594], [593, 595], [594, 596, 636], [595, 597], [583, 596, 598], [597, 599], [598, 600, 637], [599, 601], [584, 600, 602], [601, 603], [602, 604, 638], [603, 605], [585, 604, 606], [605, 607], [606, 608, 639], [607, 609], [586, 608, 610], [609, 611], [610, 612, 640], [611, 613], [587, 612, 614], [613, 615], [614, 616, 641], [615, 617], [588, 616, 618], [617, 619], [618, 620, 642], [619, 621], [589, 620, 622], [621, 623], [622, 624, 643], [623, 625], [590, 624, 626], [625, 627], [626, 628, 644], [627, 629], [591, 628, 630], [629, 631], [630, 632, 645], [631, 633], [592, 632, 634], [633, 635], [634, 646], [595, 649], [599, 653], [603, 657], [607, 661], [611, 665], [615, 669], [619, 673], [623, 677], [627, 681], [631, 685], [635, 689], [648, 690], [647, 649], [636, 648, 650], [649, 651], [650, 652, 691], [651, 653], [637, 652, 654], [653, 655], [654, 656, 692], [655, 657], [638, 656, 658], [657, 659], [658, 660, 693], [659, 661], [639, 660, 662], [661, 663], [662, 664, 694], [663, 665], [640, 664, 666], [665, 667], [666, 668, 695], [667, 669], [641, 668, 670], [669, 671], [670, 672, 696], [671, 673], [642, 672, 674], [673, 675], [674, 676, 697], [675, 677], [643, 676, 678], [677, 679], [678, 680, 698], [679, 681], [644, 680, 682], [681, 683], [682, 684, 699], [683, 685], [645, 684, 686], [685, 687], [686, 688, 700], [687, 689], [646, 688], [647, 701], [651, 705], [655, 709], [659, 713], [663, 717], [667, 721], [671, 725], [675, 729], [679, 733], [683, 737], [687, 741], [690, 702], [701, 703], [702, 704, 744], [703, 705], [691, 704, 706], [705, 707], [706, 708, 745], [707, 709], [692, 708, 710], [709, 711], [710, 712, 746], [711, 713], [693, 712, 714], [713, 715], [714, 716, 747], [715, 717], [694, 716, 718], [717, 719], [718, 720, 748], [719, 721], [695, 720, 722], [721, 723], [722, 724, 749], [723, 725], [696, 724, 726], [725, 727], [726, 728, 750], [727, 729], [697, 728, 730], [729, 731], [730, 732, 751], [731, 733], [698, 732, 734], [733, 735], [734, 736, 752], [735, 737], [699, 736, 738], [737, 739], [738, 740, 753], [739, 741], [700, 740, 742], [741, 743], [742, 754], [703, 757], [707, 761], [711, 765], [715, 769], [719, 773], [723, 777], [727, 781], [731, 785], [735, 789], [739, 793], [743, 797], [756, 798], [755, 757], [744, 756, 758], [757, 759], [758, 760, 799], [759, 761], [745, 760, 762], [761, 763], [762, 764, 800], [763, 765], [746, 764, 766], [765, 767], [766, 768, 801], [767, 769], [747, 768, 770], [769, 771], [770, 772, 802], [771, 773], [748, 772, 774], [773, 775], [774, 776, 803], [775, 777], [749, 776, 778], [777, 779], [778, 780, 804], [779, 781], [750, 780, 782], [781, 783], [782, 784, 805], [783, 785], [751, 784, 786], [785, 787], [786, 788, 806], [787, 789], [752, 788, 790], [789, 791], [790, 792, 807], [791, 793], [753, 792, 794], [793, 795], [794, 796, 808], [795, 797], [754, 796], [755, 809], [759, 813], [763, 817], [767, 821], [771, 825], [775, 829], [779, 833], [783, 837], [787, 841], [791, 845], [795, 849], [798, 810], [809, 811], [810, 812, 852], [811, 813], [799, 812, 814], [813, 815], [814, 816, 853], [815, 817], [800, 816, 818], [817, 819], [818, 820, 854], [819, 821], [801, 820, 822], [821, 823], [822, 824, 855], [823, 825], [802, 824, 826], [825, 827], [826, 828, 856], [827, 829], [803, 828, 830], [829, 831], [830, 832, 857], [831, 833], [804, 832, 834], [833, 835], [834, 836, 858], [835, 837], [805, 836, 838], [837, 839], [838, 840, 859], [839, 841], [806, 840, 842], [841, 843], [842, 844, 860], [843, 845], [807, 844, 846], [845, 847], [846, 848, 861], [847, 849], [808, 848, 850], [849, 851], [850, 862], [811, 865], [815, 869], [819, 873], [823, 877], [827, 881], [831, 885], [835, 889], [839, 893], [843, 897], [847, 901], [851, 905], [864, 906], [863, 865], [852, 864, 866], [865, 867], [866, 868, 907], [867, 869], [853, 868, 870], [869, 871], [870, 872, 908], [871, 873], [854, 872, 874], [873, 875], [874, 876, 909], [875, 877], [855, 876, 878], [877, 879], [878, 880, 910], [879, 881], [856, 880, 882], [881, 883], [882, 884, 911], [883, 885], [857, 884, 886], [885, 887], [886, 888, 912], [887, 889], [858, 888, 890], [889, 891], [890, 892, 913], [891, 893], [859, 892, 894], [893, 895], [894, 896, 914], [895, 897], [860, 896, 898], [897, 899], [898, 900, 915], [899, 901], [861, 900, 902], [901, 903], [902, 904, 916], [903, 905], [862, 904], [863, 917], [867, 921], [871, 925], [875, 929], [879, 933], [883, 937], [887, 941], [891, 945], [895, 949], [899, 953], [903, 957], [906, 918], [917, 919], [918, 920, 960], [919, 921], [907, 920, 922], [921, 923], [922, 924, 961], [923, 925], [908, 924, 926], [925, 927], [926, 928, 962], [927, 929], [909, 928, 930], [929, 931], [930, 932, 963], [931, 933], [910, 932, 934], [933, 935], [934, 936, 964], [935, 937], [911, 936, 938], [937, 939], [938, 940, 965], [939, 941], [912, 940, 942], [941, 943], [942, 944, 966], [943, 945], [913, 944, 946], [945, 947], [946, 948, 967], [947, 949], [914, 948, 950], [949, 951], [950, 952, 968], [951, 953], [915, 952, 954], [953, 955], [954, 956, 969], [955, 957], [916, 956, 958], [957, 959], [958, 970], [919, 973], [923, 977], [927, 981], [931, 985], [935, 989], [939, 993], [943, 997], [947, 1001], [951, 1005], [955, 1009], [959, 1013], [972, 1014], [971, 973], [960, 972, 974], [973, 975], [974, 976, 1015], [975, 977], [961, 976, 978], [977, 979], [978, 980, 1016], [979, 981], [962, 980, 982], [981, 983], [982, 984, 1017], [983, 985], [963, 984, 986], [985, 987], [986, 988, 1018], [987, 989], [964, 988, 990], [989, 991], [990, 992, 1019], [991, 993], [965, 992, 994], [993, 995], [994, 996, 1020], [995, 997], [966, 996, 998], [997, 999], [998, 1000, 1021], [999, 1001], [967, 1000, 1002], [1001, 1003], [1002, 1004, 1022], [1003, 1005], [968, 1004, 1006], [1005, 1007], [1006, 1008, 1023], [1007, 1009], [969, 1008, 1010], [1009, 1011], [1010, 1012, 1024], [1011, 1013], [970, 1012], [971, 1025], [975, 1029], [979, 1033], [983, 1037], [987, 1041], [991, 1045], [995, 1049], [999, 1053], [1003, 1057], [1007, 1061], [1011, 1065], [1014, 1026], [1025, 1027], [1026, 1028, 1068], [1027, 1029], [1015, 1028, 1030], [1029, 1031], [1030, 1032, 1069], [1031, 1033], [1016, 1032, 1034], [1033, 1035], [1034, 1036, 1070], [1035, 1037], [1017, 1036, 1038], [1037, 1039], [1038, 1040, 1071], [1039, 1041], [1018, 1040, 1042], [1041, 1043], [1042, 1044, 1072], [1043, 1045], [1019, 1044, 1046], [1045, 1047], [1046, 1048, 1073], [1047, 1049], [1020, 1048, 1050], [1049, 1051], [1050, 1052, 1074], [1051, 1053], [1021, 1052, 1054], [1053, 1055], [1054, 1056, 1075], [1055, 1057], [1022, 1056, 1058], [1057, 1059], [1058, 1060, 1076], [1059, 1061], [1023, 1060, 1062], [1061, 1063], [1062, 1064, 1077], [1063, 1065], [1024, 1064, 1066], [1065, 1067], [1066, 1078], [1027, 1080], [1031, 1084], [1035, 1088], [1039, 1092], [1043, 1096], [1047, 1100], [1051, 1104], [1055, 1108], [1059, 1112], [1063, 1116], [1067, 1120], [1080], [1068, 1079, 1081], [1080, 1082], [1081, 1083], [1082, 1084], [1069, 1083, 1085], [1084, 1086], [1085, 1087], [1086, 1088], [1070, 1087, 1089], [1088, 1090], [1089, 1091], [1090, 1092], [1071, 1091, 1093], [1092, 1094], [1093, 1095], [1094, 1096], [1072, 1095, 1097], [1096, 1098], [1097, 1099], [1098, 1100], [1073, 1099, 1101], [1100, 1102], [1101, 1103], [1102, 1104], [1074, 1103, 1105], [1104, 1106], [1105, 1107], [1106, 1108], [1075, 1107, 1109], [1108, 1110], [1109, 1111], [1110, 1112], [1076, 1111, 1113], [1112, 1114], [1113, 1115], [1114, 1116], [1077, 1115, 1117], [1116, 1118], [1117, 1119], [1118, 1120], [1078, 1119]] +CNOTERROR: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] +CNOTTIME: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] diff --git a/benchmark/topology/topo_11969.layout b/benchmark/topology/topo_11969.layout index 4d175fd69..a41d1a60d 100644 --- a/benchmark/topology/topo_11969.layout +++ b/benchmark/topology/topo_11969.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1, 138], [0, 2], [1, 3], [2, 4], [3, 5, 139], [4, 6], [5, 7], [6, 8], [7, 9, 140], [8, 10], [9, 11], [10, 12], [11, 13, 141], [12, 14], [13, 15], [14, 16], [15, 17, 142], [16, 18], [17, 19], [18, 20], [19, 21, 143], [20, 22], [21, 23], [22, 24], [23, 25, 144], [24, 26], [25, 27], [26, 28], [27, 29, 145], [28, 30], [29, 31], [30, 32], [31, 33, 146], [32, 34], [33, 35], [34, 36], [35, 37, 147], [36, 38], [37, 39], [38, 40], [39, 41, 148], [40, 42], [41, 43], [42, 44], [43, 45, 149], [44, 46], [45, 47], [46, 48], [47, 49, 150], [48, 50], [49, 51], [50, 52], [51, 53, 151], [52, 54], [53, 55], [54, 56], [55, 57, 152], [56, 58], [57, 59], [58, 60], [59, 61, 153], [60, 62], [61, 63], [62, 64], [63, 65, 154], [64, 66], [65, 67], [66, 68], [67, 69, 155], [68, 70], [69, 71], [70, 72], [71, 73, 156], [72, 74], [73, 75], [74, 76], [75, 77, 157], [76, 78], [77, 79], [78, 80], [79, 81, 158], [80, 82], [81, 83], [82, 84], [83, 85, 159], [84, 86], [85, 87], [86, 88], [87, 89, 160], [88, 90], [89, 91], [90, 92], [91, 93, 161], [92, 94], [93, 95], [94, 96], [95, 97, 162], [96, 98], [97, 99], [98, 100], [99, 101, 163], [100, 102], [101, 103], [102, 104], [103, 105, 164], [104, 106], [105, 107], [106, 108], [107, 109, 165], [108, 110], [109, 111], [110, 112], [111, 113, 166], [112, 114], [113, 115], [114, 116], [115, 117, 167], [116, 118], [117, 119], [118, 120], [119, 121, 168], [120, 122], [121, 123], [122, 124], [123, 125, 169], [124, 126], [125, 127], [126, 128], [127, 129, 170], [128, 130], [129, 131], [130, 132], [131, 133, 171], [132, 134], [133, 135], [134, 136], [135, 137, 172], [136], [0, 173], [4, 177], [8, 181], [12, 185], [16, 189], [20, 193], [24, 197], [28, 201], [32, 205], [36, 209], [40, 213], [44, 217], [48, 221], [52, 225], [56, 229], [60, 233], [64, 237], [68, 241], [72, 245], [76, 249], [80, 253], [84, 257], [88, 261], [92, 265], [96, 269], [100, 273], [104, 277], [108, 281], [112, 285], [116, 289], [120, 293], [124, 297], [128, 301], [132, 305], [136, 309], [138, 174], [173, 175], [174, 176, 312], [175, 177], [139, 176, 178], [177, 179], [178, 180, 313], [179, 181], [140, 180, 182], [181, 183], [182, 184, 314], [183, 185], [141, 184, 186], [185, 187], [186, 188, 315], [187, 189], [142, 188, 190], [189, 191], [190, 192, 316], [191, 193], [143, 192, 194], [193, 195], [194, 196, 317], [195, 197], [144, 196, 198], [197, 199], [198, 200, 318], [199, 201], [145, 200, 202], [201, 203], [202, 204, 319], [203, 205], [146, 204, 206], [205, 207], [206, 208, 320], [207, 209], [147, 208, 210], [209, 211], [210, 212, 321], [211, 213], [148, 212, 214], [213, 215], [214, 216, 322], [215, 217], [149, 216, 218], [217, 219], [218, 220, 323], [219, 221], [150, 220, 222], [221, 223], [222, 224, 324], [223, 225], [151, 224, 226], [225, 227], [226, 228, 325], [227, 229], [152, 228, 230], [229, 231], [230, 232, 326], [231, 233], [153, 232, 234], [233, 235], [234, 236, 327], [235, 237], [154, 236, 238], [237, 239], [238, 240, 328], [239, 241], [155, 240, 242], [241, 243], [242, 244, 329], [243, 245], [156, 244, 246], [245, 247], [246, 248, 330], [247, 249], [157, 248, 250], [249, 251], [250, 252, 331], [251, 253], [158, 252, 254], [253, 255], [254, 256, 332], [255, 257], [159, 256, 258], [257, 259], [258, 260, 333], [259, 261], [160, 260, 262], [261, 263], [262, 264, 334], [263, 265], [161, 264, 266], [265, 267], [266, 268, 335], [267, 269], [162, 268, 270], [269, 271], [270, 272, 336], [271, 273], [163, 272, 274], [273, 275], [274, 276, 337], [275, 277], [164, 276, 278], [277, 279], [278, 280, 338], [279, 281], [165, 280, 282], [281, 283], [282, 284, 339], [283, 285], [166, 284, 286], [285, 287], [286, 288, 340], [287, 289], [167, 288, 290], [289, 291], [290, 292, 341], [291, 293], [168, 292, 294], [293, 295], [294, 296, 342], [295, 297], [169, 296, 298], [297, 299], [298, 300, 343], [299, 301], [170, 300, 302], [301, 303], [302, 304, 344], [303, 305], [171, 304, 306], [305, 307], [306, 308, 345], [307, 309], [172, 308, 310], [309, 311], [310, 346], [175, 349], [179, 353], [183, 357], [187, 361], [191, 365], [195, 369], [199, 373], [203, 377], [207, 381], [211, 385], [215, 389], [219, 393], [223, 397], [227, 401], [231, 405], [235, 409], [239, 413], [243, 417], [247, 421], [251, 425], [255, 429], [259, 433], [263, 437], [267, 441], [271, 445], [275, 449], [279, 453], [283, 457], [287, 461], [291, 465], [295, 469], [299, 473], [303, 477], [307, 481], [311, 485], [348, 486], [347, 349], [312, 348, 350], [349, 351], [350, 352, 487], [351, 353], [313, 352, 354], [353, 355], [354, 356, 488], [355, 357], [314, 356, 358], [357, 359], [358, 360, 489], [359, 361], [315, 360, 362], [361, 363], [362, 364, 490], [363, 365], [316, 364, 366], [365, 367], [366, 368, 491], [367, 369], [317, 368, 370], [369, 371], [370, 372, 492], [371, 373], [318, 372, 374], [373, 375], [374, 376, 493], [375, 377], [319, 376, 378], [377, 379], [378, 380, 494], [379, 381], [320, 380, 382], [381, 383], [382, 384, 495], [383, 385], [321, 384, 386], [385, 387], [386, 388, 496], [387, 389], [322, 388, 390], [389, 391], [390, 392, 497], [391, 393], [323, 392, 394], [393, 395], [394, 396, 498], [395, 397], [324, 396, 398], [397, 399], [398, 400, 499], [399, 401], [325, 400, 402], [401, 403], [402, 404, 500], [403, 405], [326, 404, 406], [405, 407], [406, 408, 501], [407, 409], [327, 408, 410], [409, 411], [410, 412, 502], [411, 413], [328, 412, 414], [413, 415], [414, 416, 503], [415, 417], [329, 416, 418], [417, 419], [418, 420, 504], [419, 421], [330, 420, 422], [421, 423], [422, 424, 505], [423, 425], [331, 424, 426], [425, 427], [426, 428, 506], [427, 429], [332, 428, 430], [429, 431], [430, 432, 507], [431, 433], [333, 432, 434], [433, 435], [434, 436, 508], [435, 437], [334, 436, 438], [437, 439], [438, 440, 509], [439, 441], [335, 440, 442], [441, 443], [442, 444, 510], [443, 445], [336, 444, 446], [445, 447], [446, 448, 511], [447, 449], [337, 448, 450], [449, 451], [450, 452, 512], [451, 453], [338, 452, 454], [453, 455], [454, 456, 513], [455, 457], [339, 456, 458], [457, 459], [458, 460, 514], [459, 461], [340, 460, 462], [461, 463], [462, 464, 515], [463, 465], [341, 464, 466], [465, 467], [466, 468, 516], [467, 469], [342, 468, 470], [469, 471], [470, 472, 517], [471, 473], [343, 472, 474], [473, 475], [474, 476, 518], [475, 477], [344, 476, 478], [477, 479], [478, 480, 519], [479, 481], [345, 480, 482], [481, 483], [482, 484, 520], [483, 485], [346, 484], [347, 521], [351, 525], [355, 529], [359, 533], [363, 537], [367, 541], [371, 545], [375, 549], [379, 553], [383, 557], [387, 561], [391, 565], [395, 569], [399, 573], [403, 577], [407, 581], [411, 585], [415, 589], [419, 593], [423, 597], [427, 601], [431, 605], [435, 609], [439, 613], [443, 617], [447, 621], [451, 625], [455, 629], [459, 633], [463, 637], [467, 641], [471, 645], [475, 649], [479, 653], [483, 657], [486, 522], [521, 523], [522, 524, 660], [523, 525], [487, 524, 526], [525, 527], [526, 528, 661], [527, 529], [488, 528, 530], [529, 531], [530, 532, 662], [531, 533], [489, 532, 534], [533, 535], [534, 536, 663], [535, 537], [490, 536, 538], [537, 539], [538, 540, 664], [539, 541], [491, 540, 542], [541, 543], [542, 544, 665], [543, 545], [492, 544, 546], [545, 547], [546, 548, 666], [547, 549], [493, 548, 550], [549, 551], [550, 552, 667], [551, 553], [494, 552, 554], [553, 555], [554, 556, 668], [555, 557], [495, 556, 558], [557, 559], [558, 560, 669], [559, 561], [496, 560, 562], [561, 563], [562, 564, 670], [563, 565], [497, 564, 566], [565, 567], [566, 568, 671], [567, 569], [498, 568, 570], [569, 571], [570, 572, 672], [571, 573], [499, 572, 574], [573, 575], [574, 576, 673], [575, 577], [500, 576, 578], [577, 579], [578, 580, 674], [579, 581], [501, 580, 582], [581, 583], [582, 584, 675], [583, 585], [502, 584, 586], [585, 587], [586, 588, 676], [587, 589], [503, 588, 590], [589, 591], [590, 592, 677], [591, 593], [504, 592, 594], [593, 595], [594, 596, 678], [595, 597], [505, 596, 598], [597, 599], [598, 600, 679], [599, 601], [506, 600, 602], [601, 603], [602, 604, 680], [603, 605], [507, 604, 606], [605, 607], [606, 608, 681], [607, 609], [508, 608, 610], [609, 611], [610, 612, 682], [611, 613], [509, 612, 614], [613, 615], [614, 616, 683], [615, 617], [510, 616, 618], [617, 619], [618, 620, 684], [619, 621], [511, 620, 622], [621, 623], [622, 624, 685], [623, 625], [512, 624, 626], [625, 627], [626, 628, 686], [627, 629], [513, 628, 630], [629, 631], [630, 632, 687], [631, 633], [514, 632, 634], [633, 635], [634, 636, 688], [635, 637], [515, 636, 638], [637, 639], [638, 640, 689], [639, 641], [516, 640, 642], [641, 643], [642, 644, 690], [643, 645], [517, 644, 646], [645, 647], [646, 648, 691], [647, 649], [518, 648, 650], [649, 651], [650, 652, 692], [651, 653], [519, 652, 654], [653, 655], [654, 656, 693], [655, 657], [520, 656, 658], [657, 659], [658, 694], [523, 697], [527, 701], [531, 705], [535, 709], [539, 713], [543, 717], [547, 721], [551, 725], [555, 729], [559, 733], [563, 737], [567, 741], [571, 745], [575, 749], [579, 753], [583, 757], [587, 761], [591, 765], [595, 769], [599, 773], [603, 777], [607, 781], [611, 785], [615, 789], [619, 793], [623, 797], [627, 801], [631, 805], [635, 809], [639, 813], [643, 817], [647, 821], [651, 825], [655, 829], [659, 833], [696, 834], [695, 697], [660, 696, 698], [697, 699], [698, 700, 835], [699, 701], [661, 700, 702], [701, 703], [702, 704, 836], [703, 705], [662, 704, 706], [705, 707], [706, 708, 837], [707, 709], [663, 708, 710], [709, 711], [710, 712, 838], [711, 713], [664, 712, 714], [713, 715], [714, 716, 839], [715, 717], [665, 716, 718], [717, 719], [718, 720, 840], [719, 721], [666, 720, 722], [721, 723], [722, 724, 841], [723, 725], [667, 724, 726], [725, 727], [726, 728, 842], [727, 729], [668, 728, 730], [729, 731], [730, 732, 843], [731, 733], [669, 732, 734], [733, 735], [734, 736, 844], [735, 737], [670, 736, 738], [737, 739], [738, 740, 845], [739, 741], [671, 740, 742], [741, 743], [742, 744, 846], [743, 745], [672, 744, 746], [745, 747], [746, 748, 847], [747, 749], [673, 748, 750], [749, 751], [750, 752, 848], [751, 753], [674, 752, 754], [753, 755], [754, 756, 849], [755, 757], [675, 756, 758], [757, 759], [758, 760, 850], [759, 761], [676, 760, 762], [761, 763], [762, 764, 851], [763, 765], [677, 764, 766], [765, 767], [766, 768, 852], [767, 769], [678, 768, 770], [769, 771], [770, 772, 853], [771, 773], [679, 772, 774], [773, 775], [774, 776, 854], [775, 777], [680, 776, 778], [777, 779], [778, 780, 855], [779, 781], [681, 780, 782], [781, 783], [782, 784, 856], [783, 785], [682, 784, 786], [785, 787], [786, 788, 857], [787, 789], [683, 788, 790], [789, 791], [790, 792, 858], [791, 793], [684, 792, 794], [793, 795], [794, 796, 859], [795, 797], [685, 796, 798], [797, 799], [798, 800, 860], [799, 801], [686, 800, 802], [801, 803], [802, 804, 861], [803, 805], [687, 804, 806], [805, 807], [806, 808, 862], [807, 809], [688, 808, 810], [809, 811], [810, 812, 863], [811, 813], [689, 812, 814], [813, 815], [814, 816, 864], [815, 817], [690, 816, 818], [817, 819], [818, 820, 865], [819, 821], [691, 820, 822], [821, 823], [822, 824, 866], [823, 825], [692, 824, 826], [825, 827], [826, 828, 867], [827, 829], [693, 828, 830], [829, 831], [830, 832, 868], [831, 833], [694, 832], [695, 869], [699, 873], [703, 877], [707, 881], [711, 885], [715, 889], [719, 893], [723, 897], [727, 901], [731, 905], [735, 909], [739, 913], [743, 917], [747, 921], [751, 925], [755, 929], [759, 933], [763, 937], [767, 941], [771, 945], [775, 949], [779, 953], [783, 957], [787, 961], [791, 965], [795, 969], [799, 973], [803, 977], [807, 981], [811, 985], [815, 989], [819, 993], [823, 997], [827, 1001], [831, 1005], [834, 870], [869, 871], [870, 872, 1008], [871, 873], [835, 872, 874], [873, 875], [874, 876, 1009], [875, 877], [836, 876, 878], [877, 879], [878, 880, 1010], [879, 881], [837, 880, 882], [881, 883], [882, 884, 1011], [883, 885], [838, 884, 886], [885, 887], [886, 888, 1012], [887, 889], [839, 888, 890], [889, 891], [890, 892, 1013], [891, 893], [840, 892, 894], [893, 895], [894, 896, 1014], [895, 897], [841, 896, 898], [897, 899], [898, 900, 1015], [899, 901], [842, 900, 902], [901, 903], [902, 904, 1016], [903, 905], [843, 904, 906], [905, 907], [906, 908, 1017], [907, 909], [844, 908, 910], [909, 911], [910, 912, 1018], [911, 913], [845, 912, 914], [913, 915], [914, 916, 1019], [915, 917], [846, 916, 918], [917, 919], [918, 920, 1020], [919, 921], [847, 920, 922], [921, 923], [922, 924, 1021], [923, 925], [848, 924, 926], [925, 927], [926, 928, 1022], [927, 929], [849, 928, 930], [929, 931], [930, 932, 1023], [931, 933], [850, 932, 934], [933, 935], [934, 936, 1024], [935, 937], [851, 936, 938], [937, 939], [938, 940, 1025], [939, 941], [852, 940, 942], [941, 943], [942, 944, 1026], [943, 945], [853, 944, 946], [945, 947], [946, 948, 1027], [947, 949], [854, 948, 950], [949, 951], [950, 952, 1028], [951, 953], [855, 952, 954], [953, 955], [954, 956, 1029], [955, 957], [856, 956, 958], [957, 959], [958, 960, 1030], [959, 961], [857, 960, 962], [961, 963], [962, 964, 1031], [963, 965], [858, 964, 966], [965, 967], [966, 968, 1032], [967, 969], [859, 968, 970], [969, 971], [970, 972, 1033], [971, 973], [860, 972, 974], [973, 975], [974, 976, 1034], [975, 977], [861, 976, 978], [977, 979], [978, 980, 1035], [979, 981], [862, 980, 982], [981, 983], [982, 984, 1036], [983, 985], [863, 984, 986], [985, 987], [986, 988, 1037], [987, 989], [864, 988, 990], [989, 991], [990, 992, 1038], [991, 993], [865, 992, 994], [993, 995], [994, 996, 1039], [995, 997], [866, 996, 998], [997, 999], [998, 1000, 1040], [999, 1001], [867, 1000, 1002], [1001, 1003], [1002, 1004, 1041], [1003, 1005], [868, 1004, 1006], [1005, 1007], [1006, 1042], [871, 1045], [875, 1049], [879, 1053], [883, 1057], [887, 1061], [891, 1065], [895, 1069], [899, 1073], [903, 1077], [907, 1081], [911, 1085], [915, 1089], [919, 1093], [923, 1097], [927, 1101], [931, 1105], [935, 1109], [939, 1113], [943, 1117], [947, 1121], [951, 1125], [955, 1129], [959, 1133], [963, 1137], [967, 1141], [971, 1145], [975, 1149], [979, 1153], [983, 1157], [987, 1161], [991, 1165], [995, 1169], [999, 1173], [1003, 1177], [1007, 1181], [1044, 1182], [1043, 1045], [1008, 1044, 1046], [1045, 1047], [1046, 1048, 1183], [1047, 1049], [1009, 1048, 1050], [1049, 1051], [1050, 1052, 1184], [1051, 1053], [1010, 1052, 1054], [1053, 1055], [1054, 1056, 1185], [1055, 1057], [1011, 1056, 1058], [1057, 1059], [1058, 1060, 1186], [1059, 1061], [1012, 1060, 1062], [1061, 1063], [1062, 1064, 1187], [1063, 1065], [1013, 1064, 1066], [1065, 1067], [1066, 1068, 1188], [1067, 1069], [1014, 1068, 1070], [1069, 1071], [1070, 1072, 1189], [1071, 1073], [1015, 1072, 1074], [1073, 1075], [1074, 1076, 1190], [1075, 1077], [1016, 1076, 1078], [1077, 1079], [1078, 1080, 1191], [1079, 1081], [1017, 1080, 1082], [1081, 1083], [1082, 1084, 1192], [1083, 1085], [1018, 1084, 1086], [1085, 1087], [1086, 1088, 1193], [1087, 1089], [1019, 1088, 1090], [1089, 1091], [1090, 1092, 1194], [1091, 1093], [1020, 1092, 1094], [1093, 1095], [1094, 1096, 1195], [1095, 1097], [1021, 1096, 1098], [1097, 1099], [1098, 1100, 1196], [1099, 1101], [1022, 1100, 1102], [1101, 1103], [1102, 1104, 1197], [1103, 1105], [1023, 1104, 1106], [1105, 1107], [1106, 1108, 1198], [1107, 1109], [1024, 1108, 1110], [1109, 1111], [1110, 1112, 1199], [1111, 1113], [1025, 1112, 1114], [1113, 1115], [1114, 1116, 1200], [1115, 1117], [1026, 1116, 1118], [1117, 1119], [1118, 1120, 1201], [1119, 1121], [1027, 1120, 1122], [1121, 1123], [1122, 1124, 1202], [1123, 1125], [1028, 1124, 1126], [1125, 1127], [1126, 1128, 1203], [1127, 1129], [1029, 1128, 1130], [1129, 1131], [1130, 1132, 1204], [1131, 1133], [1030, 1132, 1134], [1133, 1135], [1134, 1136, 1205], [1135, 1137], [1031, 1136, 1138], [1137, 1139], [1138, 1140, 1206], [1139, 1141], [1032, 1140, 1142], [1141, 1143], [1142, 1144, 1207], [1143, 1145], [1033, 1144, 1146], [1145, 1147], [1146, 1148, 1208], [1147, 1149], [1034, 1148, 1150], [1149, 1151], [1150, 1152, 1209], [1151, 1153], [1035, 1152, 1154], [1153, 1155], [1154, 1156, 1210], [1155, 1157], [1036, 1156, 1158], [1157, 1159], [1158, 1160, 1211], [1159, 1161], [1037, 1160, 1162], [1161, 1163], [1162, 1164, 1212], [1163, 1165], [1038, 1164, 1166], [1165, 1167], [1166, 1168, 1213], [1167, 1169], [1039, 1168, 1170], [1169, 1171], [1170, 1172, 1214], [1171, 1173], [1040, 1172, 1174], [1173, 1175], [1174, 1176, 1215], [1175, 1177], [1041, 1176, 1178], [1177, 1179], [1178, 1180, 1216], [1179, 1181], [1042, 1180], [1043, 1217], [1047, 1221], [1051, 1225], [1055, 1229], [1059, 1233], [1063, 1237], [1067, 1241], [1071, 1245], [1075, 1249], [1079, 1253], [1083, 1257], [1087, 1261], [1091, 1265], [1095, 1269], [1099, 1273], [1103, 1277], [1107, 1281], [1111, 1285], [1115, 1289], [1119, 1293], [1123, 1297], [1127, 1301], [1131, 1305], [1135, 1309], [1139, 1313], [1143, 1317], [1147, 1321], [1151, 1325], [1155, 1329], [1159, 1333], [1163, 1337], [1167, 1341], [1171, 1345], [1175, 1349], [1179, 1353], [1182, 1218], [1217, 1219], [1218, 1220, 1356], [1219, 1221], [1183, 1220, 1222], [1221, 1223], [1222, 1224, 1357], [1223, 1225], [1184, 1224, 1226], [1225, 1227], [1226, 1228, 1358], [1227, 1229], [1185, 1228, 1230], [1229, 1231], [1230, 1232, 1359], [1231, 1233], [1186, 1232, 1234], [1233, 1235], [1234, 1236, 1360], [1235, 1237], [1187, 1236, 1238], [1237, 1239], [1238, 1240, 1361], [1239, 1241], [1188, 1240, 1242], [1241, 1243], [1242, 1244, 1362], [1243, 1245], [1189, 1244, 1246], [1245, 1247], [1246, 1248, 1363], [1247, 1249], [1190, 1248, 1250], [1249, 1251], [1250, 1252, 1364], [1251, 1253], [1191, 1252, 1254], [1253, 1255], [1254, 1256, 1365], [1255, 1257], [1192, 1256, 1258], [1257, 1259], [1258, 1260, 1366], [1259, 1261], [1193, 1260, 1262], [1261, 1263], [1262, 1264, 1367], [1263, 1265], [1194, 1264, 1266], [1265, 1267], [1266, 1268, 1368], [1267, 1269], [1195, 1268, 1270], [1269, 1271], [1270, 1272, 1369], [1271, 1273], [1196, 1272, 1274], [1273, 1275], [1274, 1276, 1370], [1275, 1277], [1197, 1276, 1278], [1277, 1279], [1278, 1280, 1371], [1279, 1281], [1198, 1280, 1282], [1281, 1283], [1282, 1284, 1372], [1283, 1285], [1199, 1284, 1286], [1285, 1287], [1286, 1288, 1373], [1287, 1289], [1200, 1288, 1290], [1289, 1291], [1290, 1292, 1374], [1291, 1293], [1201, 1292, 1294], [1293, 1295], [1294, 1296, 1375], [1295, 1297], [1202, 1296, 1298], [1297, 1299], [1298, 1300, 1376], [1299, 1301], [1203, 1300, 1302], [1301, 1303], [1302, 1304, 1377], [1303, 1305], [1204, 1304, 1306], [1305, 1307], [1306, 1308, 1378], [1307, 1309], [1205, 1308, 1310], [1309, 1311], [1310, 1312, 1379], [1311, 1313], [1206, 1312, 1314], [1313, 1315], [1314, 1316, 1380], [1315, 1317], [1207, 1316, 1318], [1317, 1319], [1318, 1320, 1381], [1319, 1321], [1208, 1320, 1322], [1321, 1323], [1322, 1324, 1382], [1323, 1325], [1209, 1324, 1326], [1325, 1327], [1326, 1328, 1383], [1327, 1329], [1210, 1328, 1330], [1329, 1331], [1330, 1332, 1384], [1331, 1333], [1211, 1332, 1334], [1333, 1335], [1334, 1336, 1385], [1335, 1337], [1212, 1336, 1338], [1337, 1339], [1338, 1340, 1386], [1339, 1341], [1213, 1340, 1342], [1341, 1343], [1342, 1344, 1387], [1343, 1345], [1214, 1344, 1346], [1345, 1347], [1346, 1348, 1388], [1347, 1349], [1215, 1348, 1350], [1349, 1351], [1350, 1352, 1389], [1351, 1353], [1216, 1352, 1354], [1353, 1355], [1354, 1390], [1219, 1393], [1223, 1397], [1227, 1401], [1231, 1405], [1235, 1409], [1239, 1413], [1243, 1417], [1247, 1421], [1251, 1425], [1255, 1429], [1259, 1433], [1263, 1437], [1267, 1441], [1271, 1445], [1275, 1449], [1279, 1453], [1283, 1457], [1287, 1461], [1291, 1465], [1295, 1469], [1299, 1473], [1303, 1477], [1307, 1481], [1311, 1485], [1315, 1489], [1319, 1493], [1323, 1497], [1327, 1501], [1331, 1505], [1335, 1509], [1339, 1513], [1343, 1517], [1347, 1521], [1351, 1525], [1355, 1529], [1392, 1530], [1391, 1393], [1356, 1392, 1394], [1393, 1395], [1394, 1396, 1531], [1395, 1397], [1357, 1396, 1398], [1397, 1399], [1398, 1400, 1532], [1399, 1401], [1358, 1400, 1402], [1401, 1403], [1402, 1404, 1533], [1403, 1405], [1359, 1404, 1406], [1405, 1407], [1406, 1408, 1534], [1407, 1409], [1360, 1408, 1410], [1409, 1411], [1410, 1412, 1535], [1411, 1413], [1361, 1412, 1414], [1413, 1415], [1414, 1416, 1536], [1415, 1417], [1362, 1416, 1418], [1417, 1419], [1418, 1420, 1537], [1419, 1421], [1363, 1420, 1422], [1421, 1423], [1422, 1424, 1538], [1423, 1425], [1364, 1424, 1426], [1425, 1427], [1426, 1428, 1539], [1427, 1429], [1365, 1428, 1430], [1429, 1431], [1430, 1432, 1540], [1431, 1433], [1366, 1432, 1434], [1433, 1435], [1434, 1436, 1541], [1435, 1437], [1367, 1436, 1438], [1437, 1439], [1438, 1440, 1542], [1439, 1441], [1368, 1440, 1442], [1441, 1443], [1442, 1444, 1543], [1443, 1445], [1369, 1444, 1446], [1445, 1447], [1446, 1448, 1544], [1447, 1449], [1370, 1448, 1450], [1449, 1451], [1450, 1452, 1545], [1451, 1453], [1371, 1452, 1454], [1453, 1455], [1454, 1456, 1546], [1455, 1457], [1372, 1456, 1458], [1457, 1459], [1458, 1460, 1547], [1459, 1461], [1373, 1460, 1462], [1461, 1463], [1462, 1464, 1548], [1463, 1465], [1374, 1464, 1466], [1465, 1467], [1466, 1468, 1549], [1467, 1469], [1375, 1468, 1470], [1469, 1471], [1470, 1472, 1550], [1471, 1473], [1376, 1472, 1474], [1473, 1475], [1474, 1476, 1551], [1475, 1477], [1377, 1476, 1478], [1477, 1479], [1478, 1480, 1552], [1479, 1481], [1378, 1480, 1482], [1481, 1483], [1482, 1484, 1553], [1483, 1485], [1379, 1484, 1486], [1485, 1487], [1486, 1488, 1554], [1487, 1489], [1380, 1488, 1490], [1489, 1491], [1490, 1492, 1555], [1491, 1493], [1381, 1492, 1494], [1493, 1495], [1494, 1496, 1556], [1495, 1497], [1382, 1496, 1498], [1497, 1499], [1498, 1500, 1557], [1499, 1501], [1383, 1500, 1502], [1501, 1503], [1502, 1504, 1558], [1503, 1505], [1384, 1504, 1506], [1505, 1507], [1506, 1508, 1559], [1507, 1509], [1385, 1508, 1510], [1509, 1511], [1510, 1512, 1560], [1511, 1513], [1386, 1512, 1514], [1513, 1515], [1514, 1516, 1561], [1515, 1517], [1387, 1516, 1518], [1517, 1519], [1518, 1520, 1562], [1519, 1521], [1388, 1520, 1522], [1521, 1523], [1522, 1524, 1563], [1523, 1525], [1389, 1524, 1526], [1525, 1527], [1526, 1528, 1564], [1527, 1529], [1390, 1528], [1391, 1565], [1395, 1569], [1399, 1573], [1403, 1577], [1407, 1581], [1411, 1585], [1415, 1589], [1419, 1593], [1423, 1597], [1427, 1601], [1431, 1605], [1435, 1609], [1439, 1613], [1443, 1617], [1447, 1621], [1451, 1625], [1455, 1629], [1459, 1633], [1463, 1637], [1467, 1641], [1471, 1645], [1475, 1649], [1479, 1653], [1483, 1657], [1487, 1661], [1491, 1665], [1495, 1669], [1499, 1673], [1503, 1677], [1507, 1681], [1511, 1685], [1515, 1689], [1519, 1693], [1523, 1697], [1527, 1701], [1530, 1566], [1565, 1567], [1566, 1568, 1704], [1567, 1569], [1531, 1568, 1570], [1569, 1571], [1570, 1572, 1705], [1571, 1573], [1532, 1572, 1574], [1573, 1575], [1574, 1576, 1706], [1575, 1577], [1533, 1576, 1578], [1577, 1579], [1578, 1580, 1707], [1579, 1581], [1534, 1580, 1582], [1581, 1583], [1582, 1584, 1708], [1583, 1585], [1535, 1584, 1586], [1585, 1587], [1586, 1588, 1709], [1587, 1589], [1536, 1588, 1590], [1589, 1591], [1590, 1592, 1710], [1591, 1593], [1537, 1592, 1594], [1593, 1595], [1594, 1596, 1711], [1595, 1597], [1538, 1596, 1598], [1597, 1599], [1598, 1600, 1712], [1599, 1601], [1539, 1600, 1602], [1601, 1603], [1602, 1604, 1713], [1603, 1605], [1540, 1604, 1606], [1605, 1607], [1606, 1608, 1714], [1607, 1609], [1541, 1608, 1610], [1609, 1611], [1610, 1612, 1715], [1611, 1613], [1542, 1612, 1614], [1613, 1615], [1614, 1616, 1716], [1615, 1617], [1543, 1616, 1618], [1617, 1619], [1618, 1620, 1717], [1619, 1621], [1544, 1620, 1622], [1621, 1623], [1622, 1624, 1718], [1623, 1625], [1545, 1624, 1626], [1625, 1627], [1626, 1628, 1719], [1627, 1629], [1546, 1628, 1630], [1629, 1631], [1630, 1632, 1720], [1631, 1633], [1547, 1632, 1634], [1633, 1635], [1634, 1636, 1721], [1635, 1637], [1548, 1636, 1638], [1637, 1639], [1638, 1640, 1722], [1639, 1641], [1549, 1640, 1642], [1641, 1643], [1642, 1644, 1723], [1643, 1645], [1550, 1644, 1646], [1645, 1647], [1646, 1648, 1724], [1647, 1649], [1551, 1648, 1650], [1649, 1651], [1650, 1652, 1725], [1651, 1653], [1552, 1652, 1654], [1653, 1655], [1654, 1656, 1726], [1655, 1657], [1553, 1656, 1658], [1657, 1659], [1658, 1660, 1727], [1659, 1661], [1554, 1660, 1662], [1661, 1663], [1662, 1664, 1728], [1663, 1665], [1555, 1664, 1666], [1665, 1667], [1666, 1668, 1729], [1667, 1669], [1556, 1668, 1670], [1669, 1671], [1670, 1672, 1730], [1671, 1673], [1557, 1672, 1674], [1673, 1675], [1674, 1676, 1731], [1675, 1677], [1558, 1676, 1678], [1677, 1679], [1678, 1680, 1732], [1679, 1681], [1559, 1680, 1682], [1681, 1683], [1682, 1684, 1733], [1683, 1685], [1560, 1684, 1686], [1685, 1687], [1686, 1688, 1734], [1687, 1689], [1561, 1688, 1690], [1689, 1691], [1690, 1692, 1735], [1691, 1693], [1562, 1692, 1694], [1693, 1695], [1694, 1696, 1736], [1695, 1697], [1563, 1696, 1698], [1697, 1699], [1698, 1700, 1737], [1699, 1701], [1564, 1700, 1702], [1701, 1703], [1702, 1738], [1567, 1741], [1571, 1745], [1575, 1749], [1579, 1753], [1583, 1757], [1587, 1761], [1591, 1765], [1595, 1769], [1599, 1773], [1603, 1777], [1607, 1781], [1611, 1785], [1615, 1789], [1619, 1793], [1623, 1797], [1627, 1801], [1631, 1805], [1635, 1809], [1639, 1813], [1643, 1817], [1647, 1821], [1651, 1825], [1655, 1829], [1659, 1833], [1663, 1837], [1667, 1841], [1671, 1845], [1675, 1849], [1679, 1853], [1683, 1857], [1687, 1861], [1691, 1865], [1695, 1869], [1699, 1873], [1703, 1877], [1740, 1878], [1739, 1741], [1704, 1740, 1742], [1741, 1743], [1742, 1744, 1879], [1743, 1745], [1705, 1744, 1746], [1745, 1747], [1746, 1748, 1880], [1747, 1749], [1706, 1748, 1750], [1749, 1751], [1750, 1752, 1881], [1751, 1753], [1707, 1752, 1754], [1753, 1755], [1754, 1756, 1882], [1755, 1757], [1708, 1756, 1758], [1757, 1759], [1758, 1760, 1883], [1759, 1761], [1709, 1760, 1762], [1761, 1763], [1762, 1764, 1884], [1763, 1765], [1710, 1764, 1766], [1765, 1767], [1766, 1768, 1885], [1767, 1769], [1711, 1768, 1770], [1769, 1771], [1770, 1772, 1886], [1771, 1773], [1712, 1772, 1774], [1773, 1775], [1774, 1776, 1887], [1775, 1777], [1713, 1776, 1778], [1777, 1779], [1778, 1780, 1888], [1779, 1781], [1714, 1780, 1782], [1781, 1783], [1782, 1784, 1889], [1783, 1785], [1715, 1784, 1786], [1785, 1787], [1786, 1788, 1890], [1787, 1789], [1716, 1788, 1790], [1789, 1791], [1790, 1792, 1891], [1791, 1793], [1717, 1792, 1794], [1793, 1795], [1794, 1796, 1892], [1795, 1797], [1718, 1796, 1798], [1797, 1799], [1798, 1800, 1893], [1799, 1801], [1719, 1800, 1802], [1801, 1803], [1802, 1804, 1894], [1803, 1805], [1720, 1804, 1806], [1805, 1807], [1806, 1808, 1895], [1807, 1809], [1721, 1808, 1810], [1809, 1811], [1810, 1812, 1896], [1811, 1813], [1722, 1812, 1814], [1813, 1815], [1814, 1816, 1897], [1815, 1817], [1723, 1816, 1818], [1817, 1819], [1818, 1820, 1898], [1819, 1821], [1724, 1820, 1822], [1821, 1823], [1822, 1824, 1899], [1823, 1825], [1725, 1824, 1826], [1825, 1827], [1826, 1828, 1900], [1827, 1829], [1726, 1828, 1830], [1829, 1831], [1830, 1832, 1901], [1831, 1833], [1727, 1832, 1834], [1833, 1835], [1834, 1836, 1902], [1835, 1837], [1728, 1836, 1838], [1837, 1839], [1838, 1840, 1903], [1839, 1841], [1729, 1840, 1842], [1841, 1843], [1842, 1844, 1904], [1843, 1845], [1730, 1844, 1846], [1845, 1847], [1846, 1848, 1905], [1847, 1849], [1731, 1848, 1850], [1849, 1851], [1850, 1852, 1906], [1851, 1853], [1732, 1852, 1854], [1853, 1855], [1854, 1856, 1907], [1855, 1857], [1733, 1856, 1858], [1857, 1859], [1858, 1860, 1908], [1859, 1861], [1734, 1860, 1862], [1861, 1863], [1862, 1864, 1909], [1863, 1865], [1735, 1864, 1866], [1865, 1867], [1866, 1868, 1910], [1867, 1869], [1736, 1868, 1870], [1869, 1871], [1870, 1872, 1911], [1871, 1873], [1737, 1872, 1874], [1873, 1875], [1874, 1876, 1912], [1875, 1877], [1738, 1876], [1739, 1913], [1743, 1917], [1747, 1921], [1751, 1925], [1755, 1929], [1759, 1933], [1763, 1937], [1767, 1941], [1771, 1945], [1775, 1949], [1779, 1953], [1783, 1957], [1787, 1961], [1791, 1965], [1795, 1969], [1799, 1973], [1803, 1977], [1807, 1981], [1811, 1985], [1815, 1989], [1819, 1993], [1823, 1997], [1827, 2001], [1831, 2005], [1835, 2009], [1839, 2013], [1843, 2017], [1847, 2021], [1851, 2025], [1855, 2029], [1859, 2033], [1863, 2037], [1867, 2041], [1871, 2045], [1875, 2049], [1878, 1914], [1913, 1915], [1914, 1916, 2052], [1915, 1917], [1879, 1916, 1918], [1917, 1919], [1918, 1920, 2053], [1919, 1921], [1880, 1920, 1922], [1921, 1923], [1922, 1924, 2054], [1923, 1925], [1881, 1924, 1926], [1925, 1927], [1926, 1928, 2055], [1927, 1929], [1882, 1928, 1930], [1929, 1931], [1930, 1932, 2056], [1931, 1933], [1883, 1932, 1934], [1933, 1935], [1934, 1936, 2057], [1935, 1937], [1884, 1936, 1938], [1937, 1939], [1938, 1940, 2058], [1939, 1941], [1885, 1940, 1942], [1941, 1943], [1942, 1944, 2059], [1943, 1945], [1886, 1944, 1946], [1945, 1947], [1946, 1948, 2060], [1947, 1949], [1887, 1948, 1950], [1949, 1951], [1950, 1952, 2061], [1951, 1953], [1888, 1952, 1954], [1953, 1955], [1954, 1956, 2062], [1955, 1957], [1889, 1956, 1958], [1957, 1959], [1958, 1960, 2063], [1959, 1961], [1890, 1960, 1962], [1961, 1963], [1962, 1964, 2064], [1963, 1965], [1891, 1964, 1966], [1965, 1967], [1966, 1968, 2065], [1967, 1969], [1892, 1968, 1970], [1969, 1971], [1970, 1972, 2066], [1971, 1973], [1893, 1972, 1974], [1973, 1975], [1974, 1976, 2067], [1975, 1977], [1894, 1976, 1978], [1977, 1979], [1978, 1980, 2068], [1979, 1981], [1895, 1980, 1982], [1981, 1983], [1982, 1984, 2069], [1983, 1985], [1896, 1984, 1986], [1985, 1987], [1986, 1988, 2070], [1987, 1989], [1897, 1988, 1990], [1989, 1991], [1990, 1992, 2071], [1991, 1993], [1898, 1992, 1994], [1993, 1995], [1994, 1996, 2072], [1995, 1997], [1899, 1996, 1998], [1997, 1999], [1998, 2000, 2073], [1999, 2001], [1900, 2000, 2002], [2001, 2003], [2002, 2004, 2074], [2003, 2005], [1901, 2004, 2006], [2005, 2007], [2006, 2008, 2075], [2007, 2009], [1902, 2008, 2010], [2009, 2011], [2010, 2012, 2076], [2011, 2013], [1903, 2012, 2014], [2013, 2015], [2014, 2016, 2077], [2015, 2017], [1904, 2016, 2018], [2017, 2019], [2018, 2020, 2078], [2019, 2021], [1905, 2020, 2022], [2021, 2023], [2022, 2024, 2079], [2023, 2025], [1906, 2024, 2026], [2025, 2027], [2026, 2028, 2080], [2027, 2029], [1907, 2028, 2030], [2029, 2031], [2030, 2032, 2081], [2031, 2033], [1908, 2032, 2034], [2033, 2035], [2034, 2036, 2082], [2035, 2037], [1909, 2036, 2038], [2037, 2039], [2038, 2040, 2083], [2039, 2041], [1910, 2040, 2042], [2041, 2043], [2042, 2044, 2084], [2043, 2045], [1911, 2044, 2046], [2045, 2047], [2046, 2048, 2085], [2047, 2049], [1912, 2048, 2050], [2049, 2051], [2050, 2086], [1915, 2089], [1919, 2093], [1923, 2097], [1927, 2101], [1931, 2105], [1935, 2109], [1939, 2113], [1943, 2117], [1947, 2121], [1951, 2125], [1955, 2129], [1959, 2133], [1963, 2137], [1967, 2141], [1971, 2145], [1975, 2149], [1979, 2153], [1983, 2157], [1987, 2161], [1991, 2165], [1995, 2169], [1999, 2173], [2003, 2177], [2007, 2181], [2011, 2185], [2015, 2189], [2019, 2193], [2023, 2197], [2027, 2201], [2031, 2205], [2035, 2209], [2039, 2213], [2043, 2217], [2047, 2221], [2051, 2225], [2088, 2226], [2087, 2089], [2052, 2088, 2090], [2089, 2091], [2090, 2092, 2227], [2091, 2093], [2053, 2092, 2094], [2093, 2095], [2094, 2096, 2228], [2095, 2097], [2054, 2096, 2098], [2097, 2099], [2098, 2100, 2229], [2099, 2101], [2055, 2100, 2102], [2101, 2103], [2102, 2104, 2230], [2103, 2105], [2056, 2104, 2106], [2105, 2107], [2106, 2108, 2231], [2107, 2109], [2057, 2108, 2110], [2109, 2111], [2110, 2112, 2232], [2111, 2113], [2058, 2112, 2114], [2113, 2115], [2114, 2116, 2233], [2115, 2117], [2059, 2116, 2118], [2117, 2119], [2118, 2120, 2234], [2119, 2121], [2060, 2120, 2122], [2121, 2123], [2122, 2124, 2235], [2123, 2125], [2061, 2124, 2126], [2125, 2127], [2126, 2128, 2236], [2127, 2129], [2062, 2128, 2130], [2129, 2131], [2130, 2132, 2237], [2131, 2133], [2063, 2132, 2134], [2133, 2135], [2134, 2136, 2238], [2135, 2137], [2064, 2136, 2138], [2137, 2139], [2138, 2140, 2239], [2139, 2141], [2065, 2140, 2142], [2141, 2143], [2142, 2144, 2240], [2143, 2145], [2066, 2144, 2146], [2145, 2147], [2146, 2148, 2241], [2147, 2149], [2067, 2148, 2150], [2149, 2151], [2150, 2152, 2242], [2151, 2153], [2068, 2152, 2154], [2153, 2155], [2154, 2156, 2243], [2155, 2157], [2069, 2156, 2158], [2157, 2159], [2158, 2160, 2244], [2159, 2161], [2070, 2160, 2162], [2161, 2163], [2162, 2164, 2245], [2163, 2165], [2071, 2164, 2166], [2165, 2167], [2166, 2168, 2246], [2167, 2169], [2072, 2168, 2170], [2169, 2171], [2170, 2172, 2247], [2171, 2173], [2073, 2172, 2174], [2173, 2175], [2174, 2176, 2248], [2175, 2177], [2074, 2176, 2178], [2177, 2179], [2178, 2180, 2249], [2179, 2181], [2075, 2180, 2182], [2181, 2183], [2182, 2184, 2250], [2183, 2185], [2076, 2184, 2186], [2185, 2187], [2186, 2188, 2251], [2187, 2189], [2077, 2188, 2190], [2189, 2191], [2190, 2192, 2252], [2191, 2193], [2078, 2192, 2194], [2193, 2195], [2194, 2196, 2253], [2195, 2197], [2079, 2196, 2198], [2197, 2199], [2198, 2200, 2254], [2199, 2201], [2080, 2200, 2202], [2201, 2203], [2202, 2204, 2255], [2203, 2205], [2081, 2204, 2206], [2205, 2207], [2206, 2208, 2256], [2207, 2209], [2082, 2208, 2210], [2209, 2211], [2210, 2212, 2257], [2211, 2213], [2083, 2212, 2214], [2213, 2215], [2214, 2216, 2258], [2215, 2217], [2084, 2216, 2218], [2217, 2219], [2218, 2220, 2259], [2219, 2221], [2085, 2220, 2222], [2221, 2223], [2222, 2224, 2260], [2223, 2225], [2086, 2224], [2087, 2261], [2091, 2265], [2095, 2269], [2099, 2273], [2103, 2277], [2107, 2281], [2111, 2285], [2115, 2289], [2119, 2293], [2123, 2297], [2127, 2301], [2131, 2305], [2135, 2309], [2139, 2313], [2143, 2317], [2147, 2321], [2151, 2325], [2155, 2329], [2159, 2333], [2163, 2337], [2167, 2341], [2171, 2345], [2175, 2349], [2179, 2353], [2183, 2357], [2187, 2361], [2191, 2365], [2195, 2369], [2199, 2373], [2203, 2377], [2207, 2381], [2211, 2385], [2215, 2389], [2219, 2393], [2223, 2397], [2226, 2262], [2261, 2263], [2262, 2264, 2400], [2263, 2265], [2227, 2264, 2266], [2265, 2267], [2266, 2268, 2401], [2267, 2269], [2228, 2268, 2270], [2269, 2271], [2270, 2272, 2402], [2271, 2273], [2229, 2272, 2274], [2273, 2275], [2274, 2276, 2403], [2275, 2277], [2230, 2276, 2278], [2277, 2279], [2278, 2280, 2404], [2279, 2281], [2231, 2280, 2282], [2281, 2283], [2282, 2284, 2405], [2283, 2285], [2232, 2284, 2286], [2285, 2287], [2286, 2288, 2406], [2287, 2289], [2233, 2288, 2290], [2289, 2291], [2290, 2292, 2407], [2291, 2293], [2234, 2292, 2294], [2293, 2295], [2294, 2296, 2408], [2295, 2297], [2235, 2296, 2298], [2297, 2299], [2298, 2300, 2409], [2299, 2301], [2236, 2300, 2302], [2301, 2303], [2302, 2304, 2410], [2303, 2305], [2237, 2304, 2306], [2305, 2307], [2306, 2308, 2411], [2307, 2309], [2238, 2308, 2310], [2309, 2311], [2310, 2312, 2412], [2311, 2313], [2239, 2312, 2314], [2313, 2315], [2314, 2316, 2413], [2315, 2317], [2240, 2316, 2318], [2317, 2319], [2318, 2320, 2414], [2319, 2321], [2241, 2320, 2322], [2321, 2323], [2322, 2324, 2415], [2323, 2325], [2242, 2324, 2326], [2325, 2327], [2326, 2328, 2416], [2327, 2329], [2243, 2328, 2330], [2329, 2331], [2330, 2332, 2417], [2331, 2333], [2244, 2332, 2334], [2333, 2335], [2334, 2336, 2418], [2335, 2337], [2245, 2336, 2338], [2337, 2339], [2338, 2340, 2419], [2339, 2341], [2246, 2340, 2342], [2341, 2343], [2342, 2344, 2420], [2343, 2345], [2247, 2344, 2346], [2345, 2347], [2346, 2348, 2421], [2347, 2349], [2248, 2348, 2350], [2349, 2351], [2350, 2352, 2422], [2351, 2353], [2249, 2352, 2354], [2353, 2355], [2354, 2356, 2423], [2355, 2357], [2250, 2356, 2358], [2357, 2359], [2358, 2360, 2424], [2359, 2361], [2251, 2360, 2362], [2361, 2363], [2362, 2364, 2425], [2363, 2365], [2252, 2364, 2366], [2365, 2367], [2366, 2368, 2426], [2367, 2369], [2253, 2368, 2370], [2369, 2371], [2370, 2372, 2427], [2371, 2373], [2254, 2372, 2374], [2373, 2375], [2374, 2376, 2428], [2375, 2377], [2255, 2376, 2378], [2377, 2379], [2378, 2380, 2429], [2379, 2381], [2256, 2380, 2382], [2381, 2383], [2382, 2384, 2430], [2383, 2385], [2257, 2384, 2386], [2385, 2387], [2386, 2388, 2431], [2387, 2389], [2258, 2388, 2390], [2389, 2391], [2390, 2392, 2432], [2391, 2393], [2259, 2392, 2394], [2393, 2395], [2394, 2396, 2433], [2395, 2397], [2260, 2396, 2398], [2397, 2399], [2398, 2434], [2263, 2437], [2267, 2441], [2271, 2445], [2275, 2449], [2279, 2453], [2283, 2457], [2287, 2461], [2291, 2465], [2295, 2469], [2299, 2473], [2303, 2477], [2307, 2481], [2311, 2485], [2315, 2489], [2319, 2493], [2323, 2497], [2327, 2501], [2331, 2505], [2335, 2509], [2339, 2513], [2343, 2517], [2347, 2521], [2351, 2525], [2355, 2529], [2359, 2533], [2363, 2537], [2367, 2541], [2371, 2545], [2375, 2549], [2379, 2553], [2383, 2557], [2387, 2561], [2391, 2565], [2395, 2569], [2399, 2573], [2436, 2574], [2435, 2437], [2400, 2436, 2438], [2437, 2439], [2438, 2440, 2575], [2439, 2441], [2401, 2440, 2442], [2441, 2443], [2442, 2444, 2576], [2443, 2445], [2402, 2444, 2446], [2445, 2447], [2446, 2448, 2577], [2447, 2449], [2403, 2448, 2450], [2449, 2451], [2450, 2452, 2578], [2451, 2453], [2404, 2452, 2454], [2453, 2455], [2454, 2456, 2579], [2455, 2457], [2405, 2456, 2458], [2457, 2459], [2458, 2460, 2580], [2459, 2461], [2406, 2460, 2462], [2461, 2463], [2462, 2464, 2581], [2463, 2465], [2407, 2464, 2466], [2465, 2467], [2466, 2468, 2582], [2467, 2469], [2408, 2468, 2470], [2469, 2471], [2470, 2472, 2583], [2471, 2473], [2409, 2472, 2474], [2473, 2475], [2474, 2476, 2584], [2475, 2477], [2410, 2476, 2478], [2477, 2479], [2478, 2480, 2585], [2479, 2481], [2411, 2480, 2482], [2481, 2483], [2482, 2484, 2586], [2483, 2485], [2412, 2484, 2486], [2485, 2487], [2486, 2488, 2587], [2487, 2489], [2413, 2488, 2490], [2489, 2491], [2490, 2492, 2588], [2491, 2493], [2414, 2492, 2494], [2493, 2495], [2494, 2496, 2589], [2495, 2497], [2415, 2496, 2498], [2497, 2499], [2498, 2500, 2590], [2499, 2501], [2416, 2500, 2502], [2501, 2503], [2502, 2504, 2591], [2503, 2505], [2417, 2504, 2506], [2505, 2507], [2506, 2508, 2592], [2507, 2509], [2418, 2508, 2510], [2509, 2511], [2510, 2512, 2593], [2511, 2513], [2419, 2512, 2514], [2513, 2515], [2514, 2516, 2594], [2515, 2517], [2420, 2516, 2518], [2517, 2519], [2518, 2520, 2595], [2519, 2521], [2421, 2520, 2522], [2521, 2523], [2522, 2524, 2596], [2523, 2525], [2422, 2524, 2526], [2525, 2527], [2526, 2528, 2597], [2527, 2529], [2423, 2528, 2530], [2529, 2531], [2530, 2532, 2598], [2531, 2533], [2424, 2532, 2534], [2533, 2535], [2534, 2536, 2599], [2535, 2537], [2425, 2536, 2538], [2537, 2539], [2538, 2540, 2600], [2539, 2541], [2426, 2540, 2542], [2541, 2543], [2542, 2544, 2601], [2543, 2545], [2427, 2544, 2546], [2545, 2547], [2546, 2548, 2602], [2547, 2549], [2428, 2548, 2550], [2549, 2551], [2550, 2552, 2603], [2551, 2553], [2429, 2552, 2554], [2553, 2555], [2554, 2556, 2604], [2555, 2557], [2430, 2556, 2558], [2557, 2559], [2558, 2560, 2605], [2559, 2561], [2431, 2560, 2562], [2561, 2563], [2562, 2564, 2606], [2563, 2565], [2432, 2564, 2566], [2565, 2567], [2566, 2568, 2607], [2567, 2569], [2433, 2568, 2570], [2569, 2571], [2570, 2572, 2608], [2571, 2573], [2434, 2572], [2435, 2609], [2439, 2613], [2443, 2617], [2447, 2621], [2451, 2625], [2455, 2629], [2459, 2633], [2463, 2637], [2467, 2641], [2471, 2645], [2475, 2649], [2479, 2653], [2483, 2657], [2487, 2661], [2491, 2665], [2495, 2669], [2499, 2673], [2503, 2677], [2507, 2681], [2511, 2685], [2515, 2689], [2519, 2693], [2523, 2697], [2527, 2701], [2531, 2705], [2535, 2709], [2539, 2713], [2543, 2717], [2547, 2721], [2551, 2725], [2555, 2729], [2559, 2733], [2563, 2737], [2567, 2741], [2571, 2745], [2574, 2610], [2609, 2611], [2610, 2612, 2748], [2611, 2613], [2575, 2612, 2614], [2613, 2615], [2614, 2616, 2749], [2615, 2617], [2576, 2616, 2618], [2617, 2619], [2618, 2620, 2750], [2619, 2621], [2577, 2620, 2622], [2621, 2623], [2622, 2624, 2751], [2623, 2625], [2578, 2624, 2626], [2625, 2627], [2626, 2628, 2752], [2627, 2629], [2579, 2628, 2630], [2629, 2631], [2630, 2632, 2753], [2631, 2633], [2580, 2632, 2634], [2633, 2635], [2634, 2636, 2754], [2635, 2637], [2581, 2636, 2638], [2637, 2639], [2638, 2640, 2755], [2639, 2641], [2582, 2640, 2642], [2641, 2643], [2642, 2644, 2756], [2643, 2645], [2583, 2644, 2646], [2645, 2647], [2646, 2648, 2757], [2647, 2649], [2584, 2648, 2650], [2649, 2651], [2650, 2652, 2758], [2651, 2653], [2585, 2652, 2654], [2653, 2655], [2654, 2656, 2759], [2655, 2657], [2586, 2656, 2658], [2657, 2659], [2658, 2660, 2760], [2659, 2661], [2587, 2660, 2662], [2661, 2663], [2662, 2664, 2761], [2663, 2665], [2588, 2664, 2666], [2665, 2667], [2666, 2668, 2762], [2667, 2669], [2589, 2668, 2670], [2669, 2671], [2670, 2672, 2763], [2671, 2673], [2590, 2672, 2674], [2673, 2675], [2674, 2676, 2764], [2675, 2677], [2591, 2676, 2678], [2677, 2679], [2678, 2680, 2765], [2679, 2681], [2592, 2680, 2682], [2681, 2683], [2682, 2684, 2766], [2683, 2685], [2593, 2684, 2686], [2685, 2687], [2686, 2688, 2767], [2687, 2689], [2594, 2688, 2690], [2689, 2691], [2690, 2692, 2768], [2691, 2693], [2595, 2692, 2694], [2693, 2695], [2694, 2696, 2769], [2695, 2697], [2596, 2696, 2698], [2697, 2699], [2698, 2700, 2770], [2699, 2701], [2597, 2700, 2702], [2701, 2703], [2702, 2704, 2771], [2703, 2705], [2598, 2704, 2706], [2705, 2707], [2706, 2708, 2772], [2707, 2709], [2599, 2708, 2710], [2709, 2711], [2710, 2712, 2773], [2711, 2713], [2600, 2712, 2714], [2713, 2715], [2714, 2716, 2774], [2715, 2717], [2601, 2716, 2718], [2717, 2719], [2718, 2720, 2775], [2719, 2721], [2602, 2720, 2722], [2721, 2723], [2722, 2724, 2776], [2723, 2725], [2603, 2724, 2726], [2725, 2727], [2726, 2728, 2777], [2727, 2729], [2604, 2728, 2730], [2729, 2731], [2730, 2732, 2778], [2731, 2733], [2605, 2732, 2734], [2733, 2735], [2734, 2736, 2779], [2735, 2737], [2606, 2736, 2738], [2737, 2739], [2738, 2740, 2780], [2739, 2741], [2607, 2740, 2742], [2741, 2743], [2742, 2744, 2781], [2743, 2745], [2608, 2744, 2746], [2745, 2747], [2746, 2782], [2611, 2785], [2615, 2789], [2619, 2793], [2623, 2797], [2627, 2801], [2631, 2805], [2635, 2809], [2639, 2813], [2643, 2817], [2647, 2821], [2651, 2825], [2655, 2829], [2659, 2833], [2663, 2837], [2667, 2841], [2671, 2845], [2675, 2849], [2679, 2853], [2683, 2857], [2687, 2861], [2691, 2865], [2695, 2869], [2699, 2873], [2703, 2877], [2707, 2881], [2711, 2885], [2715, 2889], [2719, 2893], [2723, 2897], [2727, 2901], [2731, 2905], [2735, 2909], [2739, 2913], [2743, 2917], [2747, 2921], [2784, 2922], [2783, 2785], [2748, 2784, 2786], [2785, 2787], [2786, 2788, 2923], [2787, 2789], [2749, 2788, 2790], [2789, 2791], [2790, 2792, 2924], [2791, 2793], [2750, 2792, 2794], [2793, 2795], [2794, 2796, 2925], [2795, 2797], [2751, 2796, 2798], [2797, 2799], [2798, 2800, 2926], [2799, 2801], [2752, 2800, 2802], [2801, 2803], [2802, 2804, 2927], [2803, 2805], [2753, 2804, 2806], [2805, 2807], [2806, 2808, 2928], [2807, 2809], [2754, 2808, 2810], [2809, 2811], [2810, 2812, 2929], [2811, 2813], [2755, 2812, 2814], [2813, 2815], [2814, 2816, 2930], [2815, 2817], [2756, 2816, 2818], [2817, 2819], [2818, 2820, 2931], [2819, 2821], [2757, 2820, 2822], [2821, 2823], [2822, 2824, 2932], [2823, 2825], [2758, 2824, 2826], [2825, 2827], [2826, 2828, 2933], [2827, 2829], [2759, 2828, 2830], [2829, 2831], [2830, 2832, 2934], [2831, 2833], [2760, 2832, 2834], [2833, 2835], [2834, 2836, 2935], [2835, 2837], [2761, 2836, 2838], [2837, 2839], [2838, 2840, 2936], [2839, 2841], [2762, 2840, 2842], [2841, 2843], [2842, 2844, 2937], [2843, 2845], [2763, 2844, 2846], [2845, 2847], [2846, 2848, 2938], [2847, 2849], [2764, 2848, 2850], [2849, 2851], [2850, 2852, 2939], [2851, 2853], [2765, 2852, 2854], [2853, 2855], [2854, 2856, 2940], [2855, 2857], [2766, 2856, 2858], [2857, 2859], [2858, 2860, 2941], [2859, 2861], [2767, 2860, 2862], [2861, 2863], [2862, 2864, 2942], [2863, 2865], [2768, 2864, 2866], [2865, 2867], [2866, 2868, 2943], [2867, 2869], [2769, 2868, 2870], [2869, 2871], [2870, 2872, 2944], [2871, 2873], [2770, 2872, 2874], [2873, 2875], [2874, 2876, 2945], [2875, 2877], [2771, 2876, 2878], [2877, 2879], [2878, 2880, 2946], [2879, 2881], [2772, 2880, 2882], [2881, 2883], [2882, 2884, 2947], [2883, 2885], [2773, 2884, 2886], [2885, 2887], [2886, 2888, 2948], [2887, 2889], [2774, 2888, 2890], [2889, 2891], [2890, 2892, 2949], [2891, 2893], [2775, 2892, 2894], [2893, 2895], [2894, 2896, 2950], [2895, 2897], [2776, 2896, 2898], [2897, 2899], [2898, 2900, 2951], [2899, 2901], [2777, 2900, 2902], [2901, 2903], [2902, 2904, 2952], [2903, 2905], [2778, 2904, 2906], [2905, 2907], [2906, 2908, 2953], [2907, 2909], [2779, 2908, 2910], [2909, 2911], [2910, 2912, 2954], [2911, 2913], [2780, 2912, 2914], [2913, 2915], [2914, 2916, 2955], [2915, 2917], [2781, 2916, 2918], [2917, 2919], [2918, 2920, 2956], [2919, 2921], [2782, 2920], [2783, 2957], [2787, 2961], [2791, 2965], [2795, 2969], [2799, 2973], [2803, 2977], [2807, 2981], [2811, 2985], [2815, 2989], [2819, 2993], [2823, 2997], [2827, 3001], [2831, 3005], [2835, 3009], [2839, 3013], [2843, 3017], [2847, 3021], [2851, 3025], [2855, 3029], [2859, 3033], [2863, 3037], [2867, 3041], [2871, 3045], [2875, 3049], [2879, 3053], [2883, 3057], [2887, 3061], [2891, 3065], [2895, 3069], [2899, 3073], [2903, 3077], [2907, 3081], [2911, 3085], [2915, 3089], [2919, 3093], [2922, 2958], [2957, 2959], [2958, 2960, 3096], [2959, 2961], [2923, 2960, 2962], [2961, 2963], [2962, 2964, 3097], [2963, 2965], [2924, 2964, 2966], [2965, 2967], [2966, 2968, 3098], [2967, 2969], [2925, 2968, 2970], [2969, 2971], [2970, 2972, 3099], [2971, 2973], [2926, 2972, 2974], [2973, 2975], [2974, 2976, 3100], [2975, 2977], [2927, 2976, 2978], [2977, 2979], [2978, 2980, 3101], [2979, 2981], [2928, 2980, 2982], [2981, 2983], [2982, 2984, 3102], [2983, 2985], [2929, 2984, 2986], [2985, 2987], [2986, 2988, 3103], [2987, 2989], [2930, 2988, 2990], [2989, 2991], [2990, 2992, 3104], [2991, 2993], [2931, 2992, 2994], [2993, 2995], [2994, 2996, 3105], [2995, 2997], [2932, 2996, 2998], [2997, 2999], [2998, 3000, 3106], [2999, 3001], [2933, 3000, 3002], [3001, 3003], [3002, 3004, 3107], [3003, 3005], [2934, 3004, 3006], [3005, 3007], [3006, 3008, 3108], [3007, 3009], [2935, 3008, 3010], [3009, 3011], [3010, 3012, 3109], [3011, 3013], [2936, 3012, 3014], [3013, 3015], [3014, 3016, 3110], [3015, 3017], [2937, 3016, 3018], [3017, 3019], [3018, 3020, 3111], [3019, 3021], [2938, 3020, 3022], [3021, 3023], [3022, 3024, 3112], [3023, 3025], [2939, 3024, 3026], [3025, 3027], [3026, 3028, 3113], [3027, 3029], [2940, 3028, 3030], [3029, 3031], [3030, 3032, 3114], [3031, 3033], [2941, 3032, 3034], [3033, 3035], [3034, 3036, 3115], [3035, 3037], [2942, 3036, 3038], [3037, 3039], [3038, 3040, 3116], [3039, 3041], [2943, 3040, 3042], [3041, 3043], [3042, 3044, 3117], [3043, 3045], [2944, 3044, 3046], [3045, 3047], [3046, 3048, 3118], [3047, 3049], [2945, 3048, 3050], [3049, 3051], [3050, 3052, 3119], [3051, 3053], [2946, 3052, 3054], [3053, 3055], [3054, 3056, 3120], [3055, 3057], [2947, 3056, 3058], [3057, 3059], [3058, 3060, 3121], [3059, 3061], [2948, 3060, 3062], [3061, 3063], [3062, 3064, 3122], [3063, 3065], [2949, 3064, 3066], [3065, 3067], [3066, 3068, 3123], [3067, 3069], [2950, 3068, 3070], [3069, 3071], [3070, 3072, 3124], [3071, 3073], [2951, 3072, 3074], [3073, 3075], [3074, 3076, 3125], [3075, 3077], [2952, 3076, 3078], [3077, 3079], [3078, 3080, 3126], [3079, 3081], [2953, 3080, 3082], [3081, 3083], [3082, 3084, 3127], [3083, 3085], [2954, 3084, 3086], [3085, 3087], [3086, 3088, 3128], [3087, 3089], [2955, 3088, 3090], [3089, 3091], [3090, 3092, 3129], [3091, 3093], [2956, 3092, 3094], [3093, 3095], [3094, 3130], [2959, 3133], [2963, 3137], [2967, 3141], [2971, 3145], [2975, 3149], [2979, 3153], [2983, 3157], [2987, 3161], [2991, 3165], [2995, 3169], [2999, 3173], [3003, 3177], [3007, 3181], [3011, 3185], [3015, 3189], [3019, 3193], [3023, 3197], [3027, 3201], [3031, 3205], [3035, 3209], [3039, 3213], [3043, 3217], [3047, 3221], [3051, 3225], [3055, 3229], [3059, 3233], [3063, 3237], [3067, 3241], [3071, 3245], [3075, 3249], [3079, 3253], [3083, 3257], [3087, 3261], [3091, 3265], [3095, 3269], [3132, 3270], [3131, 3133], [3096, 3132, 3134], [3133, 3135], [3134, 3136, 3271], [3135, 3137], [3097, 3136, 3138], [3137, 3139], [3138, 3140, 3272], [3139, 3141], [3098, 3140, 3142], [3141, 3143], [3142, 3144, 3273], [3143, 3145], [3099, 3144, 3146], [3145, 3147], [3146, 3148, 3274], [3147, 3149], [3100, 3148, 3150], [3149, 3151], [3150, 3152, 3275], [3151, 3153], [3101, 3152, 3154], [3153, 3155], [3154, 3156, 3276], [3155, 3157], [3102, 3156, 3158], [3157, 3159], [3158, 3160, 3277], [3159, 3161], [3103, 3160, 3162], [3161, 3163], [3162, 3164, 3278], [3163, 3165], [3104, 3164, 3166], [3165, 3167], [3166, 3168, 3279], [3167, 3169], [3105, 3168, 3170], [3169, 3171], [3170, 3172, 3280], [3171, 3173], [3106, 3172, 3174], [3173, 3175], [3174, 3176, 3281], [3175, 3177], [3107, 3176, 3178], [3177, 3179], [3178, 3180, 3282], [3179, 3181], [3108, 3180, 3182], [3181, 3183], [3182, 3184, 3283], [3183, 3185], [3109, 3184, 3186], [3185, 3187], [3186, 3188, 3284], [3187, 3189], [3110, 3188, 3190], [3189, 3191], [3190, 3192, 3285], [3191, 3193], [3111, 3192, 3194], [3193, 3195], [3194, 3196, 3286], [3195, 3197], [3112, 3196, 3198], [3197, 3199], [3198, 3200, 3287], [3199, 3201], [3113, 3200, 3202], [3201, 3203], [3202, 3204, 3288], [3203, 3205], [3114, 3204, 3206], [3205, 3207], [3206, 3208, 3289], [3207, 3209], [3115, 3208, 3210], [3209, 3211], [3210, 3212, 3290], [3211, 3213], [3116, 3212, 3214], [3213, 3215], [3214, 3216, 3291], [3215, 3217], [3117, 3216, 3218], [3217, 3219], [3218, 3220, 3292], [3219, 3221], [3118, 3220, 3222], [3221, 3223], [3222, 3224, 3293], [3223, 3225], [3119, 3224, 3226], [3225, 3227], [3226, 3228, 3294], [3227, 3229], [3120, 3228, 3230], [3229, 3231], [3230, 3232, 3295], [3231, 3233], [3121, 3232, 3234], [3233, 3235], [3234, 3236, 3296], [3235, 3237], [3122, 3236, 3238], [3237, 3239], [3238, 3240, 3297], [3239, 3241], [3123, 3240, 3242], [3241, 3243], [3242, 3244, 3298], [3243, 3245], [3124, 3244, 3246], [3245, 3247], [3246, 3248, 3299], [3247, 3249], [3125, 3248, 3250], [3249, 3251], [3250, 3252, 3300], [3251, 3253], [3126, 3252, 3254], [3253, 3255], [3254, 3256, 3301], [3255, 3257], [3127, 3256, 3258], [3257, 3259], [3258, 3260, 3302], [3259, 3261], [3128, 3260, 3262], [3261, 3263], [3262, 3264, 3303], [3263, 3265], [3129, 3264, 3266], [3265, 3267], [3266, 3268, 3304], [3267, 3269], [3130, 3268], [3131, 3305], [3135, 3309], [3139, 3313], [3143, 3317], [3147, 3321], [3151, 3325], [3155, 3329], [3159, 3333], [3163, 3337], [3167, 3341], [3171, 3345], [3175, 3349], [3179, 3353], [3183, 3357], [3187, 3361], [3191, 3365], [3195, 3369], [3199, 3373], [3203, 3377], [3207, 3381], [3211, 3385], [3215, 3389], [3219, 3393], [3223, 3397], [3227, 3401], [3231, 3405], [3235, 3409], [3239, 3413], [3243, 3417], [3247, 3421], [3251, 3425], [3255, 3429], [3259, 3433], [3263, 3437], [3267, 3441], [3270, 3306], [3305, 3307], [3306, 3308, 3444], [3307, 3309], [3271, 3308, 3310], [3309, 3311], [3310, 3312, 3445], [3311, 3313], [3272, 3312, 3314], [3313, 3315], [3314, 3316, 3446], [3315, 3317], [3273, 3316, 3318], [3317, 3319], [3318, 3320, 3447], [3319, 3321], [3274, 3320, 3322], [3321, 3323], [3322, 3324, 3448], [3323, 3325], [3275, 3324, 3326], [3325, 3327], [3326, 3328, 3449], [3327, 3329], [3276, 3328, 3330], [3329, 3331], [3330, 3332, 3450], [3331, 3333], [3277, 3332, 3334], [3333, 3335], [3334, 3336, 3451], [3335, 3337], [3278, 3336, 3338], [3337, 3339], [3338, 3340, 3452], [3339, 3341], [3279, 3340, 3342], [3341, 3343], [3342, 3344, 3453], [3343, 3345], [3280, 3344, 3346], [3345, 3347], [3346, 3348, 3454], [3347, 3349], [3281, 3348, 3350], [3349, 3351], [3350, 3352, 3455], [3351, 3353], [3282, 3352, 3354], [3353, 3355], [3354, 3356, 3456], [3355, 3357], [3283, 3356, 3358], [3357, 3359], [3358, 3360, 3457], [3359, 3361], [3284, 3360, 3362], [3361, 3363], [3362, 3364, 3458], [3363, 3365], [3285, 3364, 3366], [3365, 3367], [3366, 3368, 3459], [3367, 3369], [3286, 3368, 3370], [3369, 3371], [3370, 3372, 3460], [3371, 3373], [3287, 3372, 3374], [3373, 3375], [3374, 3376, 3461], [3375, 3377], [3288, 3376, 3378], [3377, 3379], [3378, 3380, 3462], [3379, 3381], [3289, 3380, 3382], [3381, 3383], [3382, 3384, 3463], [3383, 3385], [3290, 3384, 3386], [3385, 3387], [3386, 3388, 3464], [3387, 3389], [3291, 3388, 3390], [3389, 3391], [3390, 3392, 3465], [3391, 3393], [3292, 3392, 3394], [3393, 3395], [3394, 3396, 3466], [3395, 3397], [3293, 3396, 3398], [3397, 3399], [3398, 3400, 3467], [3399, 3401], [3294, 3400, 3402], [3401, 3403], [3402, 3404, 3468], [3403, 3405], [3295, 3404, 3406], [3405, 3407], [3406, 3408, 3469], [3407, 3409], [3296, 3408, 3410], [3409, 3411], [3410, 3412, 3470], [3411, 3413], [3297, 3412, 3414], [3413, 3415], [3414, 3416, 3471], [3415, 3417], [3298, 3416, 3418], [3417, 3419], [3418, 3420, 3472], [3419, 3421], [3299, 3420, 3422], [3421, 3423], [3422, 3424, 3473], [3423, 3425], [3300, 3424, 3426], [3425, 3427], [3426, 3428, 3474], [3427, 3429], [3301, 3428, 3430], [3429, 3431], [3430, 3432, 3475], [3431, 3433], [3302, 3432, 3434], [3433, 3435], [3434, 3436, 3476], [3435, 3437], [3303, 3436, 3438], [3437, 3439], [3438, 3440, 3477], [3439, 3441], [3304, 3440, 3442], [3441, 3443], [3442, 3478], [3307, 3481], [3311, 3485], [3315, 3489], [3319, 3493], [3323, 3497], [3327, 3501], [3331, 3505], [3335, 3509], [3339, 3513], [3343, 3517], [3347, 3521], [3351, 3525], [3355, 3529], [3359, 3533], [3363, 3537], [3367, 3541], [3371, 3545], [3375, 3549], [3379, 3553], [3383, 3557], [3387, 3561], [3391, 3565], [3395, 3569], [3399, 3573], [3403, 3577], [3407, 3581], [3411, 3585], [3415, 3589], [3419, 3593], [3423, 3597], [3427, 3601], [3431, 3605], [3435, 3609], [3439, 3613], [3443, 3617], [3480, 3618], [3479, 3481], [3444, 3480, 3482], [3481, 3483], [3482, 3484, 3619], [3483, 3485], [3445, 3484, 3486], [3485, 3487], [3486, 3488, 3620], [3487, 3489], [3446, 3488, 3490], [3489, 3491], [3490, 3492, 3621], [3491, 3493], [3447, 3492, 3494], [3493, 3495], [3494, 3496, 3622], [3495, 3497], [3448, 3496, 3498], [3497, 3499], [3498, 3500, 3623], [3499, 3501], [3449, 3500, 3502], [3501, 3503], [3502, 3504, 3624], [3503, 3505], [3450, 3504, 3506], [3505, 3507], [3506, 3508, 3625], [3507, 3509], [3451, 3508, 3510], [3509, 3511], [3510, 3512, 3626], [3511, 3513], [3452, 3512, 3514], [3513, 3515], [3514, 3516, 3627], [3515, 3517], [3453, 3516, 3518], [3517, 3519], [3518, 3520, 3628], [3519, 3521], [3454, 3520, 3522], [3521, 3523], [3522, 3524, 3629], [3523, 3525], [3455, 3524, 3526], [3525, 3527], [3526, 3528, 3630], [3527, 3529], [3456, 3528, 3530], [3529, 3531], [3530, 3532, 3631], [3531, 3533], [3457, 3532, 3534], [3533, 3535], [3534, 3536, 3632], [3535, 3537], [3458, 3536, 3538], [3537, 3539], [3538, 3540, 3633], [3539, 3541], [3459, 3540, 3542], [3541, 3543], [3542, 3544, 3634], [3543, 3545], [3460, 3544, 3546], [3545, 3547], [3546, 3548, 3635], [3547, 3549], [3461, 3548, 3550], [3549, 3551], [3550, 3552, 3636], [3551, 3553], [3462, 3552, 3554], [3553, 3555], [3554, 3556, 3637], [3555, 3557], [3463, 3556, 3558], [3557, 3559], [3558, 3560, 3638], [3559, 3561], [3464, 3560, 3562], [3561, 3563], [3562, 3564, 3639], [3563, 3565], [3465, 3564, 3566], [3565, 3567], [3566, 3568, 3640], [3567, 3569], [3466, 3568, 3570], [3569, 3571], [3570, 3572, 3641], [3571, 3573], [3467, 3572, 3574], [3573, 3575], [3574, 3576, 3642], [3575, 3577], [3468, 3576, 3578], [3577, 3579], [3578, 3580, 3643], [3579, 3581], [3469, 3580, 3582], [3581, 3583], [3582, 3584, 3644], [3583, 3585], [3470, 3584, 3586], [3585, 3587], [3586, 3588, 3645], [3587, 3589], [3471, 3588, 3590], [3589, 3591], [3590, 3592, 3646], [3591, 3593], [3472, 3592, 3594], [3593, 3595], [3594, 3596, 3647], [3595, 3597], [3473, 3596, 3598], [3597, 3599], [3598, 3600, 3648], [3599, 3601], [3474, 3600, 3602], [3601, 3603], [3602, 3604, 3649], [3603, 3605], [3475, 3604, 3606], [3605, 3607], [3606, 3608, 3650], [3607, 3609], [3476, 3608, 3610], [3609, 3611], [3610, 3612, 3651], [3611, 3613], [3477, 3612, 3614], [3613, 3615], [3614, 3616, 3652], [3615, 3617], [3478, 3616], [3479, 3653], [3483, 3657], [3487, 3661], [3491, 3665], [3495, 3669], [3499, 3673], [3503, 3677], [3507, 3681], [3511, 3685], [3515, 3689], [3519, 3693], [3523, 3697], [3527, 3701], [3531, 3705], [3535, 3709], [3539, 3713], [3543, 3717], [3547, 3721], [3551, 3725], [3555, 3729], [3559, 3733], [3563, 3737], [3567, 3741], [3571, 3745], [3575, 3749], [3579, 3753], [3583, 3757], [3587, 3761], [3591, 3765], [3595, 3769], [3599, 3773], [3603, 3777], [3607, 3781], [3611, 3785], [3615, 3789], [3618, 3654], [3653, 3655], [3654, 3656, 3792], [3655, 3657], [3619, 3656, 3658], [3657, 3659], [3658, 3660, 3793], [3659, 3661], [3620, 3660, 3662], [3661, 3663], [3662, 3664, 3794], [3663, 3665], [3621, 3664, 3666], [3665, 3667], [3666, 3668, 3795], [3667, 3669], [3622, 3668, 3670], [3669, 3671], [3670, 3672, 3796], [3671, 3673], [3623, 3672, 3674], [3673, 3675], [3674, 3676, 3797], [3675, 3677], [3624, 3676, 3678], [3677, 3679], [3678, 3680, 3798], [3679, 3681], [3625, 3680, 3682], [3681, 3683], [3682, 3684, 3799], [3683, 3685], [3626, 3684, 3686], [3685, 3687], [3686, 3688, 3800], [3687, 3689], [3627, 3688, 3690], [3689, 3691], [3690, 3692, 3801], [3691, 3693], [3628, 3692, 3694], [3693, 3695], [3694, 3696, 3802], [3695, 3697], [3629, 3696, 3698], [3697, 3699], [3698, 3700, 3803], [3699, 3701], [3630, 3700, 3702], [3701, 3703], [3702, 3704, 3804], [3703, 3705], [3631, 3704, 3706], [3705, 3707], [3706, 3708, 3805], [3707, 3709], [3632, 3708, 3710], [3709, 3711], [3710, 3712, 3806], [3711, 3713], [3633, 3712, 3714], [3713, 3715], [3714, 3716, 3807], [3715, 3717], [3634, 3716, 3718], [3717, 3719], [3718, 3720, 3808], [3719, 3721], [3635, 3720, 3722], [3721, 3723], [3722, 3724, 3809], [3723, 3725], [3636, 3724, 3726], [3725, 3727], [3726, 3728, 3810], [3727, 3729], [3637, 3728, 3730], [3729, 3731], [3730, 3732, 3811], [3731, 3733], [3638, 3732, 3734], [3733, 3735], [3734, 3736, 3812], [3735, 3737], [3639, 3736, 3738], [3737, 3739], [3738, 3740, 3813], [3739, 3741], [3640, 3740, 3742], [3741, 3743], [3742, 3744, 3814], [3743, 3745], [3641, 3744, 3746], [3745, 3747], [3746, 3748, 3815], [3747, 3749], [3642, 3748, 3750], [3749, 3751], [3750, 3752, 3816], [3751, 3753], [3643, 3752, 3754], [3753, 3755], [3754, 3756, 3817], [3755, 3757], [3644, 3756, 3758], [3757, 3759], [3758, 3760, 3818], [3759, 3761], [3645, 3760, 3762], [3761, 3763], [3762, 3764, 3819], [3763, 3765], [3646, 3764, 3766], [3765, 3767], [3766, 3768, 3820], [3767, 3769], [3647, 3768, 3770], [3769, 3771], [3770, 3772, 3821], [3771, 3773], [3648, 3772, 3774], [3773, 3775], [3774, 3776, 3822], [3775, 3777], [3649, 3776, 3778], [3777, 3779], [3778, 3780, 3823], [3779, 3781], [3650, 3780, 3782], [3781, 3783], [3782, 3784, 3824], [3783, 3785], [3651, 3784, 3786], [3785, 3787], [3786, 3788, 3825], [3787, 3789], [3652, 3788, 3790], [3789, 3791], [3790, 3826], [3655, 3829], [3659, 3833], [3663, 3837], [3667, 3841], [3671, 3845], [3675, 3849], [3679, 3853], [3683, 3857], [3687, 3861], [3691, 3865], [3695, 3869], [3699, 3873], [3703, 3877], [3707, 3881], [3711, 3885], [3715, 3889], [3719, 3893], [3723, 3897], [3727, 3901], [3731, 3905], [3735, 3909], [3739, 3913], [3743, 3917], [3747, 3921], [3751, 3925], [3755, 3929], [3759, 3933], [3763, 3937], [3767, 3941], [3771, 3945], [3775, 3949], [3779, 3953], [3783, 3957], [3787, 3961], [3791, 3965], [3828, 3966], [3827, 3829], [3792, 3828, 3830], [3829, 3831], [3830, 3832, 3967], [3831, 3833], [3793, 3832, 3834], [3833, 3835], [3834, 3836, 3968], [3835, 3837], [3794, 3836, 3838], [3837, 3839], [3838, 3840, 3969], [3839, 3841], [3795, 3840, 3842], [3841, 3843], [3842, 3844, 3970], [3843, 3845], [3796, 3844, 3846], [3845, 3847], [3846, 3848, 3971], [3847, 3849], [3797, 3848, 3850], [3849, 3851], [3850, 3852, 3972], [3851, 3853], [3798, 3852, 3854], [3853, 3855], [3854, 3856, 3973], [3855, 3857], [3799, 3856, 3858], [3857, 3859], [3858, 3860, 3974], [3859, 3861], [3800, 3860, 3862], [3861, 3863], [3862, 3864, 3975], [3863, 3865], [3801, 3864, 3866], [3865, 3867], [3866, 3868, 3976], [3867, 3869], [3802, 3868, 3870], [3869, 3871], [3870, 3872, 3977], [3871, 3873], [3803, 3872, 3874], [3873, 3875], [3874, 3876, 3978], [3875, 3877], [3804, 3876, 3878], [3877, 3879], [3878, 3880, 3979], [3879, 3881], [3805, 3880, 3882], [3881, 3883], [3882, 3884, 3980], [3883, 3885], [3806, 3884, 3886], [3885, 3887], [3886, 3888, 3981], [3887, 3889], [3807, 3888, 3890], [3889, 3891], [3890, 3892, 3982], [3891, 3893], [3808, 3892, 3894], [3893, 3895], [3894, 3896, 3983], [3895, 3897], [3809, 3896, 3898], [3897, 3899], [3898, 3900, 3984], [3899, 3901], [3810, 3900, 3902], [3901, 3903], [3902, 3904, 3985], [3903, 3905], [3811, 3904, 3906], [3905, 3907], [3906, 3908, 3986], [3907, 3909], [3812, 3908, 3910], [3909, 3911], [3910, 3912, 3987], [3911, 3913], [3813, 3912, 3914], [3913, 3915], [3914, 3916, 3988], [3915, 3917], [3814, 3916, 3918], [3917, 3919], [3918, 3920, 3989], [3919, 3921], [3815, 3920, 3922], [3921, 3923], [3922, 3924, 3990], [3923, 3925], [3816, 3924, 3926], [3925, 3927], [3926, 3928, 3991], [3927, 3929], [3817, 3928, 3930], [3929, 3931], [3930, 3932, 3992], [3931, 3933], [3818, 3932, 3934], [3933, 3935], [3934, 3936, 3993], [3935, 3937], [3819, 3936, 3938], [3937, 3939], [3938, 3940, 3994], [3939, 3941], [3820, 3940, 3942], [3941, 3943], [3942, 3944, 3995], [3943, 3945], [3821, 3944, 3946], [3945, 3947], [3946, 3948, 3996], [3947, 3949], [3822, 3948, 3950], [3949, 3951], [3950, 3952, 3997], [3951, 3953], [3823, 3952, 3954], [3953, 3955], [3954, 3956, 3998], [3955, 3957], [3824, 3956, 3958], [3957, 3959], [3958, 3960, 3999], [3959, 3961], [3825, 3960, 3962], [3961, 3963], [3962, 3964, 4000], [3963, 3965], [3826, 3964], [3827, 4001], [3831, 4005], [3835, 4009], [3839, 4013], [3843, 4017], [3847, 4021], [3851, 4025], [3855, 4029], [3859, 4033], [3863, 4037], [3867, 4041], [3871, 4045], [3875, 4049], [3879, 4053], [3883, 4057], [3887, 4061], [3891, 4065], [3895, 4069], [3899, 4073], [3903, 4077], [3907, 4081], [3911, 4085], [3915, 4089], [3919, 4093], [3923, 4097], [3927, 4101], [3931, 4105], [3935, 4109], [3939, 4113], [3943, 4117], [3947, 4121], [3951, 4125], [3955, 4129], [3959, 4133], [3963, 4137], [3966, 4002], [4001, 4003], [4002, 4004, 4140], [4003, 4005], [3967, 4004, 4006], [4005, 4007], [4006, 4008, 4141], [4007, 4009], [3968, 4008, 4010], [4009, 4011], [4010, 4012, 4142], [4011, 4013], [3969, 4012, 4014], [4013, 4015], [4014, 4016, 4143], [4015, 4017], [3970, 4016, 4018], [4017, 4019], [4018, 4020, 4144], [4019, 4021], [3971, 4020, 4022], [4021, 4023], [4022, 4024, 4145], [4023, 4025], [3972, 4024, 4026], [4025, 4027], [4026, 4028, 4146], [4027, 4029], [3973, 4028, 4030], [4029, 4031], [4030, 4032, 4147], [4031, 4033], [3974, 4032, 4034], [4033, 4035], [4034, 4036, 4148], [4035, 4037], [3975, 4036, 4038], [4037, 4039], [4038, 4040, 4149], [4039, 4041], [3976, 4040, 4042], [4041, 4043], [4042, 4044, 4150], [4043, 4045], [3977, 4044, 4046], [4045, 4047], [4046, 4048, 4151], [4047, 4049], [3978, 4048, 4050], [4049, 4051], [4050, 4052, 4152], [4051, 4053], [3979, 4052, 4054], [4053, 4055], [4054, 4056, 4153], [4055, 4057], [3980, 4056, 4058], [4057, 4059], [4058, 4060, 4154], [4059, 4061], [3981, 4060, 4062], [4061, 4063], [4062, 4064, 4155], [4063, 4065], [3982, 4064, 4066], [4065, 4067], [4066, 4068, 4156], [4067, 4069], [3983, 4068, 4070], [4069, 4071], [4070, 4072, 4157], [4071, 4073], [3984, 4072, 4074], [4073, 4075], [4074, 4076, 4158], [4075, 4077], [3985, 4076, 4078], [4077, 4079], [4078, 4080, 4159], [4079, 4081], [3986, 4080, 4082], [4081, 4083], [4082, 4084, 4160], [4083, 4085], [3987, 4084, 4086], [4085, 4087], [4086, 4088, 4161], [4087, 4089], [3988, 4088, 4090], [4089, 4091], [4090, 4092, 4162], [4091, 4093], [3989, 4092, 4094], [4093, 4095], [4094, 4096, 4163], [4095, 4097], [3990, 4096, 4098], [4097, 4099], [4098, 4100, 4164], [4099, 4101], [3991, 4100, 4102], [4101, 4103], [4102, 4104, 4165], [4103, 4105], [3992, 4104, 4106], [4105, 4107], [4106, 4108, 4166], [4107, 4109], [3993, 4108, 4110], [4109, 4111], [4110, 4112, 4167], [4111, 4113], [3994, 4112, 4114], [4113, 4115], [4114, 4116, 4168], [4115, 4117], [3995, 4116, 4118], [4117, 4119], [4118, 4120, 4169], [4119, 4121], [3996, 4120, 4122], [4121, 4123], [4122, 4124, 4170], [4123, 4125], [3997, 4124, 4126], [4125, 4127], [4126, 4128, 4171], [4127, 4129], [3998, 4128, 4130], [4129, 4131], [4130, 4132, 4172], [4131, 4133], [3999, 4132, 4134], [4133, 4135], [4134, 4136, 4173], [4135, 4137], [4000, 4136, 4138], [4137, 4139], [4138, 4174], [4003, 4177], [4007, 4181], [4011, 4185], [4015, 4189], [4019, 4193], [4023, 4197], [4027, 4201], [4031, 4205], [4035, 4209], [4039, 4213], [4043, 4217], [4047, 4221], [4051, 4225], [4055, 4229], [4059, 4233], [4063, 4237], [4067, 4241], [4071, 4245], [4075, 4249], [4079, 4253], [4083, 4257], [4087, 4261], [4091, 4265], [4095, 4269], [4099, 4273], [4103, 4277], [4107, 4281], [4111, 4285], [4115, 4289], [4119, 4293], [4123, 4297], [4127, 4301], [4131, 4305], [4135, 4309], [4139, 4313], [4176, 4314], [4175, 4177], [4140, 4176, 4178], [4177, 4179], [4178, 4180, 4315], [4179, 4181], [4141, 4180, 4182], [4181, 4183], [4182, 4184, 4316], [4183, 4185], [4142, 4184, 4186], [4185, 4187], [4186, 4188, 4317], [4187, 4189], [4143, 4188, 4190], [4189, 4191], [4190, 4192, 4318], [4191, 4193], [4144, 4192, 4194], [4193, 4195], [4194, 4196, 4319], [4195, 4197], [4145, 4196, 4198], [4197, 4199], [4198, 4200, 4320], [4199, 4201], [4146, 4200, 4202], [4201, 4203], [4202, 4204, 4321], [4203, 4205], [4147, 4204, 4206], [4205, 4207], [4206, 4208, 4322], [4207, 4209], [4148, 4208, 4210], [4209, 4211], [4210, 4212, 4323], [4211, 4213], [4149, 4212, 4214], [4213, 4215], [4214, 4216, 4324], [4215, 4217], [4150, 4216, 4218], [4217, 4219], [4218, 4220, 4325], [4219, 4221], [4151, 4220, 4222], [4221, 4223], [4222, 4224, 4326], [4223, 4225], [4152, 4224, 4226], [4225, 4227], [4226, 4228, 4327], [4227, 4229], [4153, 4228, 4230], [4229, 4231], [4230, 4232, 4328], [4231, 4233], [4154, 4232, 4234], [4233, 4235], [4234, 4236, 4329], [4235, 4237], [4155, 4236, 4238], [4237, 4239], [4238, 4240, 4330], [4239, 4241], [4156, 4240, 4242], [4241, 4243], [4242, 4244, 4331], [4243, 4245], [4157, 4244, 4246], [4245, 4247], [4246, 4248, 4332], [4247, 4249], [4158, 4248, 4250], [4249, 4251], [4250, 4252, 4333], [4251, 4253], [4159, 4252, 4254], [4253, 4255], [4254, 4256, 4334], [4255, 4257], [4160, 4256, 4258], [4257, 4259], [4258, 4260, 4335], [4259, 4261], [4161, 4260, 4262], [4261, 4263], [4262, 4264, 4336], [4263, 4265], [4162, 4264, 4266], [4265, 4267], [4266, 4268, 4337], [4267, 4269], [4163, 4268, 4270], [4269, 4271], [4270, 4272, 4338], [4271, 4273], [4164, 4272, 4274], [4273, 4275], [4274, 4276, 4339], [4275, 4277], [4165, 4276, 4278], [4277, 4279], [4278, 4280, 4340], [4279, 4281], [4166, 4280, 4282], [4281, 4283], [4282, 4284, 4341], [4283, 4285], [4167, 4284, 4286], [4285, 4287], [4286, 4288, 4342], [4287, 4289], [4168, 4288, 4290], [4289, 4291], [4290, 4292, 4343], [4291, 4293], [4169, 4292, 4294], [4293, 4295], [4294, 4296, 4344], [4295, 4297], [4170, 4296, 4298], [4297, 4299], [4298, 4300, 4345], [4299, 4301], [4171, 4300, 4302], [4301, 4303], [4302, 4304, 4346], [4303, 4305], [4172, 4304, 4306], [4305, 4307], [4306, 4308, 4347], [4307, 4309], [4173, 4308, 4310], [4309, 4311], [4310, 4312, 4348], [4311, 4313], [4174, 4312], [4175, 4349], [4179, 4353], [4183, 4357], [4187, 4361], [4191, 4365], [4195, 4369], [4199, 4373], [4203, 4377], [4207, 4381], [4211, 4385], [4215, 4389], [4219, 4393], [4223, 4397], [4227, 4401], [4231, 4405], [4235, 4409], [4239, 4413], [4243, 4417], [4247, 4421], [4251, 4425], [4255, 4429], [4259, 4433], [4263, 4437], [4267, 4441], [4271, 4445], [4275, 4449], [4279, 4453], [4283, 4457], [4287, 4461], [4291, 4465], [4295, 4469], [4299, 4473], [4303, 4477], [4307, 4481], [4311, 4485], [4314, 4350], [4349, 4351], [4350, 4352, 4488], [4351, 4353], [4315, 4352, 4354], [4353, 4355], [4354, 4356, 4489], [4355, 4357], [4316, 4356, 4358], [4357, 4359], [4358, 4360, 4490], [4359, 4361], [4317, 4360, 4362], [4361, 4363], [4362, 4364, 4491], [4363, 4365], [4318, 4364, 4366], [4365, 4367], [4366, 4368, 4492], [4367, 4369], [4319, 4368, 4370], [4369, 4371], [4370, 4372, 4493], [4371, 4373], [4320, 4372, 4374], [4373, 4375], [4374, 4376, 4494], [4375, 4377], [4321, 4376, 4378], [4377, 4379], [4378, 4380, 4495], [4379, 4381], [4322, 4380, 4382], [4381, 4383], [4382, 4384, 4496], [4383, 4385], [4323, 4384, 4386], [4385, 4387], [4386, 4388, 4497], [4387, 4389], [4324, 4388, 4390], [4389, 4391], [4390, 4392, 4498], [4391, 4393], [4325, 4392, 4394], [4393, 4395], [4394, 4396, 4499], [4395, 4397], [4326, 4396, 4398], [4397, 4399], [4398, 4400, 4500], [4399, 4401], [4327, 4400, 4402], [4401, 4403], [4402, 4404, 4501], [4403, 4405], [4328, 4404, 4406], [4405, 4407], [4406, 4408, 4502], [4407, 4409], [4329, 4408, 4410], [4409, 4411], [4410, 4412, 4503], [4411, 4413], [4330, 4412, 4414], [4413, 4415], [4414, 4416, 4504], [4415, 4417], [4331, 4416, 4418], [4417, 4419], [4418, 4420, 4505], [4419, 4421], [4332, 4420, 4422], [4421, 4423], [4422, 4424, 4506], [4423, 4425], [4333, 4424, 4426], [4425, 4427], [4426, 4428, 4507], [4427, 4429], [4334, 4428, 4430], [4429, 4431], [4430, 4432, 4508], [4431, 4433], [4335, 4432, 4434], [4433, 4435], [4434, 4436, 4509], [4435, 4437], [4336, 4436, 4438], [4437, 4439], [4438, 4440, 4510], [4439, 4441], [4337, 4440, 4442], [4441, 4443], [4442, 4444, 4511], [4443, 4445], [4338, 4444, 4446], [4445, 4447], [4446, 4448, 4512], [4447, 4449], [4339, 4448, 4450], [4449, 4451], [4450, 4452, 4513], [4451, 4453], [4340, 4452, 4454], [4453, 4455], [4454, 4456, 4514], [4455, 4457], [4341, 4456, 4458], [4457, 4459], [4458, 4460, 4515], [4459, 4461], [4342, 4460, 4462], [4461, 4463], [4462, 4464, 4516], [4463, 4465], [4343, 4464, 4466], [4465, 4467], [4466, 4468, 4517], [4467, 4469], [4344, 4468, 4470], [4469, 4471], [4470, 4472, 4518], [4471, 4473], [4345, 4472, 4474], [4473, 4475], [4474, 4476, 4519], [4475, 4477], [4346, 4476, 4478], [4477, 4479], [4478, 4480, 4520], [4479, 4481], [4347, 4480, 4482], [4481, 4483], [4482, 4484, 4521], [4483, 4485], [4348, 4484, 4486], [4485, 4487], [4486, 4522], [4351, 4525], [4355, 4529], [4359, 4533], [4363, 4537], [4367, 4541], [4371, 4545], [4375, 4549], [4379, 4553], [4383, 4557], [4387, 4561], [4391, 4565], [4395, 4569], [4399, 4573], [4403, 4577], [4407, 4581], [4411, 4585], [4415, 4589], [4419, 4593], [4423, 4597], [4427, 4601], [4431, 4605], [4435, 4609], [4439, 4613], [4443, 4617], [4447, 4621], [4451, 4625], [4455, 4629], [4459, 4633], [4463, 4637], [4467, 4641], [4471, 4645], [4475, 4649], [4479, 4653], [4483, 4657], [4487, 4661], [4524, 4662], [4523, 4525], [4488, 4524, 4526], [4525, 4527], [4526, 4528, 4663], [4527, 4529], [4489, 4528, 4530], [4529, 4531], [4530, 4532, 4664], [4531, 4533], [4490, 4532, 4534], [4533, 4535], [4534, 4536, 4665], [4535, 4537], [4491, 4536, 4538], [4537, 4539], [4538, 4540, 4666], [4539, 4541], [4492, 4540, 4542], [4541, 4543], [4542, 4544, 4667], [4543, 4545], [4493, 4544, 4546], [4545, 4547], [4546, 4548, 4668], [4547, 4549], [4494, 4548, 4550], [4549, 4551], [4550, 4552, 4669], [4551, 4553], [4495, 4552, 4554], [4553, 4555], [4554, 4556, 4670], [4555, 4557], [4496, 4556, 4558], [4557, 4559], [4558, 4560, 4671], [4559, 4561], [4497, 4560, 4562], [4561, 4563], [4562, 4564, 4672], [4563, 4565], [4498, 4564, 4566], [4565, 4567], [4566, 4568, 4673], [4567, 4569], [4499, 4568, 4570], [4569, 4571], [4570, 4572, 4674], [4571, 4573], [4500, 4572, 4574], [4573, 4575], [4574, 4576, 4675], [4575, 4577], [4501, 4576, 4578], [4577, 4579], [4578, 4580, 4676], [4579, 4581], [4502, 4580, 4582], [4581, 4583], [4582, 4584, 4677], [4583, 4585], [4503, 4584, 4586], [4585, 4587], [4586, 4588, 4678], [4587, 4589], [4504, 4588, 4590], [4589, 4591], [4590, 4592, 4679], [4591, 4593], [4505, 4592, 4594], [4593, 4595], [4594, 4596, 4680], [4595, 4597], [4506, 4596, 4598], [4597, 4599], [4598, 4600, 4681], [4599, 4601], [4507, 4600, 4602], [4601, 4603], [4602, 4604, 4682], [4603, 4605], [4508, 4604, 4606], [4605, 4607], [4606, 4608, 4683], [4607, 4609], [4509, 4608, 4610], [4609, 4611], [4610, 4612, 4684], [4611, 4613], [4510, 4612, 4614], [4613, 4615], [4614, 4616, 4685], [4615, 4617], [4511, 4616, 4618], [4617, 4619], [4618, 4620, 4686], [4619, 4621], [4512, 4620, 4622], [4621, 4623], [4622, 4624, 4687], [4623, 4625], [4513, 4624, 4626], [4625, 4627], [4626, 4628, 4688], [4627, 4629], [4514, 4628, 4630], [4629, 4631], [4630, 4632, 4689], [4631, 4633], [4515, 4632, 4634], [4633, 4635], [4634, 4636, 4690], [4635, 4637], [4516, 4636, 4638], [4637, 4639], [4638, 4640, 4691], [4639, 4641], [4517, 4640, 4642], [4641, 4643], [4642, 4644, 4692], [4643, 4645], [4518, 4644, 4646], [4645, 4647], [4646, 4648, 4693], [4647, 4649], [4519, 4648, 4650], [4649, 4651], [4650, 4652, 4694], [4651, 4653], [4520, 4652, 4654], [4653, 4655], [4654, 4656, 4695], [4655, 4657], [4521, 4656, 4658], [4657, 4659], [4658, 4660, 4696], [4659, 4661], [4522, 4660], [4523, 4697], [4527, 4701], [4531, 4705], [4535, 4709], [4539, 4713], [4543, 4717], [4547, 4721], [4551, 4725], [4555, 4729], [4559, 4733], [4563, 4737], [4567, 4741], [4571, 4745], [4575, 4749], [4579, 4753], [4583, 4757], [4587, 4761], [4591, 4765], [4595, 4769], [4599, 4773], [4603, 4777], [4607, 4781], [4611, 4785], [4615, 4789], [4619, 4793], [4623, 4797], [4627, 4801], [4631, 4805], [4635, 4809], [4639, 4813], [4643, 4817], [4647, 4821], [4651, 4825], [4655, 4829], [4659, 4833], [4662, 4698], [4697, 4699], [4698, 4700, 4836], [4699, 4701], [4663, 4700, 4702], [4701, 4703], [4702, 4704, 4837], [4703, 4705], [4664, 4704, 4706], [4705, 4707], [4706, 4708, 4838], [4707, 4709], [4665, 4708, 4710], [4709, 4711], [4710, 4712, 4839], [4711, 4713], [4666, 4712, 4714], [4713, 4715], [4714, 4716, 4840], [4715, 4717], [4667, 4716, 4718], [4717, 4719], [4718, 4720, 4841], [4719, 4721], [4668, 4720, 4722], [4721, 4723], [4722, 4724, 4842], [4723, 4725], [4669, 4724, 4726], [4725, 4727], [4726, 4728, 4843], [4727, 4729], [4670, 4728, 4730], [4729, 4731], [4730, 4732, 4844], [4731, 4733], [4671, 4732, 4734], [4733, 4735], [4734, 4736, 4845], [4735, 4737], [4672, 4736, 4738], [4737, 4739], [4738, 4740, 4846], [4739, 4741], [4673, 4740, 4742], [4741, 4743], [4742, 4744, 4847], [4743, 4745], [4674, 4744, 4746], [4745, 4747], [4746, 4748, 4848], [4747, 4749], [4675, 4748, 4750], [4749, 4751], [4750, 4752, 4849], [4751, 4753], [4676, 4752, 4754], [4753, 4755], [4754, 4756, 4850], [4755, 4757], [4677, 4756, 4758], [4757, 4759], [4758, 4760, 4851], [4759, 4761], [4678, 4760, 4762], [4761, 4763], [4762, 4764, 4852], [4763, 4765], [4679, 4764, 4766], [4765, 4767], [4766, 4768, 4853], [4767, 4769], [4680, 4768, 4770], [4769, 4771], [4770, 4772, 4854], [4771, 4773], [4681, 4772, 4774], [4773, 4775], [4774, 4776, 4855], [4775, 4777], [4682, 4776, 4778], [4777, 4779], [4778, 4780, 4856], [4779, 4781], [4683, 4780, 4782], [4781, 4783], [4782, 4784, 4857], [4783, 4785], [4684, 4784, 4786], [4785, 4787], [4786, 4788, 4858], [4787, 4789], [4685, 4788, 4790], [4789, 4791], [4790, 4792, 4859], [4791, 4793], [4686, 4792, 4794], [4793, 4795], [4794, 4796, 4860], [4795, 4797], [4687, 4796, 4798], [4797, 4799], [4798, 4800, 4861], [4799, 4801], [4688, 4800, 4802], [4801, 4803], [4802, 4804, 4862], [4803, 4805], [4689, 4804, 4806], [4805, 4807], [4806, 4808, 4863], [4807, 4809], [4690, 4808, 4810], [4809, 4811], [4810, 4812, 4864], [4811, 4813], [4691, 4812, 4814], [4813, 4815], [4814, 4816, 4865], [4815, 4817], [4692, 4816, 4818], [4817, 4819], [4818, 4820, 4866], [4819, 4821], [4693, 4820, 4822], [4821, 4823], [4822, 4824, 4867], [4823, 4825], [4694, 4824, 4826], [4825, 4827], [4826, 4828, 4868], [4827, 4829], [4695, 4828, 4830], [4829, 4831], [4830, 4832, 4869], [4831, 4833], [4696, 4832, 4834], [4833, 4835], [4834, 4870], [4699, 4873], [4703, 4877], [4707, 4881], [4711, 4885], [4715, 4889], [4719, 4893], [4723, 4897], [4727, 4901], [4731, 4905], [4735, 4909], [4739, 4913], [4743, 4917], [4747, 4921], [4751, 4925], [4755, 4929], [4759, 4933], [4763, 4937], [4767, 4941], [4771, 4945], [4775, 4949], [4779, 4953], [4783, 4957], [4787, 4961], [4791, 4965], [4795, 4969], [4799, 4973], [4803, 4977], [4807, 4981], [4811, 4985], [4815, 4989], [4819, 4993], [4823, 4997], [4827, 5001], [4831, 5005], [4835, 5009], [4872, 5010], [4871, 4873], [4836, 4872, 4874], [4873, 4875], [4874, 4876, 5011], [4875, 4877], [4837, 4876, 4878], [4877, 4879], [4878, 4880, 5012], [4879, 4881], [4838, 4880, 4882], [4881, 4883], [4882, 4884, 5013], [4883, 4885], [4839, 4884, 4886], [4885, 4887], [4886, 4888, 5014], [4887, 4889], [4840, 4888, 4890], [4889, 4891], [4890, 4892, 5015], [4891, 4893], [4841, 4892, 4894], [4893, 4895], [4894, 4896, 5016], [4895, 4897], [4842, 4896, 4898], [4897, 4899], [4898, 4900, 5017], [4899, 4901], [4843, 4900, 4902], [4901, 4903], [4902, 4904, 5018], [4903, 4905], [4844, 4904, 4906], [4905, 4907], [4906, 4908, 5019], [4907, 4909], [4845, 4908, 4910], [4909, 4911], [4910, 4912, 5020], [4911, 4913], [4846, 4912, 4914], [4913, 4915], [4914, 4916, 5021], [4915, 4917], [4847, 4916, 4918], [4917, 4919], [4918, 4920, 5022], [4919, 4921], [4848, 4920, 4922], [4921, 4923], [4922, 4924, 5023], [4923, 4925], [4849, 4924, 4926], [4925, 4927], [4926, 4928, 5024], [4927, 4929], [4850, 4928, 4930], [4929, 4931], [4930, 4932, 5025], [4931, 4933], [4851, 4932, 4934], [4933, 4935], [4934, 4936, 5026], [4935, 4937], [4852, 4936, 4938], [4937, 4939], [4938, 4940, 5027], [4939, 4941], [4853, 4940, 4942], [4941, 4943], [4942, 4944, 5028], [4943, 4945], [4854, 4944, 4946], [4945, 4947], [4946, 4948, 5029], [4947, 4949], [4855, 4948, 4950], [4949, 4951], [4950, 4952, 5030], [4951, 4953], [4856, 4952, 4954], [4953, 4955], [4954, 4956, 5031], [4955, 4957], [4857, 4956, 4958], [4957, 4959], [4958, 4960, 5032], [4959, 4961], [4858, 4960, 4962], [4961, 4963], [4962, 4964, 5033], [4963, 4965], [4859, 4964, 4966], [4965, 4967], [4966, 4968, 5034], [4967, 4969], [4860, 4968, 4970], [4969, 4971], [4970, 4972, 5035], [4971, 4973], [4861, 4972, 4974], [4973, 4975], [4974, 4976, 5036], [4975, 4977], [4862, 4976, 4978], [4977, 4979], [4978, 4980, 5037], [4979, 4981], [4863, 4980, 4982], [4981, 4983], [4982, 4984, 5038], [4983, 4985], [4864, 4984, 4986], [4985, 4987], [4986, 4988, 5039], [4987, 4989], [4865, 4988, 4990], [4989, 4991], [4990, 4992, 5040], [4991, 4993], [4866, 4992, 4994], [4993, 4995], [4994, 4996, 5041], [4995, 4997], [4867, 4996, 4998], [4997, 4999], [4998, 5000, 5042], [4999, 5001], [4868, 5000, 5002], [5001, 5003], [5002, 5004, 5043], [5003, 5005], [4869, 5004, 5006], [5005, 5007], [5006, 5008, 5044], [5007, 5009], [4870, 5008], [4871, 5045], [4875, 5049], [4879, 5053], [4883, 5057], [4887, 5061], [4891, 5065], [4895, 5069], [4899, 5073], [4903, 5077], [4907, 5081], [4911, 5085], [4915, 5089], [4919, 5093], [4923, 5097], [4927, 5101], [4931, 5105], [4935, 5109], [4939, 5113], [4943, 5117], [4947, 5121], [4951, 5125], [4955, 5129], [4959, 5133], [4963, 5137], [4967, 5141], [4971, 5145], [4975, 5149], [4979, 5153], [4983, 5157], [4987, 5161], [4991, 5165], [4995, 5169], [4999, 5173], [5003, 5177], [5007, 5181], [5010, 5046], [5045, 5047], [5046, 5048, 5184], [5047, 5049], [5011, 5048, 5050], [5049, 5051], [5050, 5052, 5185], [5051, 5053], [5012, 5052, 5054], [5053, 5055], [5054, 5056, 5186], [5055, 5057], [5013, 5056, 5058], [5057, 5059], [5058, 5060, 5187], [5059, 5061], [5014, 5060, 5062], [5061, 5063], [5062, 5064, 5188], [5063, 5065], [5015, 5064, 5066], [5065, 5067], [5066, 5068, 5189], [5067, 5069], [5016, 5068, 5070], [5069, 5071], [5070, 5072, 5190], [5071, 5073], [5017, 5072, 5074], [5073, 5075], [5074, 5076, 5191], [5075, 5077], [5018, 5076, 5078], [5077, 5079], [5078, 5080, 5192], [5079, 5081], [5019, 5080, 5082], [5081, 5083], [5082, 5084, 5193], [5083, 5085], [5020, 5084, 5086], [5085, 5087], [5086, 5088, 5194], [5087, 5089], [5021, 5088, 5090], [5089, 5091], [5090, 5092, 5195], [5091, 5093], [5022, 5092, 5094], [5093, 5095], [5094, 5096, 5196], [5095, 5097], [5023, 5096, 5098], [5097, 5099], [5098, 5100, 5197], [5099, 5101], [5024, 5100, 5102], [5101, 5103], [5102, 5104, 5198], [5103, 5105], [5025, 5104, 5106], [5105, 5107], [5106, 5108, 5199], [5107, 5109], [5026, 5108, 5110], [5109, 5111], [5110, 5112, 5200], [5111, 5113], [5027, 5112, 5114], [5113, 5115], [5114, 5116, 5201], [5115, 5117], [5028, 5116, 5118], [5117, 5119], [5118, 5120, 5202], [5119, 5121], [5029, 5120, 5122], [5121, 5123], [5122, 5124, 5203], [5123, 5125], [5030, 5124, 5126], [5125, 5127], [5126, 5128, 5204], [5127, 5129], [5031, 5128, 5130], [5129, 5131], [5130, 5132, 5205], [5131, 5133], [5032, 5132, 5134], [5133, 5135], [5134, 5136, 5206], [5135, 5137], [5033, 5136, 5138], [5137, 5139], [5138, 5140, 5207], [5139, 5141], [5034, 5140, 5142], [5141, 5143], [5142, 5144, 5208], [5143, 5145], [5035, 5144, 5146], [5145, 5147], [5146, 5148, 5209], [5147, 5149], [5036, 5148, 5150], [5149, 5151], [5150, 5152, 5210], [5151, 5153], [5037, 5152, 5154], [5153, 5155], [5154, 5156, 5211], [5155, 5157], [5038, 5156, 5158], [5157, 5159], [5158, 5160, 5212], [5159, 5161], [5039, 5160, 5162], [5161, 5163], [5162, 5164, 5213], [5163, 5165], [5040, 5164, 5166], [5165, 5167], [5166, 5168, 5214], [5167, 5169], [5041, 5168, 5170], [5169, 5171], [5170, 5172, 5215], [5171, 5173], [5042, 5172, 5174], [5173, 5175], [5174, 5176, 5216], [5175, 5177], [5043, 5176, 5178], [5177, 5179], [5178, 5180, 5217], [5179, 5181], [5044, 5180, 5182], [5181, 5183], [5182, 5218], [5047, 5221], [5051, 5225], [5055, 5229], [5059, 5233], [5063, 5237], [5067, 5241], [5071, 5245], [5075, 5249], [5079, 5253], [5083, 5257], [5087, 5261], [5091, 5265], [5095, 5269], [5099, 5273], [5103, 5277], [5107, 5281], [5111, 5285], [5115, 5289], [5119, 5293], [5123, 5297], [5127, 5301], [5131, 5305], [5135, 5309], [5139, 5313], [5143, 5317], [5147, 5321], [5151, 5325], [5155, 5329], [5159, 5333], [5163, 5337], [5167, 5341], [5171, 5345], [5175, 5349], [5179, 5353], [5183, 5357], [5220, 5358], [5219, 5221], [5184, 5220, 5222], [5221, 5223], [5222, 5224, 5359], [5223, 5225], [5185, 5224, 5226], [5225, 5227], [5226, 5228, 5360], [5227, 5229], [5186, 5228, 5230], [5229, 5231], [5230, 5232, 5361], [5231, 5233], [5187, 5232, 5234], [5233, 5235], [5234, 5236, 5362], [5235, 5237], [5188, 5236, 5238], [5237, 5239], [5238, 5240, 5363], [5239, 5241], [5189, 5240, 5242], [5241, 5243], [5242, 5244, 5364], [5243, 5245], [5190, 5244, 5246], [5245, 5247], [5246, 5248, 5365], [5247, 5249], [5191, 5248, 5250], [5249, 5251], [5250, 5252, 5366], [5251, 5253], [5192, 5252, 5254], [5253, 5255], [5254, 5256, 5367], [5255, 5257], [5193, 5256, 5258], [5257, 5259], [5258, 5260, 5368], [5259, 5261], [5194, 5260, 5262], [5261, 5263], [5262, 5264, 5369], [5263, 5265], [5195, 5264, 5266], [5265, 5267], [5266, 5268, 5370], [5267, 5269], [5196, 5268, 5270], [5269, 5271], [5270, 5272, 5371], [5271, 5273], [5197, 5272, 5274], [5273, 5275], [5274, 5276, 5372], [5275, 5277], [5198, 5276, 5278], [5277, 5279], [5278, 5280, 5373], [5279, 5281], [5199, 5280, 5282], [5281, 5283], [5282, 5284, 5374], [5283, 5285], [5200, 5284, 5286], [5285, 5287], [5286, 5288, 5375], [5287, 5289], [5201, 5288, 5290], [5289, 5291], [5290, 5292, 5376], [5291, 5293], [5202, 5292, 5294], [5293, 5295], [5294, 5296, 5377], [5295, 5297], [5203, 5296, 5298], [5297, 5299], [5298, 5300, 5378], [5299, 5301], [5204, 5300, 5302], [5301, 5303], [5302, 5304, 5379], [5303, 5305], [5205, 5304, 5306], [5305, 5307], [5306, 5308, 5380], [5307, 5309], [5206, 5308, 5310], [5309, 5311], [5310, 5312, 5381], [5311, 5313], [5207, 5312, 5314], [5313, 5315], [5314, 5316, 5382], [5315, 5317], [5208, 5316, 5318], [5317, 5319], [5318, 5320, 5383], [5319, 5321], [5209, 5320, 5322], [5321, 5323], [5322, 5324, 5384], [5323, 5325], [5210, 5324, 5326], [5325, 5327], [5326, 5328, 5385], [5327, 5329], [5211, 5328, 5330], [5329, 5331], [5330, 5332, 5386], [5331, 5333], [5212, 5332, 5334], [5333, 5335], [5334, 5336, 5387], [5335, 5337], [5213, 5336, 5338], [5337, 5339], [5338, 5340, 5388], [5339, 5341], [5214, 5340, 5342], [5341, 5343], [5342, 5344, 5389], [5343, 5345], [5215, 5344, 5346], [5345, 5347], [5346, 5348, 5390], [5347, 5349], [5216, 5348, 5350], [5349, 5351], [5350, 5352, 5391], [5351, 5353], [5217, 5352, 5354], [5353, 5355], [5354, 5356, 5392], [5355, 5357], [5218, 5356], [5219, 5393], [5223, 5397], [5227, 5401], [5231, 5405], [5235, 5409], [5239, 5413], [5243, 5417], [5247, 5421], [5251, 5425], [5255, 5429], [5259, 5433], [5263, 5437], [5267, 5441], [5271, 5445], [5275, 5449], [5279, 5453], [5283, 5457], [5287, 5461], [5291, 5465], [5295, 5469], [5299, 5473], [5303, 5477], [5307, 5481], [5311, 5485], [5315, 5489], [5319, 5493], [5323, 5497], [5327, 5501], [5331, 5505], [5335, 5509], [5339, 5513], [5343, 5517], [5347, 5521], [5351, 5525], [5355, 5529], [5358, 5394], [5393, 5395], [5394, 5396, 5532], [5395, 5397], [5359, 5396, 5398], [5397, 5399], [5398, 5400, 5533], [5399, 5401], [5360, 5400, 5402], [5401, 5403], [5402, 5404, 5534], [5403, 5405], [5361, 5404, 5406], [5405, 5407], [5406, 5408, 5535], [5407, 5409], [5362, 5408, 5410], [5409, 5411], [5410, 5412, 5536], [5411, 5413], [5363, 5412, 5414], [5413, 5415], [5414, 5416, 5537], [5415, 5417], [5364, 5416, 5418], [5417, 5419], [5418, 5420, 5538], [5419, 5421], [5365, 5420, 5422], [5421, 5423], [5422, 5424, 5539], [5423, 5425], [5366, 5424, 5426], [5425, 5427], [5426, 5428, 5540], [5427, 5429], [5367, 5428, 5430], [5429, 5431], [5430, 5432, 5541], [5431, 5433], [5368, 5432, 5434], [5433, 5435], [5434, 5436, 5542], [5435, 5437], [5369, 5436, 5438], [5437, 5439], [5438, 5440, 5543], [5439, 5441], [5370, 5440, 5442], [5441, 5443], [5442, 5444, 5544], [5443, 5445], [5371, 5444, 5446], [5445, 5447], [5446, 5448, 5545], [5447, 5449], [5372, 5448, 5450], [5449, 5451], [5450, 5452, 5546], [5451, 5453], [5373, 5452, 5454], [5453, 5455], [5454, 5456, 5547], [5455, 5457], [5374, 5456, 5458], [5457, 5459], [5458, 5460, 5548], [5459, 5461], [5375, 5460, 5462], [5461, 5463], [5462, 5464, 5549], [5463, 5465], [5376, 5464, 5466], [5465, 5467], [5466, 5468, 5550], [5467, 5469], [5377, 5468, 5470], [5469, 5471], [5470, 5472, 5551], [5471, 5473], [5378, 5472, 5474], [5473, 5475], [5474, 5476, 5552], [5475, 5477], [5379, 5476, 5478], [5477, 5479], [5478, 5480, 5553], [5479, 5481], [5380, 5480, 5482], [5481, 5483], [5482, 5484, 5554], [5483, 5485], [5381, 5484, 5486], [5485, 5487], [5486, 5488, 5555], [5487, 5489], [5382, 5488, 5490], [5489, 5491], [5490, 5492, 5556], [5491, 5493], [5383, 5492, 5494], [5493, 5495], [5494, 5496, 5557], [5495, 5497], [5384, 5496, 5498], [5497, 5499], [5498, 5500, 5558], [5499, 5501], [5385, 5500, 5502], [5501, 5503], [5502, 5504, 5559], [5503, 5505], [5386, 5504, 5506], [5505, 5507], [5506, 5508, 5560], [5507, 5509], [5387, 5508, 5510], [5509, 5511], [5510, 5512, 5561], [5511, 5513], [5388, 5512, 5514], [5513, 5515], [5514, 5516, 5562], [5515, 5517], [5389, 5516, 5518], [5517, 5519], [5518, 5520, 5563], [5519, 5521], [5390, 5520, 5522], [5521, 5523], [5522, 5524, 5564], [5523, 5525], [5391, 5524, 5526], [5525, 5527], [5526, 5528, 5565], [5527, 5529], [5392, 5528, 5530], [5529, 5531], [5530, 5566], [5395, 5569], [5399, 5573], [5403, 5577], [5407, 5581], [5411, 5585], [5415, 5589], [5419, 5593], [5423, 5597], [5427, 5601], [5431, 5605], [5435, 5609], [5439, 5613], [5443, 5617], [5447, 5621], [5451, 5625], [5455, 5629], [5459, 5633], [5463, 5637], [5467, 5641], [5471, 5645], [5475, 5649], [5479, 5653], [5483, 5657], [5487, 5661], [5491, 5665], [5495, 5669], [5499, 5673], [5503, 5677], [5507, 5681], [5511, 5685], [5515, 5689], [5519, 5693], [5523, 5697], [5527, 5701], [5531, 5705], [5568, 5706], [5567, 5569], [5532, 5568, 5570], [5569, 5571], [5570, 5572, 5707], [5571, 5573], [5533, 5572, 5574], [5573, 5575], [5574, 5576, 5708], [5575, 5577], [5534, 5576, 5578], [5577, 5579], [5578, 5580, 5709], [5579, 5581], [5535, 5580, 5582], [5581, 5583], [5582, 5584, 5710], [5583, 5585], [5536, 5584, 5586], [5585, 5587], [5586, 5588, 5711], [5587, 5589], [5537, 5588, 5590], [5589, 5591], [5590, 5592, 5712], [5591, 5593], [5538, 5592, 5594], [5593, 5595], [5594, 5596, 5713], [5595, 5597], [5539, 5596, 5598], [5597, 5599], [5598, 5600, 5714], [5599, 5601], [5540, 5600, 5602], [5601, 5603], [5602, 5604, 5715], [5603, 5605], [5541, 5604, 5606], [5605, 5607], [5606, 5608, 5716], [5607, 5609], [5542, 5608, 5610], [5609, 5611], [5610, 5612, 5717], [5611, 5613], [5543, 5612, 5614], [5613, 5615], [5614, 5616, 5718], [5615, 5617], [5544, 5616, 5618], [5617, 5619], [5618, 5620, 5719], [5619, 5621], [5545, 5620, 5622], [5621, 5623], [5622, 5624, 5720], [5623, 5625], [5546, 5624, 5626], [5625, 5627], [5626, 5628, 5721], [5627, 5629], [5547, 5628, 5630], [5629, 5631], [5630, 5632, 5722], [5631, 5633], [5548, 5632, 5634], [5633, 5635], [5634, 5636, 5723], [5635, 5637], [5549, 5636, 5638], [5637, 5639], [5638, 5640, 5724], [5639, 5641], [5550, 5640, 5642], [5641, 5643], [5642, 5644, 5725], [5643, 5645], [5551, 5644, 5646], [5645, 5647], [5646, 5648, 5726], [5647, 5649], [5552, 5648, 5650], [5649, 5651], [5650, 5652, 5727], [5651, 5653], [5553, 5652, 5654], [5653, 5655], [5654, 5656, 5728], [5655, 5657], [5554, 5656, 5658], [5657, 5659], [5658, 5660, 5729], [5659, 5661], [5555, 5660, 5662], [5661, 5663], [5662, 5664, 5730], [5663, 5665], [5556, 5664, 5666], [5665, 5667], [5666, 5668, 5731], [5667, 5669], [5557, 5668, 5670], [5669, 5671], [5670, 5672, 5732], [5671, 5673], [5558, 5672, 5674], [5673, 5675], [5674, 5676, 5733], [5675, 5677], [5559, 5676, 5678], [5677, 5679], [5678, 5680, 5734], [5679, 5681], [5560, 5680, 5682], [5681, 5683], [5682, 5684, 5735], [5683, 5685], [5561, 5684, 5686], [5685, 5687], [5686, 5688, 5736], [5687, 5689], [5562, 5688, 5690], [5689, 5691], [5690, 5692, 5737], [5691, 5693], [5563, 5692, 5694], [5693, 5695], [5694, 5696, 5738], [5695, 5697], [5564, 5696, 5698], [5697, 5699], [5698, 5700, 5739], [5699, 5701], [5565, 5700, 5702], [5701, 5703], [5702, 5704, 5740], [5703, 5705], [5566, 5704], [5567, 5741], [5571, 5745], [5575, 5749], [5579, 5753], [5583, 5757], [5587, 5761], [5591, 5765], [5595, 5769], [5599, 5773], [5603, 5777], [5607, 5781], [5611, 5785], [5615, 5789], [5619, 5793], [5623, 5797], [5627, 5801], [5631, 5805], [5635, 5809], [5639, 5813], [5643, 5817], [5647, 5821], [5651, 5825], [5655, 5829], [5659, 5833], [5663, 5837], [5667, 5841], [5671, 5845], [5675, 5849], [5679, 5853], [5683, 5857], [5687, 5861], [5691, 5865], [5695, 5869], [5699, 5873], [5703, 5877], [5706, 5742], [5741, 5743], [5742, 5744, 5880], [5743, 5745], [5707, 5744, 5746], [5745, 5747], [5746, 5748, 5881], [5747, 5749], [5708, 5748, 5750], [5749, 5751], [5750, 5752, 5882], [5751, 5753], [5709, 5752, 5754], [5753, 5755], [5754, 5756, 5883], [5755, 5757], [5710, 5756, 5758], [5757, 5759], [5758, 5760, 5884], [5759, 5761], [5711, 5760, 5762], [5761, 5763], [5762, 5764, 5885], [5763, 5765], [5712, 5764, 5766], [5765, 5767], [5766, 5768, 5886], [5767, 5769], [5713, 5768, 5770], [5769, 5771], [5770, 5772, 5887], [5771, 5773], [5714, 5772, 5774], [5773, 5775], [5774, 5776, 5888], [5775, 5777], [5715, 5776, 5778], [5777, 5779], [5778, 5780, 5889], [5779, 5781], [5716, 5780, 5782], [5781, 5783], [5782, 5784, 5890], [5783, 5785], [5717, 5784, 5786], [5785, 5787], [5786, 5788, 5891], [5787, 5789], [5718, 5788, 5790], [5789, 5791], [5790, 5792, 5892], [5791, 5793], [5719, 5792, 5794], [5793, 5795], [5794, 5796, 5893], [5795, 5797], [5720, 5796, 5798], [5797, 5799], [5798, 5800, 5894], [5799, 5801], [5721, 5800, 5802], [5801, 5803], [5802, 5804, 5895], [5803, 5805], [5722, 5804, 5806], [5805, 5807], [5806, 5808, 5896], [5807, 5809], [5723, 5808, 5810], [5809, 5811], [5810, 5812, 5897], [5811, 5813], [5724, 5812, 5814], [5813, 5815], [5814, 5816, 5898], [5815, 5817], [5725, 5816, 5818], [5817, 5819], [5818, 5820, 5899], [5819, 5821], [5726, 5820, 5822], [5821, 5823], [5822, 5824, 5900], [5823, 5825], [5727, 5824, 5826], [5825, 5827], [5826, 5828, 5901], [5827, 5829], [5728, 5828, 5830], [5829, 5831], [5830, 5832, 5902], [5831, 5833], [5729, 5832, 5834], [5833, 5835], [5834, 5836, 5903], [5835, 5837], [5730, 5836, 5838], [5837, 5839], [5838, 5840, 5904], [5839, 5841], [5731, 5840, 5842], [5841, 5843], [5842, 5844, 5905], [5843, 5845], [5732, 5844, 5846], [5845, 5847], [5846, 5848, 5906], [5847, 5849], [5733, 5848, 5850], [5849, 5851], [5850, 5852, 5907], [5851, 5853], [5734, 5852, 5854], [5853, 5855], [5854, 5856, 5908], [5855, 5857], [5735, 5856, 5858], [5857, 5859], [5858, 5860, 5909], [5859, 5861], [5736, 5860, 5862], [5861, 5863], [5862, 5864, 5910], [5863, 5865], [5737, 5864, 5866], [5865, 5867], [5866, 5868, 5911], [5867, 5869], [5738, 5868, 5870], [5869, 5871], [5870, 5872, 5912], [5871, 5873], [5739, 5872, 5874], [5873, 5875], [5874, 5876, 5913], [5875, 5877], [5740, 5876, 5878], [5877, 5879], [5878, 5914], [5743, 5917], [5747, 5921], [5751, 5925], [5755, 5929], [5759, 5933], [5763, 5937], [5767, 5941], [5771, 5945], [5775, 5949], [5779, 5953], [5783, 5957], [5787, 5961], [5791, 5965], [5795, 5969], [5799, 5973], [5803, 5977], [5807, 5981], [5811, 5985], [5815, 5989], [5819, 5993], [5823, 5997], [5827, 6001], [5831, 6005], [5835, 6009], [5839, 6013], [5843, 6017], [5847, 6021], [5851, 6025], [5855, 6029], [5859, 6033], [5863, 6037], [5867, 6041], [5871, 6045], [5875, 6049], [5879, 6053], [5916, 6054], [5915, 5917], [5880, 5916, 5918], [5917, 5919], [5918, 5920, 6055], [5919, 5921], [5881, 5920, 5922], [5921, 5923], [5922, 5924, 6056], [5923, 5925], [5882, 5924, 5926], [5925, 5927], [5926, 5928, 6057], [5927, 5929], [5883, 5928, 5930], [5929, 5931], [5930, 5932, 6058], [5931, 5933], [5884, 5932, 5934], [5933, 5935], [5934, 5936, 6059], [5935, 5937], [5885, 5936, 5938], [5937, 5939], [5938, 5940, 6060], [5939, 5941], [5886, 5940, 5942], [5941, 5943], [5942, 5944, 6061], [5943, 5945], [5887, 5944, 5946], [5945, 5947], [5946, 5948, 6062], [5947, 5949], [5888, 5948, 5950], [5949, 5951], [5950, 5952, 6063], [5951, 5953], [5889, 5952, 5954], [5953, 5955], [5954, 5956, 6064], [5955, 5957], [5890, 5956, 5958], [5957, 5959], [5958, 5960, 6065], [5959, 5961], [5891, 5960, 5962], [5961, 5963], [5962, 5964, 6066], [5963, 5965], [5892, 5964, 5966], [5965, 5967], [5966, 5968, 6067], [5967, 5969], [5893, 5968, 5970], [5969, 5971], [5970, 5972, 6068], [5971, 5973], [5894, 5972, 5974], [5973, 5975], [5974, 5976, 6069], [5975, 5977], [5895, 5976, 5978], [5977, 5979], [5978, 5980, 6070], [5979, 5981], [5896, 5980, 5982], [5981, 5983], [5982, 5984, 6071], [5983, 5985], [5897, 5984, 5986], [5985, 5987], [5986, 5988, 6072], [5987, 5989], [5898, 5988, 5990], [5989, 5991], [5990, 5992, 6073], [5991, 5993], [5899, 5992, 5994], [5993, 5995], [5994, 5996, 6074], [5995, 5997], [5900, 5996, 5998], [5997, 5999], [5998, 6000, 6075], [5999, 6001], [5901, 6000, 6002], [6001, 6003], [6002, 6004, 6076], [6003, 6005], [5902, 6004, 6006], [6005, 6007], [6006, 6008, 6077], [6007, 6009], [5903, 6008, 6010], [6009, 6011], [6010, 6012, 6078], [6011, 6013], [5904, 6012, 6014], [6013, 6015], [6014, 6016, 6079], [6015, 6017], [5905, 6016, 6018], [6017, 6019], [6018, 6020, 6080], [6019, 6021], [5906, 6020, 6022], [6021, 6023], [6022, 6024, 6081], [6023, 6025], [5907, 6024, 6026], [6025, 6027], [6026, 6028, 6082], [6027, 6029], [5908, 6028, 6030], [6029, 6031], [6030, 6032, 6083], [6031, 6033], [5909, 6032, 6034], [6033, 6035], [6034, 6036, 6084], [6035, 6037], [5910, 6036, 6038], [6037, 6039], [6038, 6040, 6085], [6039, 6041], [5911, 6040, 6042], [6041, 6043], [6042, 6044, 6086], [6043, 6045], [5912, 6044, 6046], [6045, 6047], [6046, 6048, 6087], [6047, 6049], [5913, 6048, 6050], [6049, 6051], [6050, 6052, 6088], [6051, 6053], [5914, 6052], [5915, 6089], [5919, 6093], [5923, 6097], [5927, 6101], [5931, 6105], [5935, 6109], [5939, 6113], [5943, 6117], [5947, 6121], [5951, 6125], [5955, 6129], [5959, 6133], [5963, 6137], [5967, 6141], [5971, 6145], [5975, 6149], [5979, 6153], [5983, 6157], [5987, 6161], [5991, 6165], [5995, 6169], [5999, 6173], [6003, 6177], [6007, 6181], [6011, 6185], [6015, 6189], [6019, 6193], [6023, 6197], [6027, 6201], [6031, 6205], [6035, 6209], [6039, 6213], [6043, 6217], [6047, 6221], [6051, 6225], [6054, 6090], [6089, 6091], [6090, 6092, 6228], [6091, 6093], [6055, 6092, 6094], [6093, 6095], [6094, 6096, 6229], [6095, 6097], [6056, 6096, 6098], [6097, 6099], [6098, 6100, 6230], [6099, 6101], [6057, 6100, 6102], [6101, 6103], [6102, 6104, 6231], [6103, 6105], [6058, 6104, 6106], [6105, 6107], [6106, 6108, 6232], [6107, 6109], [6059, 6108, 6110], [6109, 6111], [6110, 6112, 6233], [6111, 6113], [6060, 6112, 6114], [6113, 6115], [6114, 6116, 6234], [6115, 6117], [6061, 6116, 6118], [6117, 6119], [6118, 6120, 6235], [6119, 6121], [6062, 6120, 6122], [6121, 6123], [6122, 6124, 6236], [6123, 6125], [6063, 6124, 6126], [6125, 6127], [6126, 6128, 6237], [6127, 6129], [6064, 6128, 6130], [6129, 6131], [6130, 6132, 6238], [6131, 6133], [6065, 6132, 6134], [6133, 6135], [6134, 6136, 6239], [6135, 6137], [6066, 6136, 6138], [6137, 6139], [6138, 6140, 6240], [6139, 6141], [6067, 6140, 6142], [6141, 6143], [6142, 6144, 6241], [6143, 6145], [6068, 6144, 6146], [6145, 6147], [6146, 6148, 6242], [6147, 6149], [6069, 6148, 6150], [6149, 6151], [6150, 6152, 6243], [6151, 6153], [6070, 6152, 6154], [6153, 6155], [6154, 6156, 6244], [6155, 6157], [6071, 6156, 6158], [6157, 6159], [6158, 6160, 6245], [6159, 6161], [6072, 6160, 6162], [6161, 6163], [6162, 6164, 6246], [6163, 6165], [6073, 6164, 6166], [6165, 6167], [6166, 6168, 6247], [6167, 6169], [6074, 6168, 6170], [6169, 6171], [6170, 6172, 6248], [6171, 6173], [6075, 6172, 6174], [6173, 6175], [6174, 6176, 6249], [6175, 6177], [6076, 6176, 6178], [6177, 6179], [6178, 6180, 6250], [6179, 6181], [6077, 6180, 6182], [6181, 6183], [6182, 6184, 6251], [6183, 6185], [6078, 6184, 6186], [6185, 6187], [6186, 6188, 6252], [6187, 6189], [6079, 6188, 6190], [6189, 6191], [6190, 6192, 6253], [6191, 6193], [6080, 6192, 6194], [6193, 6195], [6194, 6196, 6254], [6195, 6197], [6081, 6196, 6198], [6197, 6199], [6198, 6200, 6255], [6199, 6201], [6082, 6200, 6202], [6201, 6203], [6202, 6204, 6256], [6203, 6205], [6083, 6204, 6206], [6205, 6207], [6206, 6208, 6257], [6207, 6209], [6084, 6208, 6210], [6209, 6211], [6210, 6212, 6258], [6211, 6213], [6085, 6212, 6214], [6213, 6215], [6214, 6216, 6259], [6215, 6217], [6086, 6216, 6218], [6217, 6219], [6218, 6220, 6260], [6219, 6221], [6087, 6220, 6222], [6221, 6223], [6222, 6224, 6261], [6223, 6225], [6088, 6224, 6226], [6225, 6227], [6226, 6262], [6091, 6265], [6095, 6269], [6099, 6273], [6103, 6277], [6107, 6281], [6111, 6285], [6115, 6289], [6119, 6293], [6123, 6297], [6127, 6301], [6131, 6305], [6135, 6309], [6139, 6313], [6143, 6317], [6147, 6321], [6151, 6325], [6155, 6329], [6159, 6333], [6163, 6337], [6167, 6341], [6171, 6345], [6175, 6349], [6179, 6353], [6183, 6357], [6187, 6361], [6191, 6365], [6195, 6369], [6199, 6373], [6203, 6377], [6207, 6381], [6211, 6385], [6215, 6389], [6219, 6393], [6223, 6397], [6227, 6401], [6264, 6402], [6263, 6265], [6228, 6264, 6266], [6265, 6267], [6266, 6268, 6403], [6267, 6269], [6229, 6268, 6270], [6269, 6271], [6270, 6272, 6404], [6271, 6273], [6230, 6272, 6274], [6273, 6275], [6274, 6276, 6405], [6275, 6277], [6231, 6276, 6278], [6277, 6279], [6278, 6280, 6406], [6279, 6281], [6232, 6280, 6282], [6281, 6283], [6282, 6284, 6407], [6283, 6285], [6233, 6284, 6286], [6285, 6287], [6286, 6288, 6408], [6287, 6289], [6234, 6288, 6290], [6289, 6291], [6290, 6292, 6409], [6291, 6293], [6235, 6292, 6294], [6293, 6295], [6294, 6296, 6410], [6295, 6297], [6236, 6296, 6298], [6297, 6299], [6298, 6300, 6411], [6299, 6301], [6237, 6300, 6302], [6301, 6303], [6302, 6304, 6412], [6303, 6305], [6238, 6304, 6306], [6305, 6307], [6306, 6308, 6413], [6307, 6309], [6239, 6308, 6310], [6309, 6311], [6310, 6312, 6414], [6311, 6313], [6240, 6312, 6314], [6313, 6315], [6314, 6316, 6415], [6315, 6317], [6241, 6316, 6318], [6317, 6319], [6318, 6320, 6416], [6319, 6321], [6242, 6320, 6322], [6321, 6323], [6322, 6324, 6417], [6323, 6325], [6243, 6324, 6326], [6325, 6327], [6326, 6328, 6418], [6327, 6329], [6244, 6328, 6330], [6329, 6331], [6330, 6332, 6419], [6331, 6333], [6245, 6332, 6334], [6333, 6335], [6334, 6336, 6420], [6335, 6337], [6246, 6336, 6338], [6337, 6339], [6338, 6340, 6421], [6339, 6341], [6247, 6340, 6342], [6341, 6343], [6342, 6344, 6422], [6343, 6345], [6248, 6344, 6346], [6345, 6347], [6346, 6348, 6423], [6347, 6349], [6249, 6348, 6350], [6349, 6351], [6350, 6352, 6424], [6351, 6353], [6250, 6352, 6354], [6353, 6355], [6354, 6356, 6425], [6355, 6357], [6251, 6356, 6358], [6357, 6359], [6358, 6360, 6426], [6359, 6361], [6252, 6360, 6362], [6361, 6363], [6362, 6364, 6427], [6363, 6365], [6253, 6364, 6366], [6365, 6367], [6366, 6368, 6428], [6367, 6369], [6254, 6368, 6370], [6369, 6371], [6370, 6372, 6429], [6371, 6373], [6255, 6372, 6374], [6373, 6375], [6374, 6376, 6430], [6375, 6377], [6256, 6376, 6378], [6377, 6379], [6378, 6380, 6431], [6379, 6381], [6257, 6380, 6382], [6381, 6383], [6382, 6384, 6432], [6383, 6385], [6258, 6384, 6386], [6385, 6387], [6386, 6388, 6433], [6387, 6389], [6259, 6388, 6390], [6389, 6391], [6390, 6392, 6434], [6391, 6393], [6260, 6392, 6394], [6393, 6395], [6394, 6396, 6435], [6395, 6397], [6261, 6396, 6398], [6397, 6399], [6398, 6400, 6436], [6399, 6401], [6262, 6400], [6263, 6437], [6267, 6441], [6271, 6445], [6275, 6449], [6279, 6453], [6283, 6457], [6287, 6461], [6291, 6465], [6295, 6469], [6299, 6473], [6303, 6477], [6307, 6481], [6311, 6485], [6315, 6489], [6319, 6493], [6323, 6497], [6327, 6501], [6331, 6505], [6335, 6509], [6339, 6513], [6343, 6517], [6347, 6521], [6351, 6525], [6355, 6529], [6359, 6533], [6363, 6537], [6367, 6541], [6371, 6545], [6375, 6549], [6379, 6553], [6383, 6557], [6387, 6561], [6391, 6565], [6395, 6569], [6399, 6573], [6402, 6438], [6437, 6439], [6438, 6440, 6576], [6439, 6441], [6403, 6440, 6442], [6441, 6443], [6442, 6444, 6577], [6443, 6445], [6404, 6444, 6446], [6445, 6447], [6446, 6448, 6578], [6447, 6449], [6405, 6448, 6450], [6449, 6451], [6450, 6452, 6579], [6451, 6453], [6406, 6452, 6454], [6453, 6455], [6454, 6456, 6580], [6455, 6457], [6407, 6456, 6458], [6457, 6459], [6458, 6460, 6581], [6459, 6461], [6408, 6460, 6462], [6461, 6463], [6462, 6464, 6582], [6463, 6465], [6409, 6464, 6466], [6465, 6467], [6466, 6468, 6583], [6467, 6469], [6410, 6468, 6470], [6469, 6471], [6470, 6472, 6584], [6471, 6473], [6411, 6472, 6474], [6473, 6475], [6474, 6476, 6585], [6475, 6477], [6412, 6476, 6478], [6477, 6479], [6478, 6480, 6586], [6479, 6481], [6413, 6480, 6482], [6481, 6483], [6482, 6484, 6587], [6483, 6485], [6414, 6484, 6486], [6485, 6487], [6486, 6488, 6588], [6487, 6489], [6415, 6488, 6490], [6489, 6491], [6490, 6492, 6589], [6491, 6493], [6416, 6492, 6494], [6493, 6495], [6494, 6496, 6590], [6495, 6497], [6417, 6496, 6498], [6497, 6499], [6498, 6500, 6591], [6499, 6501], [6418, 6500, 6502], [6501, 6503], [6502, 6504, 6592], [6503, 6505], [6419, 6504, 6506], [6505, 6507], [6506, 6508, 6593], [6507, 6509], [6420, 6508, 6510], [6509, 6511], [6510, 6512, 6594], [6511, 6513], [6421, 6512, 6514], [6513, 6515], [6514, 6516, 6595], [6515, 6517], [6422, 6516, 6518], [6517, 6519], [6518, 6520, 6596], [6519, 6521], [6423, 6520, 6522], [6521, 6523], [6522, 6524, 6597], [6523, 6525], [6424, 6524, 6526], [6525, 6527], [6526, 6528, 6598], [6527, 6529], [6425, 6528, 6530], [6529, 6531], [6530, 6532, 6599], [6531, 6533], [6426, 6532, 6534], [6533, 6535], [6534, 6536, 6600], [6535, 6537], [6427, 6536, 6538], [6537, 6539], [6538, 6540, 6601], [6539, 6541], [6428, 6540, 6542], [6541, 6543], [6542, 6544, 6602], [6543, 6545], [6429, 6544, 6546], [6545, 6547], [6546, 6548, 6603], [6547, 6549], [6430, 6548, 6550], [6549, 6551], [6550, 6552, 6604], [6551, 6553], [6431, 6552, 6554], [6553, 6555], [6554, 6556, 6605], [6555, 6557], [6432, 6556, 6558], [6557, 6559], [6558, 6560, 6606], [6559, 6561], [6433, 6560, 6562], [6561, 6563], [6562, 6564, 6607], [6563, 6565], [6434, 6564, 6566], [6565, 6567], [6566, 6568, 6608], [6567, 6569], [6435, 6568, 6570], [6569, 6571], [6570, 6572, 6609], [6571, 6573], [6436, 6572, 6574], [6573, 6575], [6574, 6610], [6439, 6613], [6443, 6617], [6447, 6621], [6451, 6625], [6455, 6629], [6459, 6633], [6463, 6637], [6467, 6641], [6471, 6645], [6475, 6649], [6479, 6653], [6483, 6657], [6487, 6661], [6491, 6665], [6495, 6669], [6499, 6673], [6503, 6677], [6507, 6681], [6511, 6685], [6515, 6689], [6519, 6693], [6523, 6697], [6527, 6701], [6531, 6705], [6535, 6709], [6539, 6713], [6543, 6717], [6547, 6721], [6551, 6725], [6555, 6729], [6559, 6733], [6563, 6737], [6567, 6741], [6571, 6745], [6575, 6749], [6612, 6750], [6611, 6613], [6576, 6612, 6614], [6613, 6615], [6614, 6616, 6751], [6615, 6617], [6577, 6616, 6618], [6617, 6619], [6618, 6620, 6752], [6619, 6621], [6578, 6620, 6622], [6621, 6623], [6622, 6624, 6753], [6623, 6625], [6579, 6624, 6626], [6625, 6627], [6626, 6628, 6754], [6627, 6629], [6580, 6628, 6630], [6629, 6631], [6630, 6632, 6755], [6631, 6633], [6581, 6632, 6634], [6633, 6635], [6634, 6636, 6756], [6635, 6637], [6582, 6636, 6638], [6637, 6639], [6638, 6640, 6757], [6639, 6641], [6583, 6640, 6642], [6641, 6643], [6642, 6644, 6758], [6643, 6645], [6584, 6644, 6646], [6645, 6647], [6646, 6648, 6759], [6647, 6649], [6585, 6648, 6650], [6649, 6651], [6650, 6652, 6760], [6651, 6653], [6586, 6652, 6654], [6653, 6655], [6654, 6656, 6761], [6655, 6657], [6587, 6656, 6658], [6657, 6659], [6658, 6660, 6762], [6659, 6661], [6588, 6660, 6662], [6661, 6663], [6662, 6664, 6763], [6663, 6665], [6589, 6664, 6666], [6665, 6667], [6666, 6668, 6764], [6667, 6669], [6590, 6668, 6670], [6669, 6671], [6670, 6672, 6765], [6671, 6673], [6591, 6672, 6674], [6673, 6675], [6674, 6676, 6766], [6675, 6677], [6592, 6676, 6678], [6677, 6679], [6678, 6680, 6767], [6679, 6681], [6593, 6680, 6682], [6681, 6683], [6682, 6684, 6768], [6683, 6685], [6594, 6684, 6686], [6685, 6687], [6686, 6688, 6769], [6687, 6689], [6595, 6688, 6690], [6689, 6691], [6690, 6692, 6770], [6691, 6693], [6596, 6692, 6694], [6693, 6695], [6694, 6696, 6771], [6695, 6697], [6597, 6696, 6698], [6697, 6699], [6698, 6700, 6772], [6699, 6701], [6598, 6700, 6702], [6701, 6703], [6702, 6704, 6773], [6703, 6705], [6599, 6704, 6706], [6705, 6707], [6706, 6708, 6774], [6707, 6709], [6600, 6708, 6710], [6709, 6711], [6710, 6712, 6775], [6711, 6713], [6601, 6712, 6714], [6713, 6715], [6714, 6716, 6776], [6715, 6717], [6602, 6716, 6718], [6717, 6719], [6718, 6720, 6777], [6719, 6721], [6603, 6720, 6722], [6721, 6723], [6722, 6724, 6778], [6723, 6725], [6604, 6724, 6726], [6725, 6727], [6726, 6728, 6779], [6727, 6729], [6605, 6728, 6730], [6729, 6731], [6730, 6732, 6780], [6731, 6733], [6606, 6732, 6734], [6733, 6735], [6734, 6736, 6781], [6735, 6737], [6607, 6736, 6738], [6737, 6739], [6738, 6740, 6782], [6739, 6741], [6608, 6740, 6742], [6741, 6743], [6742, 6744, 6783], [6743, 6745], [6609, 6744, 6746], [6745, 6747], [6746, 6748, 6784], [6747, 6749], [6610, 6748], [6611, 6785], [6615, 6789], [6619, 6793], [6623, 6797], [6627, 6801], [6631, 6805], [6635, 6809], [6639, 6813], [6643, 6817], [6647, 6821], [6651, 6825], [6655, 6829], [6659, 6833], [6663, 6837], [6667, 6841], [6671, 6845], [6675, 6849], [6679, 6853], [6683, 6857], [6687, 6861], [6691, 6865], [6695, 6869], [6699, 6873], [6703, 6877], [6707, 6881], [6711, 6885], [6715, 6889], [6719, 6893], [6723, 6897], [6727, 6901], [6731, 6905], [6735, 6909], [6739, 6913], [6743, 6917], [6747, 6921], [6750, 6786], [6785, 6787], [6786, 6788, 6924], [6787, 6789], [6751, 6788, 6790], [6789, 6791], [6790, 6792, 6925], [6791, 6793], [6752, 6792, 6794], [6793, 6795], [6794, 6796, 6926], [6795, 6797], [6753, 6796, 6798], [6797, 6799], [6798, 6800, 6927], [6799, 6801], [6754, 6800, 6802], [6801, 6803], [6802, 6804, 6928], [6803, 6805], [6755, 6804, 6806], [6805, 6807], [6806, 6808, 6929], [6807, 6809], [6756, 6808, 6810], [6809, 6811], [6810, 6812, 6930], [6811, 6813], [6757, 6812, 6814], [6813, 6815], [6814, 6816, 6931], [6815, 6817], [6758, 6816, 6818], [6817, 6819], [6818, 6820, 6932], [6819, 6821], [6759, 6820, 6822], [6821, 6823], [6822, 6824, 6933], [6823, 6825], [6760, 6824, 6826], [6825, 6827], [6826, 6828, 6934], [6827, 6829], [6761, 6828, 6830], [6829, 6831], [6830, 6832, 6935], [6831, 6833], [6762, 6832, 6834], [6833, 6835], [6834, 6836, 6936], [6835, 6837], [6763, 6836, 6838], [6837, 6839], [6838, 6840, 6937], [6839, 6841], [6764, 6840, 6842], [6841, 6843], [6842, 6844, 6938], [6843, 6845], [6765, 6844, 6846], [6845, 6847], [6846, 6848, 6939], [6847, 6849], [6766, 6848, 6850], [6849, 6851], [6850, 6852, 6940], [6851, 6853], [6767, 6852, 6854], [6853, 6855], [6854, 6856, 6941], [6855, 6857], [6768, 6856, 6858], [6857, 6859], [6858, 6860, 6942], [6859, 6861], [6769, 6860, 6862], [6861, 6863], [6862, 6864, 6943], [6863, 6865], [6770, 6864, 6866], [6865, 6867], [6866, 6868, 6944], [6867, 6869], [6771, 6868, 6870], [6869, 6871], [6870, 6872, 6945], [6871, 6873], [6772, 6872, 6874], [6873, 6875], [6874, 6876, 6946], [6875, 6877], [6773, 6876, 6878], [6877, 6879], [6878, 6880, 6947], [6879, 6881], [6774, 6880, 6882], [6881, 6883], [6882, 6884, 6948], [6883, 6885], [6775, 6884, 6886], [6885, 6887], [6886, 6888, 6949], [6887, 6889], [6776, 6888, 6890], [6889, 6891], [6890, 6892, 6950], [6891, 6893], [6777, 6892, 6894], [6893, 6895], [6894, 6896, 6951], [6895, 6897], [6778, 6896, 6898], [6897, 6899], [6898, 6900, 6952], [6899, 6901], [6779, 6900, 6902], [6901, 6903], [6902, 6904, 6953], [6903, 6905], [6780, 6904, 6906], [6905, 6907], [6906, 6908, 6954], [6907, 6909], [6781, 6908, 6910], [6909, 6911], [6910, 6912, 6955], [6911, 6913], [6782, 6912, 6914], [6913, 6915], [6914, 6916, 6956], [6915, 6917], [6783, 6916, 6918], [6917, 6919], [6918, 6920, 6957], [6919, 6921], [6784, 6920, 6922], [6921, 6923], [6922, 6958], [6787, 6961], [6791, 6965], [6795, 6969], [6799, 6973], [6803, 6977], [6807, 6981], [6811, 6985], [6815, 6989], [6819, 6993], [6823, 6997], [6827, 7001], [6831, 7005], [6835, 7009], [6839, 7013], [6843, 7017], [6847, 7021], [6851, 7025], [6855, 7029], [6859, 7033], [6863, 7037], [6867, 7041], [6871, 7045], [6875, 7049], [6879, 7053], [6883, 7057], [6887, 7061], [6891, 7065], [6895, 7069], [6899, 7073], [6903, 7077], [6907, 7081], [6911, 7085], [6915, 7089], [6919, 7093], [6923, 7097], [6960, 7098], [6959, 6961], [6924, 6960, 6962], [6961, 6963], [6962, 6964, 7099], [6963, 6965], [6925, 6964, 6966], [6965, 6967], [6966, 6968, 7100], [6967, 6969], [6926, 6968, 6970], [6969, 6971], [6970, 6972, 7101], [6971, 6973], [6927, 6972, 6974], [6973, 6975], [6974, 6976, 7102], [6975, 6977], [6928, 6976, 6978], [6977, 6979], [6978, 6980, 7103], [6979, 6981], [6929, 6980, 6982], [6981, 6983], [6982, 6984, 7104], [6983, 6985], [6930, 6984, 6986], [6985, 6987], [6986, 6988, 7105], [6987, 6989], [6931, 6988, 6990], [6989, 6991], [6990, 6992, 7106], [6991, 6993], [6932, 6992, 6994], [6993, 6995], [6994, 6996, 7107], [6995, 6997], [6933, 6996, 6998], [6997, 6999], [6998, 7000, 7108], [6999, 7001], [6934, 7000, 7002], [7001, 7003], [7002, 7004, 7109], [7003, 7005], [6935, 7004, 7006], [7005, 7007], [7006, 7008, 7110], [7007, 7009], [6936, 7008, 7010], [7009, 7011], [7010, 7012, 7111], [7011, 7013], [6937, 7012, 7014], [7013, 7015], [7014, 7016, 7112], [7015, 7017], [6938, 7016, 7018], [7017, 7019], [7018, 7020, 7113], [7019, 7021], [6939, 7020, 7022], [7021, 7023], [7022, 7024, 7114], [7023, 7025], [6940, 7024, 7026], [7025, 7027], [7026, 7028, 7115], [7027, 7029], [6941, 7028, 7030], [7029, 7031], [7030, 7032, 7116], [7031, 7033], [6942, 7032, 7034], [7033, 7035], [7034, 7036, 7117], [7035, 7037], [6943, 7036, 7038], [7037, 7039], [7038, 7040, 7118], [7039, 7041], [6944, 7040, 7042], [7041, 7043], [7042, 7044, 7119], [7043, 7045], [6945, 7044, 7046], [7045, 7047], [7046, 7048, 7120], [7047, 7049], [6946, 7048, 7050], [7049, 7051], [7050, 7052, 7121], [7051, 7053], [6947, 7052, 7054], [7053, 7055], [7054, 7056, 7122], [7055, 7057], [6948, 7056, 7058], [7057, 7059], [7058, 7060, 7123], [7059, 7061], [6949, 7060, 7062], [7061, 7063], [7062, 7064, 7124], [7063, 7065], [6950, 7064, 7066], [7065, 7067], [7066, 7068, 7125], [7067, 7069], [6951, 7068, 7070], [7069, 7071], [7070, 7072, 7126], [7071, 7073], [6952, 7072, 7074], [7073, 7075], [7074, 7076, 7127], [7075, 7077], [6953, 7076, 7078], [7077, 7079], [7078, 7080, 7128], [7079, 7081], [6954, 7080, 7082], [7081, 7083], [7082, 7084, 7129], [7083, 7085], [6955, 7084, 7086], [7085, 7087], [7086, 7088, 7130], [7087, 7089], [6956, 7088, 7090], [7089, 7091], [7090, 7092, 7131], [7091, 7093], [6957, 7092, 7094], [7093, 7095], [7094, 7096, 7132], [7095, 7097], [6958, 7096], [6959, 7133], [6963, 7137], [6967, 7141], [6971, 7145], [6975, 7149], [6979, 7153], [6983, 7157], [6987, 7161], [6991, 7165], [6995, 7169], [6999, 7173], [7003, 7177], [7007, 7181], [7011, 7185], [7015, 7189], [7019, 7193], [7023, 7197], [7027, 7201], [7031, 7205], [7035, 7209], [7039, 7213], [7043, 7217], [7047, 7221], [7051, 7225], [7055, 7229], [7059, 7233], [7063, 7237], [7067, 7241], [7071, 7245], [7075, 7249], [7079, 7253], [7083, 7257], [7087, 7261], [7091, 7265], [7095, 7269], [7098, 7134], [7133, 7135], [7134, 7136, 7272], [7135, 7137], [7099, 7136, 7138], [7137, 7139], [7138, 7140, 7273], [7139, 7141], [7100, 7140, 7142], [7141, 7143], [7142, 7144, 7274], [7143, 7145], [7101, 7144, 7146], [7145, 7147], [7146, 7148, 7275], [7147, 7149], [7102, 7148, 7150], [7149, 7151], [7150, 7152, 7276], [7151, 7153], [7103, 7152, 7154], [7153, 7155], [7154, 7156, 7277], [7155, 7157], [7104, 7156, 7158], [7157, 7159], [7158, 7160, 7278], [7159, 7161], [7105, 7160, 7162], [7161, 7163], [7162, 7164, 7279], [7163, 7165], [7106, 7164, 7166], [7165, 7167], [7166, 7168, 7280], [7167, 7169], [7107, 7168, 7170], [7169, 7171], [7170, 7172, 7281], [7171, 7173], [7108, 7172, 7174], [7173, 7175], [7174, 7176, 7282], [7175, 7177], [7109, 7176, 7178], [7177, 7179], [7178, 7180, 7283], [7179, 7181], [7110, 7180, 7182], [7181, 7183], [7182, 7184, 7284], [7183, 7185], [7111, 7184, 7186], [7185, 7187], [7186, 7188, 7285], [7187, 7189], [7112, 7188, 7190], [7189, 7191], [7190, 7192, 7286], [7191, 7193], [7113, 7192, 7194], [7193, 7195], [7194, 7196, 7287], [7195, 7197], [7114, 7196, 7198], [7197, 7199], [7198, 7200, 7288], [7199, 7201], [7115, 7200, 7202], [7201, 7203], [7202, 7204, 7289], [7203, 7205], [7116, 7204, 7206], [7205, 7207], [7206, 7208, 7290], [7207, 7209], [7117, 7208, 7210], [7209, 7211], [7210, 7212, 7291], [7211, 7213], [7118, 7212, 7214], [7213, 7215], [7214, 7216, 7292], [7215, 7217], [7119, 7216, 7218], [7217, 7219], [7218, 7220, 7293], [7219, 7221], [7120, 7220, 7222], [7221, 7223], [7222, 7224, 7294], [7223, 7225], [7121, 7224, 7226], [7225, 7227], [7226, 7228, 7295], [7227, 7229], [7122, 7228, 7230], [7229, 7231], [7230, 7232, 7296], [7231, 7233], [7123, 7232, 7234], [7233, 7235], [7234, 7236, 7297], [7235, 7237], [7124, 7236, 7238], [7237, 7239], [7238, 7240, 7298], [7239, 7241], [7125, 7240, 7242], [7241, 7243], [7242, 7244, 7299], [7243, 7245], [7126, 7244, 7246], [7245, 7247], [7246, 7248, 7300], [7247, 7249], [7127, 7248, 7250], [7249, 7251], [7250, 7252, 7301], [7251, 7253], [7128, 7252, 7254], [7253, 7255], [7254, 7256, 7302], [7255, 7257], [7129, 7256, 7258], [7257, 7259], [7258, 7260, 7303], [7259, 7261], [7130, 7260, 7262], [7261, 7263], [7262, 7264, 7304], [7263, 7265], [7131, 7264, 7266], [7265, 7267], [7266, 7268, 7305], [7267, 7269], [7132, 7268, 7270], [7269, 7271], [7270, 7306], [7135, 7309], [7139, 7313], [7143, 7317], [7147, 7321], [7151, 7325], [7155, 7329], [7159, 7333], [7163, 7337], [7167, 7341], [7171, 7345], [7175, 7349], [7179, 7353], [7183, 7357], [7187, 7361], [7191, 7365], [7195, 7369], [7199, 7373], [7203, 7377], [7207, 7381], [7211, 7385], [7215, 7389], [7219, 7393], [7223, 7397], [7227, 7401], [7231, 7405], [7235, 7409], [7239, 7413], [7243, 7417], [7247, 7421], [7251, 7425], [7255, 7429], [7259, 7433], [7263, 7437], [7267, 7441], [7271, 7445], [7308, 7446], [7307, 7309], [7272, 7308, 7310], [7309, 7311], [7310, 7312, 7447], [7311, 7313], [7273, 7312, 7314], [7313, 7315], [7314, 7316, 7448], [7315, 7317], [7274, 7316, 7318], [7317, 7319], [7318, 7320, 7449], [7319, 7321], [7275, 7320, 7322], [7321, 7323], [7322, 7324, 7450], [7323, 7325], [7276, 7324, 7326], [7325, 7327], [7326, 7328, 7451], [7327, 7329], [7277, 7328, 7330], [7329, 7331], [7330, 7332, 7452], [7331, 7333], [7278, 7332, 7334], [7333, 7335], [7334, 7336, 7453], [7335, 7337], [7279, 7336, 7338], [7337, 7339], [7338, 7340, 7454], [7339, 7341], [7280, 7340, 7342], [7341, 7343], [7342, 7344, 7455], [7343, 7345], [7281, 7344, 7346], [7345, 7347], [7346, 7348, 7456], [7347, 7349], [7282, 7348, 7350], [7349, 7351], [7350, 7352, 7457], [7351, 7353], [7283, 7352, 7354], [7353, 7355], [7354, 7356, 7458], [7355, 7357], [7284, 7356, 7358], [7357, 7359], [7358, 7360, 7459], [7359, 7361], [7285, 7360, 7362], [7361, 7363], [7362, 7364, 7460], [7363, 7365], [7286, 7364, 7366], [7365, 7367], [7366, 7368, 7461], [7367, 7369], [7287, 7368, 7370], [7369, 7371], [7370, 7372, 7462], [7371, 7373], [7288, 7372, 7374], [7373, 7375], [7374, 7376, 7463], [7375, 7377], [7289, 7376, 7378], [7377, 7379], [7378, 7380, 7464], [7379, 7381], [7290, 7380, 7382], [7381, 7383], [7382, 7384, 7465], [7383, 7385], [7291, 7384, 7386], [7385, 7387], [7386, 7388, 7466], [7387, 7389], [7292, 7388, 7390], [7389, 7391], [7390, 7392, 7467], [7391, 7393], [7293, 7392, 7394], [7393, 7395], [7394, 7396, 7468], [7395, 7397], [7294, 7396, 7398], [7397, 7399], [7398, 7400, 7469], [7399, 7401], [7295, 7400, 7402], [7401, 7403], [7402, 7404, 7470], [7403, 7405], [7296, 7404, 7406], [7405, 7407], [7406, 7408, 7471], [7407, 7409], [7297, 7408, 7410], [7409, 7411], [7410, 7412, 7472], [7411, 7413], [7298, 7412, 7414], [7413, 7415], [7414, 7416, 7473], [7415, 7417], [7299, 7416, 7418], [7417, 7419], [7418, 7420, 7474], [7419, 7421], [7300, 7420, 7422], [7421, 7423], [7422, 7424, 7475], [7423, 7425], [7301, 7424, 7426], [7425, 7427], [7426, 7428, 7476], [7427, 7429], [7302, 7428, 7430], [7429, 7431], [7430, 7432, 7477], [7431, 7433], [7303, 7432, 7434], [7433, 7435], [7434, 7436, 7478], [7435, 7437], [7304, 7436, 7438], [7437, 7439], [7438, 7440, 7479], [7439, 7441], [7305, 7440, 7442], [7441, 7443], [7442, 7444, 7480], [7443, 7445], [7306, 7444], [7307, 7481], [7311, 7485], [7315, 7489], [7319, 7493], [7323, 7497], [7327, 7501], [7331, 7505], [7335, 7509], [7339, 7513], [7343, 7517], [7347, 7521], [7351, 7525], [7355, 7529], [7359, 7533], [7363, 7537], [7367, 7541], [7371, 7545], [7375, 7549], [7379, 7553], [7383, 7557], [7387, 7561], [7391, 7565], [7395, 7569], [7399, 7573], [7403, 7577], [7407, 7581], [7411, 7585], [7415, 7589], [7419, 7593], [7423, 7597], [7427, 7601], [7431, 7605], [7435, 7609], [7439, 7613], [7443, 7617], [7446, 7482], [7481, 7483], [7482, 7484, 7620], [7483, 7485], [7447, 7484, 7486], [7485, 7487], [7486, 7488, 7621], [7487, 7489], [7448, 7488, 7490], [7489, 7491], [7490, 7492, 7622], [7491, 7493], [7449, 7492, 7494], [7493, 7495], [7494, 7496, 7623], [7495, 7497], [7450, 7496, 7498], [7497, 7499], [7498, 7500, 7624], [7499, 7501], [7451, 7500, 7502], [7501, 7503], [7502, 7504, 7625], [7503, 7505], [7452, 7504, 7506], [7505, 7507], [7506, 7508, 7626], [7507, 7509], [7453, 7508, 7510], [7509, 7511], [7510, 7512, 7627], [7511, 7513], [7454, 7512, 7514], [7513, 7515], [7514, 7516, 7628], [7515, 7517], [7455, 7516, 7518], [7517, 7519], [7518, 7520, 7629], [7519, 7521], [7456, 7520, 7522], [7521, 7523], [7522, 7524, 7630], [7523, 7525], [7457, 7524, 7526], [7525, 7527], [7526, 7528, 7631], [7527, 7529], [7458, 7528, 7530], [7529, 7531], [7530, 7532, 7632], [7531, 7533], [7459, 7532, 7534], [7533, 7535], [7534, 7536, 7633], [7535, 7537], [7460, 7536, 7538], [7537, 7539], [7538, 7540, 7634], [7539, 7541], [7461, 7540, 7542], [7541, 7543], [7542, 7544, 7635], [7543, 7545], [7462, 7544, 7546], [7545, 7547], [7546, 7548, 7636], [7547, 7549], [7463, 7548, 7550], [7549, 7551], [7550, 7552, 7637], [7551, 7553], [7464, 7552, 7554], [7553, 7555], [7554, 7556, 7638], [7555, 7557], [7465, 7556, 7558], [7557, 7559], [7558, 7560, 7639], [7559, 7561], [7466, 7560, 7562], [7561, 7563], [7562, 7564, 7640], [7563, 7565], [7467, 7564, 7566], [7565, 7567], [7566, 7568, 7641], [7567, 7569], [7468, 7568, 7570], [7569, 7571], [7570, 7572, 7642], [7571, 7573], [7469, 7572, 7574], [7573, 7575], [7574, 7576, 7643], [7575, 7577], [7470, 7576, 7578], [7577, 7579], [7578, 7580, 7644], [7579, 7581], [7471, 7580, 7582], [7581, 7583], [7582, 7584, 7645], [7583, 7585], [7472, 7584, 7586], [7585, 7587], [7586, 7588, 7646], [7587, 7589], [7473, 7588, 7590], [7589, 7591], [7590, 7592, 7647], [7591, 7593], [7474, 7592, 7594], [7593, 7595], [7594, 7596, 7648], [7595, 7597], [7475, 7596, 7598], [7597, 7599], [7598, 7600, 7649], [7599, 7601], [7476, 7600, 7602], [7601, 7603], [7602, 7604, 7650], [7603, 7605], [7477, 7604, 7606], [7605, 7607], [7606, 7608, 7651], [7607, 7609], [7478, 7608, 7610], [7609, 7611], [7610, 7612, 7652], [7611, 7613], [7479, 7612, 7614], [7613, 7615], [7614, 7616, 7653], [7615, 7617], [7480, 7616, 7618], [7617, 7619], [7618, 7654], [7483, 7657], [7487, 7661], [7491, 7665], [7495, 7669], [7499, 7673], [7503, 7677], [7507, 7681], [7511, 7685], [7515, 7689], [7519, 7693], [7523, 7697], [7527, 7701], [7531, 7705], [7535, 7709], [7539, 7713], [7543, 7717], [7547, 7721], [7551, 7725], [7555, 7729], [7559, 7733], [7563, 7737], [7567, 7741], [7571, 7745], [7575, 7749], [7579, 7753], [7583, 7757], [7587, 7761], [7591, 7765], [7595, 7769], [7599, 7773], [7603, 7777], [7607, 7781], [7611, 7785], [7615, 7789], [7619, 7793], [7656, 7794], [7655, 7657], [7620, 7656, 7658], [7657, 7659], [7658, 7660, 7795], [7659, 7661], [7621, 7660, 7662], [7661, 7663], [7662, 7664, 7796], [7663, 7665], [7622, 7664, 7666], [7665, 7667], [7666, 7668, 7797], [7667, 7669], [7623, 7668, 7670], [7669, 7671], [7670, 7672, 7798], [7671, 7673], [7624, 7672, 7674], [7673, 7675], [7674, 7676, 7799], [7675, 7677], [7625, 7676, 7678], [7677, 7679], [7678, 7680, 7800], [7679, 7681], [7626, 7680, 7682], [7681, 7683], [7682, 7684, 7801], [7683, 7685], [7627, 7684, 7686], [7685, 7687], [7686, 7688, 7802], [7687, 7689], [7628, 7688, 7690], [7689, 7691], [7690, 7692, 7803], [7691, 7693], [7629, 7692, 7694], [7693, 7695], [7694, 7696, 7804], [7695, 7697], [7630, 7696, 7698], [7697, 7699], [7698, 7700, 7805], [7699, 7701], [7631, 7700, 7702], [7701, 7703], [7702, 7704, 7806], [7703, 7705], [7632, 7704, 7706], [7705, 7707], [7706, 7708, 7807], [7707, 7709], [7633, 7708, 7710], [7709, 7711], [7710, 7712, 7808], [7711, 7713], [7634, 7712, 7714], [7713, 7715], [7714, 7716, 7809], [7715, 7717], [7635, 7716, 7718], [7717, 7719], [7718, 7720, 7810], [7719, 7721], [7636, 7720, 7722], [7721, 7723], [7722, 7724, 7811], [7723, 7725], [7637, 7724, 7726], [7725, 7727], [7726, 7728, 7812], [7727, 7729], [7638, 7728, 7730], [7729, 7731], [7730, 7732, 7813], [7731, 7733], [7639, 7732, 7734], [7733, 7735], [7734, 7736, 7814], [7735, 7737], [7640, 7736, 7738], [7737, 7739], [7738, 7740, 7815], [7739, 7741], [7641, 7740, 7742], [7741, 7743], [7742, 7744, 7816], [7743, 7745], [7642, 7744, 7746], [7745, 7747], [7746, 7748, 7817], [7747, 7749], [7643, 7748, 7750], [7749, 7751], [7750, 7752, 7818], [7751, 7753], [7644, 7752, 7754], [7753, 7755], [7754, 7756, 7819], [7755, 7757], [7645, 7756, 7758], [7757, 7759], [7758, 7760, 7820], [7759, 7761], [7646, 7760, 7762], [7761, 7763], [7762, 7764, 7821], [7763, 7765], [7647, 7764, 7766], [7765, 7767], [7766, 7768, 7822], [7767, 7769], [7648, 7768, 7770], [7769, 7771], [7770, 7772, 7823], [7771, 7773], [7649, 7772, 7774], [7773, 7775], [7774, 7776, 7824], [7775, 7777], [7650, 7776, 7778], [7777, 7779], [7778, 7780, 7825], [7779, 7781], [7651, 7780, 7782], [7781, 7783], [7782, 7784, 7826], [7783, 7785], [7652, 7784, 7786], [7785, 7787], [7786, 7788, 7827], [7787, 7789], [7653, 7788, 7790], [7789, 7791], [7790, 7792, 7828], [7791, 7793], [7654, 7792], [7655, 7829], [7659, 7833], [7663, 7837], [7667, 7841], [7671, 7845], [7675, 7849], [7679, 7853], [7683, 7857], [7687, 7861], [7691, 7865], [7695, 7869], [7699, 7873], [7703, 7877], [7707, 7881], [7711, 7885], [7715, 7889], [7719, 7893], [7723, 7897], [7727, 7901], [7731, 7905], [7735, 7909], [7739, 7913], [7743, 7917], [7747, 7921], [7751, 7925], [7755, 7929], [7759, 7933], [7763, 7937], [7767, 7941], [7771, 7945], [7775, 7949], [7779, 7953], [7783, 7957], [7787, 7961], [7791, 7965], [7794, 7830], [7829, 7831], [7830, 7832, 7968], [7831, 7833], [7795, 7832, 7834], [7833, 7835], [7834, 7836, 7969], [7835, 7837], [7796, 7836, 7838], [7837, 7839], [7838, 7840, 7970], [7839, 7841], [7797, 7840, 7842], [7841, 7843], [7842, 7844, 7971], [7843, 7845], [7798, 7844, 7846], [7845, 7847], [7846, 7848, 7972], [7847, 7849], [7799, 7848, 7850], [7849, 7851], [7850, 7852, 7973], [7851, 7853], [7800, 7852, 7854], [7853, 7855], [7854, 7856, 7974], [7855, 7857], [7801, 7856, 7858], [7857, 7859], [7858, 7860, 7975], [7859, 7861], [7802, 7860, 7862], [7861, 7863], [7862, 7864, 7976], [7863, 7865], [7803, 7864, 7866], [7865, 7867], [7866, 7868, 7977], [7867, 7869], [7804, 7868, 7870], [7869, 7871], [7870, 7872, 7978], [7871, 7873], [7805, 7872, 7874], [7873, 7875], [7874, 7876, 7979], [7875, 7877], [7806, 7876, 7878], [7877, 7879], [7878, 7880, 7980], [7879, 7881], [7807, 7880, 7882], [7881, 7883], [7882, 7884, 7981], [7883, 7885], [7808, 7884, 7886], [7885, 7887], [7886, 7888, 7982], [7887, 7889], [7809, 7888, 7890], [7889, 7891], [7890, 7892, 7983], [7891, 7893], [7810, 7892, 7894], [7893, 7895], [7894, 7896, 7984], [7895, 7897], [7811, 7896, 7898], [7897, 7899], [7898, 7900, 7985], [7899, 7901], [7812, 7900, 7902], [7901, 7903], [7902, 7904, 7986], [7903, 7905], [7813, 7904, 7906], [7905, 7907], [7906, 7908, 7987], [7907, 7909], [7814, 7908, 7910], [7909, 7911], [7910, 7912, 7988], [7911, 7913], [7815, 7912, 7914], [7913, 7915], [7914, 7916, 7989], [7915, 7917], [7816, 7916, 7918], [7917, 7919], [7918, 7920, 7990], [7919, 7921], [7817, 7920, 7922], [7921, 7923], [7922, 7924, 7991], [7923, 7925], [7818, 7924, 7926], [7925, 7927], [7926, 7928, 7992], [7927, 7929], [7819, 7928, 7930], [7929, 7931], [7930, 7932, 7993], [7931, 7933], [7820, 7932, 7934], [7933, 7935], [7934, 7936, 7994], [7935, 7937], [7821, 7936, 7938], [7937, 7939], [7938, 7940, 7995], [7939, 7941], [7822, 7940, 7942], [7941, 7943], [7942, 7944, 7996], [7943, 7945], [7823, 7944, 7946], [7945, 7947], [7946, 7948, 7997], [7947, 7949], [7824, 7948, 7950], [7949, 7951], [7950, 7952, 7998], [7951, 7953], [7825, 7952, 7954], [7953, 7955], [7954, 7956, 7999], [7955, 7957], [7826, 7956, 7958], [7957, 7959], [7958, 7960, 8000], [7959, 7961], [7827, 7960, 7962], [7961, 7963], [7962, 7964, 8001], [7963, 7965], [7828, 7964, 7966], [7965, 7967], [7966, 8002], [7831, 8005], [7835, 8009], [7839, 8013], [7843, 8017], [7847, 8021], [7851, 8025], [7855, 8029], [7859, 8033], [7863, 8037], [7867, 8041], [7871, 8045], [7875, 8049], [7879, 8053], [7883, 8057], [7887, 8061], [7891, 8065], [7895, 8069], [7899, 8073], [7903, 8077], [7907, 8081], [7911, 8085], [7915, 8089], [7919, 8093], [7923, 8097], [7927, 8101], [7931, 8105], [7935, 8109], [7939, 8113], [7943, 8117], [7947, 8121], [7951, 8125], [7955, 8129], [7959, 8133], [7963, 8137], [7967, 8141], [8004, 8142], [8003, 8005], [7968, 8004, 8006], [8005, 8007], [8006, 8008, 8143], [8007, 8009], [7969, 8008, 8010], [8009, 8011], [8010, 8012, 8144], [8011, 8013], [7970, 8012, 8014], [8013, 8015], [8014, 8016, 8145], [8015, 8017], [7971, 8016, 8018], [8017, 8019], [8018, 8020, 8146], [8019, 8021], [7972, 8020, 8022], [8021, 8023], [8022, 8024, 8147], [8023, 8025], [7973, 8024, 8026], [8025, 8027], [8026, 8028, 8148], [8027, 8029], [7974, 8028, 8030], [8029, 8031], [8030, 8032, 8149], [8031, 8033], [7975, 8032, 8034], [8033, 8035], [8034, 8036, 8150], [8035, 8037], [7976, 8036, 8038], [8037, 8039], [8038, 8040, 8151], [8039, 8041], [7977, 8040, 8042], [8041, 8043], [8042, 8044, 8152], [8043, 8045], [7978, 8044, 8046], [8045, 8047], [8046, 8048, 8153], [8047, 8049], [7979, 8048, 8050], [8049, 8051], [8050, 8052, 8154], [8051, 8053], [7980, 8052, 8054], [8053, 8055], [8054, 8056, 8155], [8055, 8057], [7981, 8056, 8058], [8057, 8059], [8058, 8060, 8156], [8059, 8061], [7982, 8060, 8062], [8061, 8063], [8062, 8064, 8157], [8063, 8065], [7983, 8064, 8066], [8065, 8067], [8066, 8068, 8158], [8067, 8069], [7984, 8068, 8070], [8069, 8071], [8070, 8072, 8159], [8071, 8073], [7985, 8072, 8074], [8073, 8075], [8074, 8076, 8160], [8075, 8077], [7986, 8076, 8078], [8077, 8079], [8078, 8080, 8161], [8079, 8081], [7987, 8080, 8082], [8081, 8083], [8082, 8084, 8162], [8083, 8085], [7988, 8084, 8086], [8085, 8087], [8086, 8088, 8163], [8087, 8089], [7989, 8088, 8090], [8089, 8091], [8090, 8092, 8164], [8091, 8093], [7990, 8092, 8094], [8093, 8095], [8094, 8096, 8165], [8095, 8097], [7991, 8096, 8098], [8097, 8099], [8098, 8100, 8166], [8099, 8101], [7992, 8100, 8102], [8101, 8103], [8102, 8104, 8167], [8103, 8105], [7993, 8104, 8106], [8105, 8107], [8106, 8108, 8168], [8107, 8109], [7994, 8108, 8110], [8109, 8111], [8110, 8112, 8169], [8111, 8113], [7995, 8112, 8114], [8113, 8115], [8114, 8116, 8170], [8115, 8117], [7996, 8116, 8118], [8117, 8119], [8118, 8120, 8171], [8119, 8121], [7997, 8120, 8122], [8121, 8123], [8122, 8124, 8172], [8123, 8125], [7998, 8124, 8126], [8125, 8127], [8126, 8128, 8173], [8127, 8129], [7999, 8128, 8130], [8129, 8131], [8130, 8132, 8174], [8131, 8133], [8000, 8132, 8134], [8133, 8135], [8134, 8136, 8175], [8135, 8137], [8001, 8136, 8138], [8137, 8139], [8138, 8140, 8176], [8139, 8141], [8002, 8140], [8003, 8177], [8007, 8181], [8011, 8185], [8015, 8189], [8019, 8193], [8023, 8197], [8027, 8201], [8031, 8205], [8035, 8209], [8039, 8213], [8043, 8217], [8047, 8221], [8051, 8225], [8055, 8229], [8059, 8233], [8063, 8237], [8067, 8241], [8071, 8245], [8075, 8249], [8079, 8253], [8083, 8257], [8087, 8261], [8091, 8265], [8095, 8269], [8099, 8273], [8103, 8277], [8107, 8281], [8111, 8285], [8115, 8289], [8119, 8293], [8123, 8297], [8127, 8301], [8131, 8305], [8135, 8309], [8139, 8313], [8142, 8178], [8177, 8179], [8178, 8180, 8316], [8179, 8181], [8143, 8180, 8182], [8181, 8183], [8182, 8184, 8317], [8183, 8185], [8144, 8184, 8186], [8185, 8187], [8186, 8188, 8318], [8187, 8189], [8145, 8188, 8190], [8189, 8191], [8190, 8192, 8319], [8191, 8193], [8146, 8192, 8194], [8193, 8195], [8194, 8196, 8320], [8195, 8197], [8147, 8196, 8198], [8197, 8199], [8198, 8200, 8321], [8199, 8201], [8148, 8200, 8202], [8201, 8203], [8202, 8204, 8322], [8203, 8205], [8149, 8204, 8206], [8205, 8207], [8206, 8208, 8323], [8207, 8209], [8150, 8208, 8210], [8209, 8211], [8210, 8212, 8324], [8211, 8213], [8151, 8212, 8214], [8213, 8215], [8214, 8216, 8325], [8215, 8217], [8152, 8216, 8218], [8217, 8219], [8218, 8220, 8326], [8219, 8221], [8153, 8220, 8222], [8221, 8223], [8222, 8224, 8327], [8223, 8225], [8154, 8224, 8226], [8225, 8227], [8226, 8228, 8328], [8227, 8229], [8155, 8228, 8230], [8229, 8231], [8230, 8232, 8329], [8231, 8233], [8156, 8232, 8234], [8233, 8235], [8234, 8236, 8330], [8235, 8237], [8157, 8236, 8238], [8237, 8239], [8238, 8240, 8331], [8239, 8241], [8158, 8240, 8242], [8241, 8243], [8242, 8244, 8332], [8243, 8245], [8159, 8244, 8246], [8245, 8247], [8246, 8248, 8333], [8247, 8249], [8160, 8248, 8250], [8249, 8251], [8250, 8252, 8334], [8251, 8253], [8161, 8252, 8254], [8253, 8255], [8254, 8256, 8335], [8255, 8257], [8162, 8256, 8258], [8257, 8259], [8258, 8260, 8336], [8259, 8261], [8163, 8260, 8262], [8261, 8263], [8262, 8264, 8337], [8263, 8265], [8164, 8264, 8266], [8265, 8267], [8266, 8268, 8338], [8267, 8269], [8165, 8268, 8270], [8269, 8271], [8270, 8272, 8339], [8271, 8273], [8166, 8272, 8274], [8273, 8275], [8274, 8276, 8340], [8275, 8277], [8167, 8276, 8278], [8277, 8279], [8278, 8280, 8341], [8279, 8281], [8168, 8280, 8282], [8281, 8283], [8282, 8284, 8342], [8283, 8285], [8169, 8284, 8286], [8285, 8287], [8286, 8288, 8343], [8287, 8289], [8170, 8288, 8290], [8289, 8291], [8290, 8292, 8344], [8291, 8293], [8171, 8292, 8294], [8293, 8295], [8294, 8296, 8345], [8295, 8297], [8172, 8296, 8298], [8297, 8299], [8298, 8300, 8346], [8299, 8301], [8173, 8300, 8302], [8301, 8303], [8302, 8304, 8347], [8303, 8305], [8174, 8304, 8306], [8305, 8307], [8306, 8308, 8348], [8307, 8309], [8175, 8308, 8310], [8309, 8311], [8310, 8312, 8349], [8311, 8313], [8176, 8312, 8314], [8313, 8315], [8314, 8350], [8179, 8353], [8183, 8357], [8187, 8361], [8191, 8365], [8195, 8369], [8199, 8373], [8203, 8377], [8207, 8381], [8211, 8385], [8215, 8389], [8219, 8393], [8223, 8397], [8227, 8401], [8231, 8405], [8235, 8409], [8239, 8413], [8243, 8417], [8247, 8421], [8251, 8425], [8255, 8429], [8259, 8433], [8263, 8437], [8267, 8441], [8271, 8445], [8275, 8449], [8279, 8453], [8283, 8457], [8287, 8461], [8291, 8465], [8295, 8469], [8299, 8473], [8303, 8477], [8307, 8481], [8311, 8485], [8315, 8489], [8352, 8490], [8351, 8353], [8316, 8352, 8354], [8353, 8355], [8354, 8356, 8491], [8355, 8357], [8317, 8356, 8358], [8357, 8359], [8358, 8360, 8492], [8359, 8361], [8318, 8360, 8362], [8361, 8363], [8362, 8364, 8493], [8363, 8365], [8319, 8364, 8366], [8365, 8367], [8366, 8368, 8494], [8367, 8369], [8320, 8368, 8370], [8369, 8371], [8370, 8372, 8495], [8371, 8373], [8321, 8372, 8374], [8373, 8375], [8374, 8376, 8496], [8375, 8377], [8322, 8376, 8378], [8377, 8379], [8378, 8380, 8497], [8379, 8381], [8323, 8380, 8382], [8381, 8383], [8382, 8384, 8498], [8383, 8385], [8324, 8384, 8386], [8385, 8387], [8386, 8388, 8499], [8387, 8389], [8325, 8388, 8390], [8389, 8391], [8390, 8392, 8500], [8391, 8393], [8326, 8392, 8394], [8393, 8395], [8394, 8396, 8501], [8395, 8397], [8327, 8396, 8398], [8397, 8399], [8398, 8400, 8502], [8399, 8401], [8328, 8400, 8402], [8401, 8403], [8402, 8404, 8503], [8403, 8405], [8329, 8404, 8406], [8405, 8407], [8406, 8408, 8504], [8407, 8409], [8330, 8408, 8410], [8409, 8411], [8410, 8412, 8505], [8411, 8413], [8331, 8412, 8414], [8413, 8415], [8414, 8416, 8506], [8415, 8417], [8332, 8416, 8418], [8417, 8419], [8418, 8420, 8507], [8419, 8421], [8333, 8420, 8422], [8421, 8423], [8422, 8424, 8508], [8423, 8425], [8334, 8424, 8426], [8425, 8427], [8426, 8428, 8509], [8427, 8429], [8335, 8428, 8430], [8429, 8431], [8430, 8432, 8510], [8431, 8433], [8336, 8432, 8434], [8433, 8435], [8434, 8436, 8511], [8435, 8437], [8337, 8436, 8438], [8437, 8439], [8438, 8440, 8512], [8439, 8441], [8338, 8440, 8442], [8441, 8443], [8442, 8444, 8513], [8443, 8445], [8339, 8444, 8446], [8445, 8447], [8446, 8448, 8514], [8447, 8449], [8340, 8448, 8450], [8449, 8451], [8450, 8452, 8515], [8451, 8453], [8341, 8452, 8454], [8453, 8455], [8454, 8456, 8516], [8455, 8457], [8342, 8456, 8458], [8457, 8459], [8458, 8460, 8517], [8459, 8461], [8343, 8460, 8462], [8461, 8463], [8462, 8464, 8518], [8463, 8465], [8344, 8464, 8466], [8465, 8467], [8466, 8468, 8519], [8467, 8469], [8345, 8468, 8470], [8469, 8471], [8470, 8472, 8520], [8471, 8473], [8346, 8472, 8474], [8473, 8475], [8474, 8476, 8521], [8475, 8477], [8347, 8476, 8478], [8477, 8479], [8478, 8480, 8522], [8479, 8481], [8348, 8480, 8482], [8481, 8483], [8482, 8484, 8523], [8483, 8485], [8349, 8484, 8486], [8485, 8487], [8486, 8488, 8524], [8487, 8489], [8350, 8488], [8351, 8525], [8355, 8529], [8359, 8533], [8363, 8537], [8367, 8541], [8371, 8545], [8375, 8549], [8379, 8553], [8383, 8557], [8387, 8561], [8391, 8565], [8395, 8569], [8399, 8573], [8403, 8577], [8407, 8581], [8411, 8585], [8415, 8589], [8419, 8593], [8423, 8597], [8427, 8601], [8431, 8605], [8435, 8609], [8439, 8613], [8443, 8617], [8447, 8621], [8451, 8625], [8455, 8629], [8459, 8633], [8463, 8637], [8467, 8641], [8471, 8645], [8475, 8649], [8479, 8653], [8483, 8657], [8487, 8661], [8490, 8526], [8525, 8527], [8526, 8528, 8664], [8527, 8529], [8491, 8528, 8530], [8529, 8531], [8530, 8532, 8665], [8531, 8533], [8492, 8532, 8534], [8533, 8535], [8534, 8536, 8666], [8535, 8537], [8493, 8536, 8538], [8537, 8539], [8538, 8540, 8667], [8539, 8541], [8494, 8540, 8542], [8541, 8543], [8542, 8544, 8668], [8543, 8545], [8495, 8544, 8546], [8545, 8547], [8546, 8548, 8669], [8547, 8549], [8496, 8548, 8550], [8549, 8551], [8550, 8552, 8670], [8551, 8553], [8497, 8552, 8554], [8553, 8555], [8554, 8556, 8671], [8555, 8557], [8498, 8556, 8558], [8557, 8559], [8558, 8560, 8672], [8559, 8561], [8499, 8560, 8562], [8561, 8563], [8562, 8564, 8673], [8563, 8565], [8500, 8564, 8566], [8565, 8567], [8566, 8568, 8674], [8567, 8569], [8501, 8568, 8570], [8569, 8571], [8570, 8572, 8675], [8571, 8573], [8502, 8572, 8574], [8573, 8575], [8574, 8576, 8676], [8575, 8577], [8503, 8576, 8578], [8577, 8579], [8578, 8580, 8677], [8579, 8581], [8504, 8580, 8582], [8581, 8583], [8582, 8584, 8678], [8583, 8585], [8505, 8584, 8586], [8585, 8587], [8586, 8588, 8679], [8587, 8589], [8506, 8588, 8590], [8589, 8591], [8590, 8592, 8680], [8591, 8593], [8507, 8592, 8594], [8593, 8595], [8594, 8596, 8681], [8595, 8597], [8508, 8596, 8598], [8597, 8599], [8598, 8600, 8682], [8599, 8601], [8509, 8600, 8602], [8601, 8603], [8602, 8604, 8683], [8603, 8605], [8510, 8604, 8606], [8605, 8607], [8606, 8608, 8684], [8607, 8609], [8511, 8608, 8610], [8609, 8611], [8610, 8612, 8685], [8611, 8613], [8512, 8612, 8614], [8613, 8615], [8614, 8616, 8686], [8615, 8617], [8513, 8616, 8618], [8617, 8619], [8618, 8620, 8687], [8619, 8621], [8514, 8620, 8622], [8621, 8623], [8622, 8624, 8688], [8623, 8625], [8515, 8624, 8626], [8625, 8627], [8626, 8628, 8689], [8627, 8629], [8516, 8628, 8630], [8629, 8631], [8630, 8632, 8690], [8631, 8633], [8517, 8632, 8634], [8633, 8635], [8634, 8636, 8691], [8635, 8637], [8518, 8636, 8638], [8637, 8639], [8638, 8640, 8692], [8639, 8641], [8519, 8640, 8642], [8641, 8643], [8642, 8644, 8693], [8643, 8645], [8520, 8644, 8646], [8645, 8647], [8646, 8648, 8694], [8647, 8649], [8521, 8648, 8650], [8649, 8651], [8650, 8652, 8695], [8651, 8653], [8522, 8652, 8654], [8653, 8655], [8654, 8656, 8696], [8655, 8657], [8523, 8656, 8658], [8657, 8659], [8658, 8660, 8697], [8659, 8661], [8524, 8660, 8662], [8661, 8663], [8662, 8698], [8527, 8701], [8531, 8705], [8535, 8709], [8539, 8713], [8543, 8717], [8547, 8721], [8551, 8725], [8555, 8729], [8559, 8733], [8563, 8737], [8567, 8741], [8571, 8745], [8575, 8749], [8579, 8753], [8583, 8757], [8587, 8761], [8591, 8765], [8595, 8769], [8599, 8773], [8603, 8777], [8607, 8781], [8611, 8785], [8615, 8789], [8619, 8793], [8623, 8797], [8627, 8801], [8631, 8805], [8635, 8809], [8639, 8813], [8643, 8817], [8647, 8821], [8651, 8825], [8655, 8829], [8659, 8833], [8663, 8837], [8700, 8838], [8699, 8701], [8664, 8700, 8702], [8701, 8703], [8702, 8704, 8839], [8703, 8705], [8665, 8704, 8706], [8705, 8707], [8706, 8708, 8840], [8707, 8709], [8666, 8708, 8710], [8709, 8711], [8710, 8712, 8841], [8711, 8713], [8667, 8712, 8714], [8713, 8715], [8714, 8716, 8842], [8715, 8717], [8668, 8716, 8718], [8717, 8719], [8718, 8720, 8843], [8719, 8721], [8669, 8720, 8722], [8721, 8723], [8722, 8724, 8844], [8723, 8725], [8670, 8724, 8726], [8725, 8727], [8726, 8728, 8845], [8727, 8729], [8671, 8728, 8730], [8729, 8731], [8730, 8732, 8846], [8731, 8733], [8672, 8732, 8734], [8733, 8735], [8734, 8736, 8847], [8735, 8737], [8673, 8736, 8738], [8737, 8739], [8738, 8740, 8848], [8739, 8741], [8674, 8740, 8742], [8741, 8743], [8742, 8744, 8849], [8743, 8745], [8675, 8744, 8746], [8745, 8747], [8746, 8748, 8850], [8747, 8749], [8676, 8748, 8750], [8749, 8751], [8750, 8752, 8851], [8751, 8753], [8677, 8752, 8754], [8753, 8755], [8754, 8756, 8852], [8755, 8757], [8678, 8756, 8758], [8757, 8759], [8758, 8760, 8853], [8759, 8761], [8679, 8760, 8762], [8761, 8763], [8762, 8764, 8854], [8763, 8765], [8680, 8764, 8766], [8765, 8767], [8766, 8768, 8855], [8767, 8769], [8681, 8768, 8770], [8769, 8771], [8770, 8772, 8856], [8771, 8773], [8682, 8772, 8774], [8773, 8775], [8774, 8776, 8857], [8775, 8777], [8683, 8776, 8778], [8777, 8779], [8778, 8780, 8858], [8779, 8781], [8684, 8780, 8782], [8781, 8783], [8782, 8784, 8859], [8783, 8785], [8685, 8784, 8786], [8785, 8787], [8786, 8788, 8860], [8787, 8789], [8686, 8788, 8790], [8789, 8791], [8790, 8792, 8861], [8791, 8793], [8687, 8792, 8794], [8793, 8795], [8794, 8796, 8862], [8795, 8797], [8688, 8796, 8798], [8797, 8799], [8798, 8800, 8863], [8799, 8801], [8689, 8800, 8802], [8801, 8803], [8802, 8804, 8864], [8803, 8805], [8690, 8804, 8806], [8805, 8807], [8806, 8808, 8865], [8807, 8809], [8691, 8808, 8810], [8809, 8811], [8810, 8812, 8866], [8811, 8813], [8692, 8812, 8814], [8813, 8815], [8814, 8816, 8867], [8815, 8817], [8693, 8816, 8818], [8817, 8819], [8818, 8820, 8868], [8819, 8821], [8694, 8820, 8822], [8821, 8823], [8822, 8824, 8869], [8823, 8825], [8695, 8824, 8826], [8825, 8827], [8826, 8828, 8870], [8827, 8829], [8696, 8828, 8830], [8829, 8831], [8830, 8832, 8871], [8831, 8833], [8697, 8832, 8834], [8833, 8835], [8834, 8836, 8872], [8835, 8837], [8698, 8836], [8699, 8873], [8703, 8877], [8707, 8881], [8711, 8885], [8715, 8889], [8719, 8893], [8723, 8897], [8727, 8901], [8731, 8905], [8735, 8909], [8739, 8913], [8743, 8917], [8747, 8921], [8751, 8925], [8755, 8929], [8759, 8933], [8763, 8937], [8767, 8941], [8771, 8945], [8775, 8949], [8779, 8953], [8783, 8957], [8787, 8961], [8791, 8965], [8795, 8969], [8799, 8973], [8803, 8977], [8807, 8981], [8811, 8985], [8815, 8989], [8819, 8993], [8823, 8997], [8827, 9001], [8831, 9005], [8835, 9009], [8838, 8874], [8873, 8875], [8874, 8876, 9012], [8875, 8877], [8839, 8876, 8878], [8877, 8879], [8878, 8880, 9013], [8879, 8881], [8840, 8880, 8882], [8881, 8883], [8882, 8884, 9014], [8883, 8885], [8841, 8884, 8886], [8885, 8887], [8886, 8888, 9015], [8887, 8889], [8842, 8888, 8890], [8889, 8891], [8890, 8892, 9016], [8891, 8893], [8843, 8892, 8894], [8893, 8895], [8894, 8896, 9017], [8895, 8897], [8844, 8896, 8898], [8897, 8899], [8898, 8900, 9018], [8899, 8901], [8845, 8900, 8902], [8901, 8903], [8902, 8904, 9019], [8903, 8905], [8846, 8904, 8906], [8905, 8907], [8906, 8908, 9020], [8907, 8909], [8847, 8908, 8910], [8909, 8911], [8910, 8912, 9021], [8911, 8913], [8848, 8912, 8914], [8913, 8915], [8914, 8916, 9022], [8915, 8917], [8849, 8916, 8918], [8917, 8919], [8918, 8920, 9023], [8919, 8921], [8850, 8920, 8922], [8921, 8923], [8922, 8924, 9024], [8923, 8925], [8851, 8924, 8926], [8925, 8927], [8926, 8928, 9025], [8927, 8929], [8852, 8928, 8930], [8929, 8931], [8930, 8932, 9026], [8931, 8933], [8853, 8932, 8934], [8933, 8935], [8934, 8936, 9027], [8935, 8937], [8854, 8936, 8938], [8937, 8939], [8938, 8940, 9028], [8939, 8941], [8855, 8940, 8942], [8941, 8943], [8942, 8944, 9029], [8943, 8945], [8856, 8944, 8946], [8945, 8947], [8946, 8948, 9030], [8947, 8949], [8857, 8948, 8950], [8949, 8951], [8950, 8952, 9031], [8951, 8953], [8858, 8952, 8954], [8953, 8955], [8954, 8956, 9032], [8955, 8957], [8859, 8956, 8958], [8957, 8959], [8958, 8960, 9033], [8959, 8961], [8860, 8960, 8962], [8961, 8963], [8962, 8964, 9034], [8963, 8965], [8861, 8964, 8966], [8965, 8967], [8966, 8968, 9035], [8967, 8969], [8862, 8968, 8970], [8969, 8971], [8970, 8972, 9036], [8971, 8973], [8863, 8972, 8974], [8973, 8975], [8974, 8976, 9037], [8975, 8977], [8864, 8976, 8978], [8977, 8979], [8978, 8980, 9038], [8979, 8981], [8865, 8980, 8982], [8981, 8983], [8982, 8984, 9039], [8983, 8985], [8866, 8984, 8986], [8985, 8987], [8986, 8988, 9040], [8987, 8989], [8867, 8988, 8990], [8989, 8991], [8990, 8992, 9041], [8991, 8993], [8868, 8992, 8994], [8993, 8995], [8994, 8996, 9042], [8995, 8997], [8869, 8996, 8998], [8997, 8999], [8998, 9000, 9043], [8999, 9001], [8870, 9000, 9002], [9001, 9003], [9002, 9004, 9044], [9003, 9005], [8871, 9004, 9006], [9005, 9007], [9006, 9008, 9045], [9007, 9009], [8872, 9008, 9010], [9009, 9011], [9010, 9046], [8875, 9049], [8879, 9053], [8883, 9057], [8887, 9061], [8891, 9065], [8895, 9069], [8899, 9073], [8903, 9077], [8907, 9081], [8911, 9085], [8915, 9089], [8919, 9093], [8923, 9097], [8927, 9101], [8931, 9105], [8935, 9109], [8939, 9113], [8943, 9117], [8947, 9121], [8951, 9125], [8955, 9129], [8959, 9133], [8963, 9137], [8967, 9141], [8971, 9145], [8975, 9149], [8979, 9153], [8983, 9157], [8987, 9161], [8991, 9165], [8995, 9169], [8999, 9173], [9003, 9177], [9007, 9181], [9011, 9185], [9048, 9186], [9047, 9049], [9012, 9048, 9050], [9049, 9051], [9050, 9052, 9187], [9051, 9053], [9013, 9052, 9054], [9053, 9055], [9054, 9056, 9188], [9055, 9057], [9014, 9056, 9058], [9057, 9059], [9058, 9060, 9189], [9059, 9061], [9015, 9060, 9062], [9061, 9063], [9062, 9064, 9190], [9063, 9065], [9016, 9064, 9066], [9065, 9067], [9066, 9068, 9191], [9067, 9069], [9017, 9068, 9070], [9069, 9071], [9070, 9072, 9192], [9071, 9073], [9018, 9072, 9074], [9073, 9075], [9074, 9076, 9193], [9075, 9077], [9019, 9076, 9078], [9077, 9079], [9078, 9080, 9194], [9079, 9081], [9020, 9080, 9082], [9081, 9083], [9082, 9084, 9195], [9083, 9085], [9021, 9084, 9086], [9085, 9087], [9086, 9088, 9196], [9087, 9089], [9022, 9088, 9090], [9089, 9091], [9090, 9092, 9197], [9091, 9093], [9023, 9092, 9094], [9093, 9095], [9094, 9096, 9198], [9095, 9097], [9024, 9096, 9098], [9097, 9099], [9098, 9100, 9199], [9099, 9101], [9025, 9100, 9102], [9101, 9103], [9102, 9104, 9200], [9103, 9105], [9026, 9104, 9106], [9105, 9107], [9106, 9108, 9201], [9107, 9109], [9027, 9108, 9110], [9109, 9111], [9110, 9112, 9202], [9111, 9113], [9028, 9112, 9114], [9113, 9115], [9114, 9116, 9203], [9115, 9117], [9029, 9116, 9118], [9117, 9119], [9118, 9120, 9204], [9119, 9121], [9030, 9120, 9122], [9121, 9123], [9122, 9124, 9205], [9123, 9125], [9031, 9124, 9126], [9125, 9127], [9126, 9128, 9206], [9127, 9129], [9032, 9128, 9130], [9129, 9131], [9130, 9132, 9207], [9131, 9133], [9033, 9132, 9134], [9133, 9135], [9134, 9136, 9208], [9135, 9137], [9034, 9136, 9138], [9137, 9139], [9138, 9140, 9209], [9139, 9141], [9035, 9140, 9142], [9141, 9143], [9142, 9144, 9210], [9143, 9145], [9036, 9144, 9146], [9145, 9147], [9146, 9148, 9211], [9147, 9149], [9037, 9148, 9150], [9149, 9151], [9150, 9152, 9212], [9151, 9153], [9038, 9152, 9154], [9153, 9155], [9154, 9156, 9213], [9155, 9157], [9039, 9156, 9158], [9157, 9159], [9158, 9160, 9214], [9159, 9161], [9040, 9160, 9162], [9161, 9163], [9162, 9164, 9215], [9163, 9165], [9041, 9164, 9166], [9165, 9167], [9166, 9168, 9216], [9167, 9169], [9042, 9168, 9170], [9169, 9171], [9170, 9172, 9217], [9171, 9173], [9043, 9172, 9174], [9173, 9175], [9174, 9176, 9218], [9175, 9177], [9044, 9176, 9178], [9177, 9179], [9178, 9180, 9219], [9179, 9181], [9045, 9180, 9182], [9181, 9183], [9182, 9184, 9220], [9183, 9185], [9046, 9184], [9047, 9221], [9051, 9225], [9055, 9229], [9059, 9233], [9063, 9237], [9067, 9241], [9071, 9245], [9075, 9249], [9079, 9253], [9083, 9257], [9087, 9261], [9091, 9265], [9095, 9269], [9099, 9273], [9103, 9277], [9107, 9281], [9111, 9285], [9115, 9289], [9119, 9293], [9123, 9297], [9127, 9301], [9131, 9305], [9135, 9309], [9139, 9313], [9143, 9317], [9147, 9321], [9151, 9325], [9155, 9329], [9159, 9333], [9163, 9337], [9167, 9341], [9171, 9345], [9175, 9349], [9179, 9353], [9183, 9357], [9186, 9222], [9221, 9223], [9222, 9224, 9360], [9223, 9225], [9187, 9224, 9226], [9225, 9227], [9226, 9228, 9361], [9227, 9229], [9188, 9228, 9230], [9229, 9231], [9230, 9232, 9362], [9231, 9233], [9189, 9232, 9234], [9233, 9235], [9234, 9236, 9363], [9235, 9237], [9190, 9236, 9238], [9237, 9239], [9238, 9240, 9364], [9239, 9241], [9191, 9240, 9242], [9241, 9243], [9242, 9244, 9365], [9243, 9245], [9192, 9244, 9246], [9245, 9247], [9246, 9248, 9366], [9247, 9249], [9193, 9248, 9250], [9249, 9251], [9250, 9252, 9367], [9251, 9253], [9194, 9252, 9254], [9253, 9255], [9254, 9256, 9368], [9255, 9257], [9195, 9256, 9258], [9257, 9259], [9258, 9260, 9369], [9259, 9261], [9196, 9260, 9262], [9261, 9263], [9262, 9264, 9370], [9263, 9265], [9197, 9264, 9266], [9265, 9267], [9266, 9268, 9371], [9267, 9269], [9198, 9268, 9270], [9269, 9271], [9270, 9272, 9372], [9271, 9273], [9199, 9272, 9274], [9273, 9275], [9274, 9276, 9373], [9275, 9277], [9200, 9276, 9278], [9277, 9279], [9278, 9280, 9374], [9279, 9281], [9201, 9280, 9282], [9281, 9283], [9282, 9284, 9375], [9283, 9285], [9202, 9284, 9286], [9285, 9287], [9286, 9288, 9376], [9287, 9289], [9203, 9288, 9290], [9289, 9291], [9290, 9292, 9377], [9291, 9293], [9204, 9292, 9294], [9293, 9295], [9294, 9296, 9378], [9295, 9297], [9205, 9296, 9298], [9297, 9299], [9298, 9300, 9379], [9299, 9301], [9206, 9300, 9302], [9301, 9303], [9302, 9304, 9380], [9303, 9305], [9207, 9304, 9306], [9305, 9307], [9306, 9308, 9381], [9307, 9309], [9208, 9308, 9310], [9309, 9311], [9310, 9312, 9382], [9311, 9313], [9209, 9312, 9314], [9313, 9315], [9314, 9316, 9383], [9315, 9317], [9210, 9316, 9318], [9317, 9319], [9318, 9320, 9384], [9319, 9321], [9211, 9320, 9322], [9321, 9323], [9322, 9324, 9385], [9323, 9325], [9212, 9324, 9326], [9325, 9327], [9326, 9328, 9386], [9327, 9329], [9213, 9328, 9330], [9329, 9331], [9330, 9332, 9387], [9331, 9333], [9214, 9332, 9334], [9333, 9335], [9334, 9336, 9388], [9335, 9337], [9215, 9336, 9338], [9337, 9339], [9338, 9340, 9389], [9339, 9341], [9216, 9340, 9342], [9341, 9343], [9342, 9344, 9390], [9343, 9345], [9217, 9344, 9346], [9345, 9347], [9346, 9348, 9391], [9347, 9349], [9218, 9348, 9350], [9349, 9351], [9350, 9352, 9392], [9351, 9353], [9219, 9352, 9354], [9353, 9355], [9354, 9356, 9393], [9355, 9357], [9220, 9356, 9358], [9357, 9359], [9358, 9394], [9223, 9397], [9227, 9401], [9231, 9405], [9235, 9409], [9239, 9413], [9243, 9417], [9247, 9421], [9251, 9425], [9255, 9429], [9259, 9433], [9263, 9437], [9267, 9441], [9271, 9445], [9275, 9449], [9279, 9453], [9283, 9457], [9287, 9461], [9291, 9465], [9295, 9469], [9299, 9473], [9303, 9477], [9307, 9481], [9311, 9485], [9315, 9489], [9319, 9493], [9323, 9497], [9327, 9501], [9331, 9505], [9335, 9509], [9339, 9513], [9343, 9517], [9347, 9521], [9351, 9525], [9355, 9529], [9359, 9533], [9396, 9534], [9395, 9397], [9360, 9396, 9398], [9397, 9399], [9398, 9400, 9535], [9399, 9401], [9361, 9400, 9402], [9401, 9403], [9402, 9404, 9536], [9403, 9405], [9362, 9404, 9406], [9405, 9407], [9406, 9408, 9537], [9407, 9409], [9363, 9408, 9410], [9409, 9411], [9410, 9412, 9538], [9411, 9413], [9364, 9412, 9414], [9413, 9415], [9414, 9416, 9539], [9415, 9417], [9365, 9416, 9418], [9417, 9419], [9418, 9420, 9540], [9419, 9421], [9366, 9420, 9422], [9421, 9423], [9422, 9424, 9541], [9423, 9425], [9367, 9424, 9426], [9425, 9427], [9426, 9428, 9542], [9427, 9429], [9368, 9428, 9430], [9429, 9431], [9430, 9432, 9543], [9431, 9433], [9369, 9432, 9434], [9433, 9435], [9434, 9436, 9544], [9435, 9437], [9370, 9436, 9438], [9437, 9439], [9438, 9440, 9545], [9439, 9441], [9371, 9440, 9442], [9441, 9443], [9442, 9444, 9546], [9443, 9445], [9372, 9444, 9446], [9445, 9447], [9446, 9448, 9547], [9447, 9449], [9373, 9448, 9450], [9449, 9451], [9450, 9452, 9548], [9451, 9453], [9374, 9452, 9454], [9453, 9455], [9454, 9456, 9549], [9455, 9457], [9375, 9456, 9458], [9457, 9459], [9458, 9460, 9550], [9459, 9461], [9376, 9460, 9462], [9461, 9463], [9462, 9464, 9551], [9463, 9465], [9377, 9464, 9466], [9465, 9467], [9466, 9468, 9552], [9467, 9469], [9378, 9468, 9470], [9469, 9471], [9470, 9472, 9553], [9471, 9473], [9379, 9472, 9474], [9473, 9475], [9474, 9476, 9554], [9475, 9477], [9380, 9476, 9478], [9477, 9479], [9478, 9480, 9555], [9479, 9481], [9381, 9480, 9482], [9481, 9483], [9482, 9484, 9556], [9483, 9485], [9382, 9484, 9486], [9485, 9487], [9486, 9488, 9557], [9487, 9489], [9383, 9488, 9490], [9489, 9491], [9490, 9492, 9558], [9491, 9493], [9384, 9492, 9494], [9493, 9495], [9494, 9496, 9559], [9495, 9497], [9385, 9496, 9498], [9497, 9499], [9498, 9500, 9560], [9499, 9501], [9386, 9500, 9502], [9501, 9503], [9502, 9504, 9561], [9503, 9505], [9387, 9504, 9506], [9505, 9507], [9506, 9508, 9562], [9507, 9509], [9388, 9508, 9510], [9509, 9511], [9510, 9512, 9563], [9511, 9513], [9389, 9512, 9514], [9513, 9515], [9514, 9516, 9564], [9515, 9517], [9390, 9516, 9518], [9517, 9519], [9518, 9520, 9565], [9519, 9521], [9391, 9520, 9522], [9521, 9523], [9522, 9524, 9566], [9523, 9525], [9392, 9524, 9526], [9525, 9527], [9526, 9528, 9567], [9527, 9529], [9393, 9528, 9530], [9529, 9531], [9530, 9532, 9568], [9531, 9533], [9394, 9532], [9395, 9569], [9399, 9573], [9403, 9577], [9407, 9581], [9411, 9585], [9415, 9589], [9419, 9593], [9423, 9597], [9427, 9601], [9431, 9605], [9435, 9609], [9439, 9613], [9443, 9617], [9447, 9621], [9451, 9625], [9455, 9629], [9459, 9633], [9463, 9637], [9467, 9641], [9471, 9645], [9475, 9649], [9479, 9653], [9483, 9657], [9487, 9661], [9491, 9665], [9495, 9669], [9499, 9673], [9503, 9677], [9507, 9681], [9511, 9685], [9515, 9689], [9519, 9693], [9523, 9697], [9527, 9701], [9531, 9705], [9534, 9570], [9569, 9571], [9570, 9572, 9708], [9571, 9573], [9535, 9572, 9574], [9573, 9575], [9574, 9576, 9709], [9575, 9577], [9536, 9576, 9578], [9577, 9579], [9578, 9580, 9710], [9579, 9581], [9537, 9580, 9582], [9581, 9583], [9582, 9584, 9711], [9583, 9585], [9538, 9584, 9586], [9585, 9587], [9586, 9588, 9712], [9587, 9589], [9539, 9588, 9590], [9589, 9591], [9590, 9592, 9713], [9591, 9593], [9540, 9592, 9594], [9593, 9595], [9594, 9596, 9714], [9595, 9597], [9541, 9596, 9598], [9597, 9599], [9598, 9600, 9715], [9599, 9601], [9542, 9600, 9602], [9601, 9603], [9602, 9604, 9716], [9603, 9605], [9543, 9604, 9606], [9605, 9607], [9606, 9608, 9717], [9607, 9609], [9544, 9608, 9610], [9609, 9611], [9610, 9612, 9718], [9611, 9613], [9545, 9612, 9614], [9613, 9615], [9614, 9616, 9719], [9615, 9617], [9546, 9616, 9618], [9617, 9619], [9618, 9620, 9720], [9619, 9621], [9547, 9620, 9622], [9621, 9623], [9622, 9624, 9721], [9623, 9625], [9548, 9624, 9626], [9625, 9627], [9626, 9628, 9722], [9627, 9629], [9549, 9628, 9630], [9629, 9631], [9630, 9632, 9723], [9631, 9633], [9550, 9632, 9634], [9633, 9635], [9634, 9636, 9724], [9635, 9637], [9551, 9636, 9638], [9637, 9639], [9638, 9640, 9725], [9639, 9641], [9552, 9640, 9642], [9641, 9643], [9642, 9644, 9726], [9643, 9645], [9553, 9644, 9646], [9645, 9647], [9646, 9648, 9727], [9647, 9649], [9554, 9648, 9650], [9649, 9651], [9650, 9652, 9728], [9651, 9653], [9555, 9652, 9654], [9653, 9655], [9654, 9656, 9729], [9655, 9657], [9556, 9656, 9658], [9657, 9659], [9658, 9660, 9730], [9659, 9661], [9557, 9660, 9662], [9661, 9663], [9662, 9664, 9731], [9663, 9665], [9558, 9664, 9666], [9665, 9667], [9666, 9668, 9732], [9667, 9669], [9559, 9668, 9670], [9669, 9671], [9670, 9672, 9733], [9671, 9673], [9560, 9672, 9674], [9673, 9675], [9674, 9676, 9734], [9675, 9677], [9561, 9676, 9678], [9677, 9679], [9678, 9680, 9735], [9679, 9681], [9562, 9680, 9682], [9681, 9683], [9682, 9684, 9736], [9683, 9685], [9563, 9684, 9686], [9685, 9687], [9686, 9688, 9737], [9687, 9689], [9564, 9688, 9690], [9689, 9691], [9690, 9692, 9738], [9691, 9693], [9565, 9692, 9694], [9693, 9695], [9694, 9696, 9739], [9695, 9697], [9566, 9696, 9698], [9697, 9699], [9698, 9700, 9740], [9699, 9701], [9567, 9700, 9702], [9701, 9703], [9702, 9704, 9741], [9703, 9705], [9568, 9704, 9706], [9705, 9707], [9706, 9742], [9571, 9745], [9575, 9749], [9579, 9753], [9583, 9757], [9587, 9761], [9591, 9765], [9595, 9769], [9599, 9773], [9603, 9777], [9607, 9781], [9611, 9785], [9615, 9789], [9619, 9793], [9623, 9797], [9627, 9801], [9631, 9805], [9635, 9809], [9639, 9813], [9643, 9817], [9647, 9821], [9651, 9825], [9655, 9829], [9659, 9833], [9663, 9837], [9667, 9841], [9671, 9845], [9675, 9849], [9679, 9853], [9683, 9857], [9687, 9861], [9691, 9865], [9695, 9869], [9699, 9873], [9703, 9877], [9707, 9881], [9744, 9882], [9743, 9745], [9708, 9744, 9746], [9745, 9747], [9746, 9748, 9883], [9747, 9749], [9709, 9748, 9750], [9749, 9751], [9750, 9752, 9884], [9751, 9753], [9710, 9752, 9754], [9753, 9755], [9754, 9756, 9885], [9755, 9757], [9711, 9756, 9758], [9757, 9759], [9758, 9760, 9886], [9759, 9761], [9712, 9760, 9762], [9761, 9763], [9762, 9764, 9887], [9763, 9765], [9713, 9764, 9766], [9765, 9767], [9766, 9768, 9888], [9767, 9769], [9714, 9768, 9770], [9769, 9771], [9770, 9772, 9889], [9771, 9773], [9715, 9772, 9774], [9773, 9775], [9774, 9776, 9890], [9775, 9777], [9716, 9776, 9778], [9777, 9779], [9778, 9780, 9891], [9779, 9781], [9717, 9780, 9782], [9781, 9783], [9782, 9784, 9892], [9783, 9785], [9718, 9784, 9786], [9785, 9787], [9786, 9788, 9893], [9787, 9789], [9719, 9788, 9790], [9789, 9791], [9790, 9792, 9894], [9791, 9793], [9720, 9792, 9794], [9793, 9795], [9794, 9796, 9895], [9795, 9797], [9721, 9796, 9798], [9797, 9799], [9798, 9800, 9896], [9799, 9801], [9722, 9800, 9802], [9801, 9803], [9802, 9804, 9897], [9803, 9805], [9723, 9804, 9806], [9805, 9807], [9806, 9808, 9898], [9807, 9809], [9724, 9808, 9810], [9809, 9811], [9810, 9812, 9899], [9811, 9813], [9725, 9812, 9814], [9813, 9815], [9814, 9816, 9900], [9815, 9817], [9726, 9816, 9818], [9817, 9819], [9818, 9820, 9901], [9819, 9821], [9727, 9820, 9822], [9821, 9823], [9822, 9824, 9902], [9823, 9825], [9728, 9824, 9826], [9825, 9827], [9826, 9828, 9903], [9827, 9829], [9729, 9828, 9830], [9829, 9831], [9830, 9832, 9904], [9831, 9833], [9730, 9832, 9834], [9833, 9835], [9834, 9836, 9905], [9835, 9837], [9731, 9836, 9838], [9837, 9839], [9838, 9840, 9906], [9839, 9841], [9732, 9840, 9842], [9841, 9843], [9842, 9844, 9907], [9843, 9845], [9733, 9844, 9846], [9845, 9847], [9846, 9848, 9908], [9847, 9849], [9734, 9848, 9850], [9849, 9851], [9850, 9852, 9909], [9851, 9853], [9735, 9852, 9854], [9853, 9855], [9854, 9856, 9910], [9855, 9857], [9736, 9856, 9858], [9857, 9859], [9858, 9860, 9911], [9859, 9861], [9737, 9860, 9862], [9861, 9863], [9862, 9864, 9912], [9863, 9865], [9738, 9864, 9866], [9865, 9867], [9866, 9868, 9913], [9867, 9869], [9739, 9868, 9870], [9869, 9871], [9870, 9872, 9914], [9871, 9873], [9740, 9872, 9874], [9873, 9875], [9874, 9876, 9915], [9875, 9877], [9741, 9876, 9878], [9877, 9879], [9878, 9880, 9916], [9879, 9881], [9742, 9880], [9743, 9917], [9747, 9921], [9751, 9925], [9755, 9929], [9759, 9933], [9763, 9937], [9767, 9941], [9771, 9945], [9775, 9949], [9779, 9953], [9783, 9957], [9787, 9961], [9791, 9965], [9795, 9969], [9799, 9973], [9803, 9977], [9807, 9981], [9811, 9985], [9815, 9989], [9819, 9993], [9823, 9997], [9827, 10001], [9831, 10005], [9835, 10009], [9839, 10013], [9843, 10017], [9847, 10021], [9851, 10025], [9855, 10029], [9859, 10033], [9863, 10037], [9867, 10041], [9871, 10045], [9875, 10049], [9879, 10053], [9882, 9918], [9917, 9919], [9918, 9920, 10056], [9919, 9921], [9883, 9920, 9922], [9921, 9923], [9922, 9924, 10057], [9923, 9925], [9884, 9924, 9926], [9925, 9927], [9926, 9928, 10058], [9927, 9929], [9885, 9928, 9930], [9929, 9931], [9930, 9932, 10059], [9931, 9933], [9886, 9932, 9934], [9933, 9935], [9934, 9936, 10060], [9935, 9937], [9887, 9936, 9938], [9937, 9939], [9938, 9940, 10061], [9939, 9941], [9888, 9940, 9942], [9941, 9943], [9942, 9944, 10062], [9943, 9945], [9889, 9944, 9946], [9945, 9947], [9946, 9948, 10063], [9947, 9949], [9890, 9948, 9950], [9949, 9951], [9950, 9952, 10064], [9951, 9953], [9891, 9952, 9954], [9953, 9955], [9954, 9956, 10065], [9955, 9957], [9892, 9956, 9958], [9957, 9959], [9958, 9960, 10066], [9959, 9961], [9893, 9960, 9962], [9961, 9963], [9962, 9964, 10067], [9963, 9965], [9894, 9964, 9966], [9965, 9967], [9966, 9968, 10068], [9967, 9969], [9895, 9968, 9970], [9969, 9971], [9970, 9972, 10069], [9971, 9973], [9896, 9972, 9974], [9973, 9975], [9974, 9976, 10070], [9975, 9977], [9897, 9976, 9978], [9977, 9979], [9978, 9980, 10071], [9979, 9981], [9898, 9980, 9982], [9981, 9983], [9982, 9984, 10072], [9983, 9985], [9899, 9984, 9986], [9985, 9987], [9986, 9988, 10073], [9987, 9989], [9900, 9988, 9990], [9989, 9991], [9990, 9992, 10074], [9991, 9993], [9901, 9992, 9994], [9993, 9995], [9994, 9996, 10075], [9995, 9997], [9902, 9996, 9998], [9997, 9999], [9998, 10000, 10076], [9999, 10001], [9903, 10000, 10002], [10001, 10003], [10002, 10004, 10077], [10003, 10005], [9904, 10004, 10006], [10005, 10007], [10006, 10008, 10078], [10007, 10009], [9905, 10008, 10010], [10009, 10011], [10010, 10012, 10079], [10011, 10013], [9906, 10012, 10014], [10013, 10015], [10014, 10016, 10080], [10015, 10017], [9907, 10016, 10018], [10017, 10019], [10018, 10020, 10081], [10019, 10021], [9908, 10020, 10022], [10021, 10023], [10022, 10024, 10082], [10023, 10025], [9909, 10024, 10026], [10025, 10027], [10026, 10028, 10083], [10027, 10029], [9910, 10028, 10030], [10029, 10031], [10030, 10032, 10084], [10031, 10033], [9911, 10032, 10034], [10033, 10035], [10034, 10036, 10085], [10035, 10037], [9912, 10036, 10038], [10037, 10039], [10038, 10040, 10086], [10039, 10041], [9913, 10040, 10042], [10041, 10043], [10042, 10044, 10087], [10043, 10045], [9914, 10044, 10046], [10045, 10047], [10046, 10048, 10088], [10047, 10049], [9915, 10048, 10050], [10049, 10051], [10050, 10052, 10089], [10051, 10053], [9916, 10052, 10054], [10053, 10055], [10054, 10090], [9919, 10093], [9923, 10097], [9927, 10101], [9931, 10105], [9935, 10109], [9939, 10113], [9943, 10117], [9947, 10121], [9951, 10125], [9955, 10129], [9959, 10133], [9963, 10137], [9967, 10141], [9971, 10145], [9975, 10149], [9979, 10153], [9983, 10157], [9987, 10161], [9991, 10165], [9995, 10169], [9999, 10173], [10003, 10177], [10007, 10181], [10011, 10185], [10015, 10189], [10019, 10193], [10023, 10197], [10027, 10201], [10031, 10205], [10035, 10209], [10039, 10213], [10043, 10217], [10047, 10221], [10051, 10225], [10055, 10229], [10092, 10230], [10091, 10093], [10056, 10092, 10094], [10093, 10095], [10094, 10096, 10231], [10095, 10097], [10057, 10096, 10098], [10097, 10099], [10098, 10100, 10232], [10099, 10101], [10058, 10100, 10102], [10101, 10103], [10102, 10104, 10233], [10103, 10105], [10059, 10104, 10106], [10105, 10107], [10106, 10108, 10234], [10107, 10109], [10060, 10108, 10110], [10109, 10111], [10110, 10112, 10235], [10111, 10113], [10061, 10112, 10114], [10113, 10115], [10114, 10116, 10236], [10115, 10117], [10062, 10116, 10118], [10117, 10119], [10118, 10120, 10237], [10119, 10121], [10063, 10120, 10122], [10121, 10123], [10122, 10124, 10238], [10123, 10125], [10064, 10124, 10126], [10125, 10127], [10126, 10128, 10239], [10127, 10129], [10065, 10128, 10130], [10129, 10131], [10130, 10132, 10240], [10131, 10133], [10066, 10132, 10134], [10133, 10135], [10134, 10136, 10241], [10135, 10137], [10067, 10136, 10138], [10137, 10139], [10138, 10140, 10242], [10139, 10141], [10068, 10140, 10142], [10141, 10143], [10142, 10144, 10243], [10143, 10145], [10069, 10144, 10146], [10145, 10147], [10146, 10148, 10244], [10147, 10149], [10070, 10148, 10150], [10149, 10151], [10150, 10152, 10245], [10151, 10153], [10071, 10152, 10154], [10153, 10155], [10154, 10156, 10246], [10155, 10157], [10072, 10156, 10158], [10157, 10159], [10158, 10160, 10247], [10159, 10161], [10073, 10160, 10162], [10161, 10163], [10162, 10164, 10248], [10163, 10165], [10074, 10164, 10166], [10165, 10167], [10166, 10168, 10249], [10167, 10169], [10075, 10168, 10170], [10169, 10171], [10170, 10172, 10250], [10171, 10173], [10076, 10172, 10174], [10173, 10175], [10174, 10176, 10251], [10175, 10177], [10077, 10176, 10178], [10177, 10179], [10178, 10180, 10252], [10179, 10181], [10078, 10180, 10182], [10181, 10183], [10182, 10184, 10253], [10183, 10185], [10079, 10184, 10186], [10185, 10187], [10186, 10188, 10254], [10187, 10189], [10080, 10188, 10190], [10189, 10191], [10190, 10192, 10255], [10191, 10193], [10081, 10192, 10194], [10193, 10195], [10194, 10196, 10256], [10195, 10197], [10082, 10196, 10198], [10197, 10199], [10198, 10200, 10257], [10199, 10201], [10083, 10200, 10202], [10201, 10203], [10202, 10204, 10258], [10203, 10205], [10084, 10204, 10206], [10205, 10207], [10206, 10208, 10259], [10207, 10209], [10085, 10208, 10210], [10209, 10211], [10210, 10212, 10260], [10211, 10213], [10086, 10212, 10214], [10213, 10215], [10214, 10216, 10261], [10215, 10217], [10087, 10216, 10218], [10217, 10219], [10218, 10220, 10262], [10219, 10221], [10088, 10220, 10222], [10221, 10223], [10222, 10224, 10263], [10223, 10225], [10089, 10224, 10226], [10225, 10227], [10226, 10228, 10264], [10227, 10229], [10090, 10228], [10091, 10265], [10095, 10269], [10099, 10273], [10103, 10277], [10107, 10281], [10111, 10285], [10115, 10289], [10119, 10293], [10123, 10297], [10127, 10301], [10131, 10305], [10135, 10309], [10139, 10313], [10143, 10317], [10147, 10321], [10151, 10325], [10155, 10329], [10159, 10333], [10163, 10337], [10167, 10341], [10171, 10345], [10175, 10349], [10179, 10353], [10183, 10357], [10187, 10361], [10191, 10365], [10195, 10369], [10199, 10373], [10203, 10377], [10207, 10381], [10211, 10385], [10215, 10389], [10219, 10393], [10223, 10397], [10227, 10401], [10230, 10266], [10265, 10267], [10266, 10268, 10404], [10267, 10269], [10231, 10268, 10270], [10269, 10271], [10270, 10272, 10405], [10271, 10273], [10232, 10272, 10274], [10273, 10275], [10274, 10276, 10406], [10275, 10277], [10233, 10276, 10278], [10277, 10279], [10278, 10280, 10407], [10279, 10281], [10234, 10280, 10282], [10281, 10283], [10282, 10284, 10408], [10283, 10285], [10235, 10284, 10286], [10285, 10287], [10286, 10288, 10409], [10287, 10289], [10236, 10288, 10290], [10289, 10291], [10290, 10292, 10410], [10291, 10293], [10237, 10292, 10294], [10293, 10295], [10294, 10296, 10411], [10295, 10297], [10238, 10296, 10298], [10297, 10299], [10298, 10300, 10412], [10299, 10301], [10239, 10300, 10302], [10301, 10303], [10302, 10304, 10413], [10303, 10305], [10240, 10304, 10306], [10305, 10307], [10306, 10308, 10414], [10307, 10309], [10241, 10308, 10310], [10309, 10311], [10310, 10312, 10415], [10311, 10313], [10242, 10312, 10314], [10313, 10315], [10314, 10316, 10416], [10315, 10317], [10243, 10316, 10318], [10317, 10319], [10318, 10320, 10417], [10319, 10321], [10244, 10320, 10322], [10321, 10323], [10322, 10324, 10418], [10323, 10325], [10245, 10324, 10326], [10325, 10327], [10326, 10328, 10419], [10327, 10329], [10246, 10328, 10330], [10329, 10331], [10330, 10332, 10420], [10331, 10333], [10247, 10332, 10334], [10333, 10335], [10334, 10336, 10421], [10335, 10337], [10248, 10336, 10338], [10337, 10339], [10338, 10340, 10422], [10339, 10341], [10249, 10340, 10342], [10341, 10343], [10342, 10344, 10423], [10343, 10345], [10250, 10344, 10346], [10345, 10347], [10346, 10348, 10424], [10347, 10349], [10251, 10348, 10350], [10349, 10351], [10350, 10352, 10425], [10351, 10353], [10252, 10352, 10354], [10353, 10355], [10354, 10356, 10426], [10355, 10357], [10253, 10356, 10358], [10357, 10359], [10358, 10360, 10427], [10359, 10361], [10254, 10360, 10362], [10361, 10363], [10362, 10364, 10428], [10363, 10365], [10255, 10364, 10366], [10365, 10367], [10366, 10368, 10429], [10367, 10369], [10256, 10368, 10370], [10369, 10371], [10370, 10372, 10430], [10371, 10373], [10257, 10372, 10374], [10373, 10375], [10374, 10376, 10431], [10375, 10377], [10258, 10376, 10378], [10377, 10379], [10378, 10380, 10432], [10379, 10381], [10259, 10380, 10382], [10381, 10383], [10382, 10384, 10433], [10383, 10385], [10260, 10384, 10386], [10385, 10387], [10386, 10388, 10434], [10387, 10389], [10261, 10388, 10390], [10389, 10391], [10390, 10392, 10435], [10391, 10393], [10262, 10392, 10394], [10393, 10395], [10394, 10396, 10436], [10395, 10397], [10263, 10396, 10398], [10397, 10399], [10398, 10400, 10437], [10399, 10401], [10264, 10400, 10402], [10401, 10403], [10402, 10438], [10267, 10441], [10271, 10445], [10275, 10449], [10279, 10453], [10283, 10457], [10287, 10461], [10291, 10465], [10295, 10469], [10299, 10473], [10303, 10477], [10307, 10481], [10311, 10485], [10315, 10489], [10319, 10493], [10323, 10497], [10327, 10501], [10331, 10505], [10335, 10509], [10339, 10513], [10343, 10517], [10347, 10521], [10351, 10525], [10355, 10529], [10359, 10533], [10363, 10537], [10367, 10541], [10371, 10545], [10375, 10549], [10379, 10553], [10383, 10557], [10387, 10561], [10391, 10565], [10395, 10569], [10399, 10573], [10403, 10577], [10440, 10578], [10439, 10441], [10404, 10440, 10442], [10441, 10443], [10442, 10444, 10579], [10443, 10445], [10405, 10444, 10446], [10445, 10447], [10446, 10448, 10580], [10447, 10449], [10406, 10448, 10450], [10449, 10451], [10450, 10452, 10581], [10451, 10453], [10407, 10452, 10454], [10453, 10455], [10454, 10456, 10582], [10455, 10457], [10408, 10456, 10458], [10457, 10459], [10458, 10460, 10583], [10459, 10461], [10409, 10460, 10462], [10461, 10463], [10462, 10464, 10584], [10463, 10465], [10410, 10464, 10466], [10465, 10467], [10466, 10468, 10585], [10467, 10469], [10411, 10468, 10470], [10469, 10471], [10470, 10472, 10586], [10471, 10473], [10412, 10472, 10474], [10473, 10475], [10474, 10476, 10587], [10475, 10477], [10413, 10476, 10478], [10477, 10479], [10478, 10480, 10588], [10479, 10481], [10414, 10480, 10482], [10481, 10483], [10482, 10484, 10589], [10483, 10485], [10415, 10484, 10486], [10485, 10487], [10486, 10488, 10590], [10487, 10489], [10416, 10488, 10490], [10489, 10491], [10490, 10492, 10591], [10491, 10493], [10417, 10492, 10494], [10493, 10495], [10494, 10496, 10592], [10495, 10497], [10418, 10496, 10498], [10497, 10499], [10498, 10500, 10593], [10499, 10501], [10419, 10500, 10502], [10501, 10503], [10502, 10504, 10594], [10503, 10505], [10420, 10504, 10506], [10505, 10507], [10506, 10508, 10595], [10507, 10509], [10421, 10508, 10510], [10509, 10511], [10510, 10512, 10596], [10511, 10513], [10422, 10512, 10514], [10513, 10515], [10514, 10516, 10597], [10515, 10517], [10423, 10516, 10518], [10517, 10519], [10518, 10520, 10598], [10519, 10521], [10424, 10520, 10522], [10521, 10523], [10522, 10524, 10599], [10523, 10525], [10425, 10524, 10526], [10525, 10527], [10526, 10528, 10600], [10527, 10529], [10426, 10528, 10530], [10529, 10531], [10530, 10532, 10601], [10531, 10533], [10427, 10532, 10534], [10533, 10535], [10534, 10536, 10602], [10535, 10537], [10428, 10536, 10538], [10537, 10539], [10538, 10540, 10603], [10539, 10541], [10429, 10540, 10542], [10541, 10543], [10542, 10544, 10604], [10543, 10545], [10430, 10544, 10546], [10545, 10547], [10546, 10548, 10605], [10547, 10549], [10431, 10548, 10550], [10549, 10551], [10550, 10552, 10606], [10551, 10553], [10432, 10552, 10554], [10553, 10555], [10554, 10556, 10607], [10555, 10557], [10433, 10556, 10558], [10557, 10559], [10558, 10560, 10608], [10559, 10561], [10434, 10560, 10562], [10561, 10563], [10562, 10564, 10609], [10563, 10565], [10435, 10564, 10566], [10565, 10567], [10566, 10568, 10610], [10567, 10569], [10436, 10568, 10570], [10569, 10571], [10570, 10572, 10611], [10571, 10573], [10437, 10572, 10574], [10573, 10575], [10574, 10576, 10612], [10575, 10577], [10438, 10576], [10439, 10613], [10443, 10617], [10447, 10621], [10451, 10625], [10455, 10629], [10459, 10633], [10463, 10637], [10467, 10641], [10471, 10645], [10475, 10649], [10479, 10653], [10483, 10657], [10487, 10661], [10491, 10665], [10495, 10669], [10499, 10673], [10503, 10677], [10507, 10681], [10511, 10685], [10515, 10689], [10519, 10693], [10523, 10697], [10527, 10701], [10531, 10705], [10535, 10709], [10539, 10713], [10543, 10717], [10547, 10721], [10551, 10725], [10555, 10729], [10559, 10733], [10563, 10737], [10567, 10741], [10571, 10745], [10575, 10749], [10578, 10614], [10613, 10615], [10614, 10616, 10752], [10615, 10617], [10579, 10616, 10618], [10617, 10619], [10618, 10620, 10753], [10619, 10621], [10580, 10620, 10622], [10621, 10623], [10622, 10624, 10754], [10623, 10625], [10581, 10624, 10626], [10625, 10627], [10626, 10628, 10755], [10627, 10629], [10582, 10628, 10630], [10629, 10631], [10630, 10632, 10756], [10631, 10633], [10583, 10632, 10634], [10633, 10635], [10634, 10636, 10757], [10635, 10637], [10584, 10636, 10638], [10637, 10639], [10638, 10640, 10758], [10639, 10641], [10585, 10640, 10642], [10641, 10643], [10642, 10644, 10759], [10643, 10645], [10586, 10644, 10646], [10645, 10647], [10646, 10648, 10760], [10647, 10649], [10587, 10648, 10650], [10649, 10651], [10650, 10652, 10761], [10651, 10653], [10588, 10652, 10654], [10653, 10655], [10654, 10656, 10762], [10655, 10657], [10589, 10656, 10658], [10657, 10659], [10658, 10660, 10763], [10659, 10661], [10590, 10660, 10662], [10661, 10663], [10662, 10664, 10764], [10663, 10665], [10591, 10664, 10666], [10665, 10667], [10666, 10668, 10765], [10667, 10669], [10592, 10668, 10670], [10669, 10671], [10670, 10672, 10766], [10671, 10673], [10593, 10672, 10674], [10673, 10675], [10674, 10676, 10767], [10675, 10677], [10594, 10676, 10678], [10677, 10679], [10678, 10680, 10768], [10679, 10681], [10595, 10680, 10682], [10681, 10683], [10682, 10684, 10769], [10683, 10685], [10596, 10684, 10686], [10685, 10687], [10686, 10688, 10770], [10687, 10689], [10597, 10688, 10690], [10689, 10691], [10690, 10692, 10771], [10691, 10693], [10598, 10692, 10694], [10693, 10695], [10694, 10696, 10772], [10695, 10697], [10599, 10696, 10698], [10697, 10699], [10698, 10700, 10773], [10699, 10701], [10600, 10700, 10702], [10701, 10703], [10702, 10704, 10774], [10703, 10705], [10601, 10704, 10706], [10705, 10707], [10706, 10708, 10775], [10707, 10709], [10602, 10708, 10710], [10709, 10711], [10710, 10712, 10776], [10711, 10713], [10603, 10712, 10714], [10713, 10715], [10714, 10716, 10777], [10715, 10717], [10604, 10716, 10718], [10717, 10719], [10718, 10720, 10778], [10719, 10721], [10605, 10720, 10722], [10721, 10723], [10722, 10724, 10779], [10723, 10725], [10606, 10724, 10726], [10725, 10727], [10726, 10728, 10780], [10727, 10729], [10607, 10728, 10730], [10729, 10731], [10730, 10732, 10781], [10731, 10733], [10608, 10732, 10734], [10733, 10735], [10734, 10736, 10782], [10735, 10737], [10609, 10736, 10738], [10737, 10739], [10738, 10740, 10783], [10739, 10741], [10610, 10740, 10742], [10741, 10743], [10742, 10744, 10784], [10743, 10745], [10611, 10744, 10746], [10745, 10747], [10746, 10748, 10785], [10747, 10749], [10612, 10748, 10750], [10749, 10751], [10750, 10786], [10615, 10789], [10619, 10793], [10623, 10797], [10627, 10801], [10631, 10805], [10635, 10809], [10639, 10813], [10643, 10817], [10647, 10821], [10651, 10825], [10655, 10829], [10659, 10833], [10663, 10837], [10667, 10841], [10671, 10845], [10675, 10849], [10679, 10853], [10683, 10857], [10687, 10861], [10691, 10865], [10695, 10869], [10699, 10873], [10703, 10877], [10707, 10881], [10711, 10885], [10715, 10889], [10719, 10893], [10723, 10897], [10727, 10901], [10731, 10905], [10735, 10909], [10739, 10913], [10743, 10917], [10747, 10921], [10751, 10925], [10788, 10926], [10787, 10789], [10752, 10788, 10790], [10789, 10791], [10790, 10792, 10927], [10791, 10793], [10753, 10792, 10794], [10793, 10795], [10794, 10796, 10928], [10795, 10797], [10754, 10796, 10798], [10797, 10799], [10798, 10800, 10929], [10799, 10801], [10755, 10800, 10802], [10801, 10803], [10802, 10804, 10930], [10803, 10805], [10756, 10804, 10806], [10805, 10807], [10806, 10808, 10931], [10807, 10809], [10757, 10808, 10810], [10809, 10811], [10810, 10812, 10932], [10811, 10813], [10758, 10812, 10814], [10813, 10815], [10814, 10816, 10933], [10815, 10817], [10759, 10816, 10818], [10817, 10819], [10818, 10820, 10934], [10819, 10821], [10760, 10820, 10822], [10821, 10823], [10822, 10824, 10935], [10823, 10825], [10761, 10824, 10826], [10825, 10827], [10826, 10828, 10936], [10827, 10829], [10762, 10828, 10830], [10829, 10831], [10830, 10832, 10937], [10831, 10833], [10763, 10832, 10834], [10833, 10835], [10834, 10836, 10938], [10835, 10837], [10764, 10836, 10838], [10837, 10839], [10838, 10840, 10939], [10839, 10841], [10765, 10840, 10842], [10841, 10843], [10842, 10844, 10940], [10843, 10845], [10766, 10844, 10846], [10845, 10847], [10846, 10848, 10941], [10847, 10849], [10767, 10848, 10850], [10849, 10851], [10850, 10852, 10942], [10851, 10853], [10768, 10852, 10854], [10853, 10855], [10854, 10856, 10943], [10855, 10857], [10769, 10856, 10858], [10857, 10859], [10858, 10860, 10944], [10859, 10861], [10770, 10860, 10862], [10861, 10863], [10862, 10864, 10945], [10863, 10865], [10771, 10864, 10866], [10865, 10867], [10866, 10868, 10946], [10867, 10869], [10772, 10868, 10870], [10869, 10871], [10870, 10872, 10947], [10871, 10873], [10773, 10872, 10874], [10873, 10875], [10874, 10876, 10948], [10875, 10877], [10774, 10876, 10878], [10877, 10879], [10878, 10880, 10949], [10879, 10881], [10775, 10880, 10882], [10881, 10883], [10882, 10884, 10950], [10883, 10885], [10776, 10884, 10886], [10885, 10887], [10886, 10888, 10951], [10887, 10889], [10777, 10888, 10890], [10889, 10891], [10890, 10892, 10952], [10891, 10893], [10778, 10892, 10894], [10893, 10895], [10894, 10896, 10953], [10895, 10897], [10779, 10896, 10898], [10897, 10899], [10898, 10900, 10954], [10899, 10901], [10780, 10900, 10902], [10901, 10903], [10902, 10904, 10955], [10903, 10905], [10781, 10904, 10906], [10905, 10907], [10906, 10908, 10956], [10907, 10909], [10782, 10908, 10910], [10909, 10911], [10910, 10912, 10957], [10911, 10913], [10783, 10912, 10914], [10913, 10915], [10914, 10916, 10958], [10915, 10917], [10784, 10916, 10918], [10917, 10919], [10918, 10920, 10959], [10919, 10921], [10785, 10920, 10922], [10921, 10923], [10922, 10924, 10960], [10923, 10925], [10786, 10924], [10787, 10961], [10791, 10965], [10795, 10969], [10799, 10973], [10803, 10977], [10807, 10981], [10811, 10985], [10815, 10989], [10819, 10993], [10823, 10997], [10827, 11001], [10831, 11005], [10835, 11009], [10839, 11013], [10843, 11017], [10847, 11021], [10851, 11025], [10855, 11029], [10859, 11033], [10863, 11037], [10867, 11041], [10871, 11045], [10875, 11049], [10879, 11053], [10883, 11057], [10887, 11061], [10891, 11065], [10895, 11069], [10899, 11073], [10903, 11077], [10907, 11081], [10911, 11085], [10915, 11089], [10919, 11093], [10923, 11097], [10926, 10962], [10961, 10963], [10962, 10964, 11100], [10963, 10965], [10927, 10964, 10966], [10965, 10967], [10966, 10968, 11101], [10967, 10969], [10928, 10968, 10970], [10969, 10971], [10970, 10972, 11102], [10971, 10973], [10929, 10972, 10974], [10973, 10975], [10974, 10976, 11103], [10975, 10977], [10930, 10976, 10978], [10977, 10979], [10978, 10980, 11104], [10979, 10981], [10931, 10980, 10982], [10981, 10983], [10982, 10984, 11105], [10983, 10985], [10932, 10984, 10986], [10985, 10987], [10986, 10988, 11106], [10987, 10989], [10933, 10988, 10990], [10989, 10991], [10990, 10992, 11107], [10991, 10993], [10934, 10992, 10994], [10993, 10995], [10994, 10996, 11108], [10995, 10997], [10935, 10996, 10998], [10997, 10999], [10998, 11000, 11109], [10999, 11001], [10936, 11000, 11002], [11001, 11003], [11002, 11004, 11110], [11003, 11005], [10937, 11004, 11006], [11005, 11007], [11006, 11008, 11111], [11007, 11009], [10938, 11008, 11010], [11009, 11011], [11010, 11012, 11112], [11011, 11013], [10939, 11012, 11014], [11013, 11015], [11014, 11016, 11113], [11015, 11017], [10940, 11016, 11018], [11017, 11019], [11018, 11020, 11114], [11019, 11021], [10941, 11020, 11022], [11021, 11023], [11022, 11024, 11115], [11023, 11025], [10942, 11024, 11026], [11025, 11027], [11026, 11028, 11116], [11027, 11029], [10943, 11028, 11030], [11029, 11031], [11030, 11032, 11117], [11031, 11033], [10944, 11032, 11034], [11033, 11035], [11034, 11036, 11118], [11035, 11037], [10945, 11036, 11038], [11037, 11039], [11038, 11040, 11119], [11039, 11041], [10946, 11040, 11042], [11041, 11043], [11042, 11044, 11120], [11043, 11045], [10947, 11044, 11046], [11045, 11047], [11046, 11048, 11121], [11047, 11049], [10948, 11048, 11050], [11049, 11051], [11050, 11052, 11122], [11051, 11053], [10949, 11052, 11054], [11053, 11055], [11054, 11056, 11123], [11055, 11057], [10950, 11056, 11058], [11057, 11059], [11058, 11060, 11124], [11059, 11061], [10951, 11060, 11062], [11061, 11063], [11062, 11064, 11125], [11063, 11065], [10952, 11064, 11066], [11065, 11067], [11066, 11068, 11126], [11067, 11069], [10953, 11068, 11070], [11069, 11071], [11070, 11072, 11127], [11071, 11073], [10954, 11072, 11074], [11073, 11075], [11074, 11076, 11128], [11075, 11077], [10955, 11076, 11078], [11077, 11079], [11078, 11080, 11129], [11079, 11081], [10956, 11080, 11082], [11081, 11083], [11082, 11084, 11130], [11083, 11085], [10957, 11084, 11086], [11085, 11087], [11086, 11088, 11131], [11087, 11089], [10958, 11088, 11090], [11089, 11091], [11090, 11092, 11132], [11091, 11093], [10959, 11092, 11094], [11093, 11095], [11094, 11096, 11133], [11095, 11097], [10960, 11096, 11098], [11097, 11099], [11098, 11134], [10963, 11137], [10967, 11141], [10971, 11145], [10975, 11149], [10979, 11153], [10983, 11157], [10987, 11161], [10991, 11165], [10995, 11169], [10999, 11173], [11003, 11177], [11007, 11181], [11011, 11185], [11015, 11189], [11019, 11193], [11023, 11197], [11027, 11201], [11031, 11205], [11035, 11209], [11039, 11213], [11043, 11217], [11047, 11221], [11051, 11225], [11055, 11229], [11059, 11233], [11063, 11237], [11067, 11241], [11071, 11245], [11075, 11249], [11079, 11253], [11083, 11257], [11087, 11261], [11091, 11265], [11095, 11269], [11099, 11273], [11136, 11274], [11135, 11137], [11100, 11136, 11138], [11137, 11139], [11138, 11140, 11275], [11139, 11141], [11101, 11140, 11142], [11141, 11143], [11142, 11144, 11276], [11143, 11145], [11102, 11144, 11146], [11145, 11147], [11146, 11148, 11277], [11147, 11149], [11103, 11148, 11150], [11149, 11151], [11150, 11152, 11278], [11151, 11153], [11104, 11152, 11154], [11153, 11155], [11154, 11156, 11279], [11155, 11157], [11105, 11156, 11158], [11157, 11159], [11158, 11160, 11280], [11159, 11161], [11106, 11160, 11162], [11161, 11163], [11162, 11164, 11281], [11163, 11165], [11107, 11164, 11166], [11165, 11167], [11166, 11168, 11282], [11167, 11169], [11108, 11168, 11170], [11169, 11171], [11170, 11172, 11283], [11171, 11173], [11109, 11172, 11174], [11173, 11175], [11174, 11176, 11284], [11175, 11177], [11110, 11176, 11178], [11177, 11179], [11178, 11180, 11285], [11179, 11181], [11111, 11180, 11182], [11181, 11183], [11182, 11184, 11286], [11183, 11185], [11112, 11184, 11186], [11185, 11187], [11186, 11188, 11287], [11187, 11189], [11113, 11188, 11190], [11189, 11191], [11190, 11192, 11288], [11191, 11193], [11114, 11192, 11194], [11193, 11195], [11194, 11196, 11289], [11195, 11197], [11115, 11196, 11198], [11197, 11199], [11198, 11200, 11290], [11199, 11201], [11116, 11200, 11202], [11201, 11203], [11202, 11204, 11291], [11203, 11205], [11117, 11204, 11206], [11205, 11207], [11206, 11208, 11292], [11207, 11209], [11118, 11208, 11210], [11209, 11211], [11210, 11212, 11293], [11211, 11213], [11119, 11212, 11214], [11213, 11215], [11214, 11216, 11294], [11215, 11217], [11120, 11216, 11218], [11217, 11219], [11218, 11220, 11295], [11219, 11221], [11121, 11220, 11222], [11221, 11223], [11222, 11224, 11296], [11223, 11225], [11122, 11224, 11226], [11225, 11227], [11226, 11228, 11297], [11227, 11229], [11123, 11228, 11230], [11229, 11231], [11230, 11232, 11298], [11231, 11233], [11124, 11232, 11234], [11233, 11235], [11234, 11236, 11299], [11235, 11237], [11125, 11236, 11238], [11237, 11239], [11238, 11240, 11300], [11239, 11241], [11126, 11240, 11242], [11241, 11243], [11242, 11244, 11301], [11243, 11245], [11127, 11244, 11246], [11245, 11247], [11246, 11248, 11302], [11247, 11249], [11128, 11248, 11250], [11249, 11251], [11250, 11252, 11303], [11251, 11253], [11129, 11252, 11254], [11253, 11255], [11254, 11256, 11304], [11255, 11257], [11130, 11256, 11258], [11257, 11259], [11258, 11260, 11305], [11259, 11261], [11131, 11260, 11262], [11261, 11263], [11262, 11264, 11306], [11263, 11265], [11132, 11264, 11266], [11265, 11267], [11266, 11268, 11307], [11267, 11269], [11133, 11268, 11270], [11269, 11271], [11270, 11272, 11308], [11271, 11273], [11134, 11272], [11135, 11309], [11139, 11313], [11143, 11317], [11147, 11321], [11151, 11325], [11155, 11329], [11159, 11333], [11163, 11337], [11167, 11341], [11171, 11345], [11175, 11349], [11179, 11353], [11183, 11357], [11187, 11361], [11191, 11365], [11195, 11369], [11199, 11373], [11203, 11377], [11207, 11381], [11211, 11385], [11215, 11389], [11219, 11393], [11223, 11397], [11227, 11401], [11231, 11405], [11235, 11409], [11239, 11413], [11243, 11417], [11247, 11421], [11251, 11425], [11255, 11429], [11259, 11433], [11263, 11437], [11267, 11441], [11271, 11445], [11274, 11310], [11309, 11311], [11310, 11312, 11448], [11311, 11313], [11275, 11312, 11314], [11313, 11315], [11314, 11316, 11449], [11315, 11317], [11276, 11316, 11318], [11317, 11319], [11318, 11320, 11450], [11319, 11321], [11277, 11320, 11322], [11321, 11323], [11322, 11324, 11451], [11323, 11325], [11278, 11324, 11326], [11325, 11327], [11326, 11328, 11452], [11327, 11329], [11279, 11328, 11330], [11329, 11331], [11330, 11332, 11453], [11331, 11333], [11280, 11332, 11334], [11333, 11335], [11334, 11336, 11454], [11335, 11337], [11281, 11336, 11338], [11337, 11339], [11338, 11340, 11455], [11339, 11341], [11282, 11340, 11342], [11341, 11343], [11342, 11344, 11456], [11343, 11345], [11283, 11344, 11346], [11345, 11347], [11346, 11348, 11457], [11347, 11349], [11284, 11348, 11350], [11349, 11351], [11350, 11352, 11458], [11351, 11353], [11285, 11352, 11354], [11353, 11355], [11354, 11356, 11459], [11355, 11357], [11286, 11356, 11358], [11357, 11359], [11358, 11360, 11460], [11359, 11361], [11287, 11360, 11362], [11361, 11363], [11362, 11364, 11461], [11363, 11365], [11288, 11364, 11366], [11365, 11367], [11366, 11368, 11462], [11367, 11369], [11289, 11368, 11370], [11369, 11371], [11370, 11372, 11463], [11371, 11373], [11290, 11372, 11374], [11373, 11375], [11374, 11376, 11464], [11375, 11377], [11291, 11376, 11378], [11377, 11379], [11378, 11380, 11465], [11379, 11381], [11292, 11380, 11382], [11381, 11383], [11382, 11384, 11466], [11383, 11385], [11293, 11384, 11386], [11385, 11387], [11386, 11388, 11467], [11387, 11389], [11294, 11388, 11390], [11389, 11391], [11390, 11392, 11468], [11391, 11393], [11295, 11392, 11394], [11393, 11395], [11394, 11396, 11469], [11395, 11397], [11296, 11396, 11398], [11397, 11399], [11398, 11400, 11470], [11399, 11401], [11297, 11400, 11402], [11401, 11403], [11402, 11404, 11471], [11403, 11405], [11298, 11404, 11406], [11405, 11407], [11406, 11408, 11472], [11407, 11409], [11299, 11408, 11410], [11409, 11411], [11410, 11412, 11473], [11411, 11413], [11300, 11412, 11414], [11413, 11415], [11414, 11416, 11474], [11415, 11417], [11301, 11416, 11418], [11417, 11419], [11418, 11420, 11475], [11419, 11421], [11302, 11420, 11422], [11421, 11423], [11422, 11424, 11476], [11423, 11425], [11303, 11424, 11426], [11425, 11427], [11426, 11428, 11477], [11427, 11429], [11304, 11428, 11430], [11429, 11431], [11430, 11432, 11478], [11431, 11433], [11305, 11432, 11434], [11433, 11435], [11434, 11436, 11479], [11435, 11437], [11306, 11436, 11438], [11437, 11439], [11438, 11440, 11480], [11439, 11441], [11307, 11440, 11442], [11441, 11443], [11442, 11444, 11481], [11443, 11445], [11308, 11444, 11446], [11445, 11447], [11446, 11482], [11311, 11485], [11315, 11489], [11319, 11493], [11323, 11497], [11327, 11501], [11331, 11505], [11335, 11509], [11339, 11513], [11343, 11517], [11347, 11521], [11351, 11525], [11355, 11529], [11359, 11533], [11363, 11537], [11367, 11541], [11371, 11545], [11375, 11549], [11379, 11553], [11383, 11557], [11387, 11561], [11391, 11565], [11395, 11569], [11399, 11573], [11403, 11577], [11407, 11581], [11411, 11585], [11415, 11589], [11419, 11593], [11423, 11597], [11427, 11601], [11431, 11605], [11435, 11609], [11439, 11613], [11443, 11617], [11447, 11621], [11484, 11622], [11483, 11485], [11448, 11484, 11486], [11485, 11487], [11486, 11488, 11623], [11487, 11489], [11449, 11488, 11490], [11489, 11491], [11490, 11492, 11624], [11491, 11493], [11450, 11492, 11494], [11493, 11495], [11494, 11496, 11625], [11495, 11497], [11451, 11496, 11498], [11497, 11499], [11498, 11500, 11626], [11499, 11501], [11452, 11500, 11502], [11501, 11503], [11502, 11504, 11627], [11503, 11505], [11453, 11504, 11506], [11505, 11507], [11506, 11508, 11628], [11507, 11509], [11454, 11508, 11510], [11509, 11511], [11510, 11512, 11629], [11511, 11513], [11455, 11512, 11514], [11513, 11515], [11514, 11516, 11630], [11515, 11517], [11456, 11516, 11518], [11517, 11519], [11518, 11520, 11631], [11519, 11521], [11457, 11520, 11522], [11521, 11523], [11522, 11524, 11632], [11523, 11525], [11458, 11524, 11526], [11525, 11527], [11526, 11528, 11633], [11527, 11529], [11459, 11528, 11530], [11529, 11531], [11530, 11532, 11634], [11531, 11533], [11460, 11532, 11534], [11533, 11535], [11534, 11536, 11635], [11535, 11537], [11461, 11536, 11538], [11537, 11539], [11538, 11540, 11636], [11539, 11541], [11462, 11540, 11542], [11541, 11543], [11542, 11544, 11637], [11543, 11545], [11463, 11544, 11546], [11545, 11547], [11546, 11548, 11638], [11547, 11549], [11464, 11548, 11550], [11549, 11551], [11550, 11552, 11639], [11551, 11553], [11465, 11552, 11554], [11553, 11555], [11554, 11556, 11640], [11555, 11557], [11466, 11556, 11558], [11557, 11559], [11558, 11560, 11641], [11559, 11561], [11467, 11560, 11562], [11561, 11563], [11562, 11564, 11642], [11563, 11565], [11468, 11564, 11566], [11565, 11567], [11566, 11568, 11643], [11567, 11569], [11469, 11568, 11570], [11569, 11571], [11570, 11572, 11644], [11571, 11573], [11470, 11572, 11574], [11573, 11575], [11574, 11576, 11645], [11575, 11577], [11471, 11576, 11578], [11577, 11579], [11578, 11580, 11646], [11579, 11581], [11472, 11580, 11582], [11581, 11583], [11582, 11584, 11647], [11583, 11585], [11473, 11584, 11586], [11585, 11587], [11586, 11588, 11648], [11587, 11589], [11474, 11588, 11590], [11589, 11591], [11590, 11592, 11649], [11591, 11593], [11475, 11592, 11594], [11593, 11595], [11594, 11596, 11650], [11595, 11597], [11476, 11596, 11598], [11597, 11599], [11598, 11600, 11651], [11599, 11601], [11477, 11600, 11602], [11601, 11603], [11602, 11604, 11652], [11603, 11605], [11478, 11604, 11606], [11605, 11607], [11606, 11608, 11653], [11607, 11609], [11479, 11608, 11610], [11609, 11611], [11610, 11612, 11654], [11611, 11613], [11480, 11612, 11614], [11613, 11615], [11614, 11616, 11655], [11615, 11617], [11481, 11616, 11618], [11617, 11619], [11618, 11620, 11656], [11619, 11621], [11482, 11620], [11483, 11657], [11487, 11661], [11491, 11665], [11495, 11669], [11499, 11673], [11503, 11677], [11507, 11681], [11511, 11685], [11515, 11689], [11519, 11693], [11523, 11697], [11527, 11701], [11531, 11705], [11535, 11709], [11539, 11713], [11543, 11717], [11547, 11721], [11551, 11725], [11555, 11729], [11559, 11733], [11563, 11737], [11567, 11741], [11571, 11745], [11575, 11749], [11579, 11753], [11583, 11757], [11587, 11761], [11591, 11765], [11595, 11769], [11599, 11773], [11603, 11777], [11607, 11781], [11611, 11785], [11615, 11789], [11619, 11793], [11622, 11658], [11657, 11659], [11658, 11660, 11796], [11659, 11661], [11623, 11660, 11662], [11661, 11663], [11662, 11664, 11797], [11663, 11665], [11624, 11664, 11666], [11665, 11667], [11666, 11668, 11798], [11667, 11669], [11625, 11668, 11670], [11669, 11671], [11670, 11672, 11799], [11671, 11673], [11626, 11672, 11674], [11673, 11675], [11674, 11676, 11800], [11675, 11677], [11627, 11676, 11678], [11677, 11679], [11678, 11680, 11801], [11679, 11681], [11628, 11680, 11682], [11681, 11683], [11682, 11684, 11802], [11683, 11685], [11629, 11684, 11686], [11685, 11687], [11686, 11688, 11803], [11687, 11689], [11630, 11688, 11690], [11689, 11691], [11690, 11692, 11804], [11691, 11693], [11631, 11692, 11694], [11693, 11695], [11694, 11696, 11805], [11695, 11697], [11632, 11696, 11698], [11697, 11699], [11698, 11700, 11806], [11699, 11701], [11633, 11700, 11702], [11701, 11703], [11702, 11704, 11807], [11703, 11705], [11634, 11704, 11706], [11705, 11707], [11706, 11708, 11808], [11707, 11709], [11635, 11708, 11710], [11709, 11711], [11710, 11712, 11809], [11711, 11713], [11636, 11712, 11714], [11713, 11715], [11714, 11716, 11810], [11715, 11717], [11637, 11716, 11718], [11717, 11719], [11718, 11720, 11811], [11719, 11721], [11638, 11720, 11722], [11721, 11723], [11722, 11724, 11812], [11723, 11725], [11639, 11724, 11726], [11725, 11727], [11726, 11728, 11813], [11727, 11729], [11640, 11728, 11730], [11729, 11731], [11730, 11732, 11814], [11731, 11733], [11641, 11732, 11734], [11733, 11735], [11734, 11736, 11815], [11735, 11737], [11642, 11736, 11738], [11737, 11739], [11738, 11740, 11816], [11739, 11741], [11643, 11740, 11742], [11741, 11743], [11742, 11744, 11817], [11743, 11745], [11644, 11744, 11746], [11745, 11747], [11746, 11748, 11818], [11747, 11749], [11645, 11748, 11750], [11749, 11751], [11750, 11752, 11819], [11751, 11753], [11646, 11752, 11754], [11753, 11755], [11754, 11756, 11820], [11755, 11757], [11647, 11756, 11758], [11757, 11759], [11758, 11760, 11821], [11759, 11761], [11648, 11760, 11762], [11761, 11763], [11762, 11764, 11822], [11763, 11765], [11649, 11764, 11766], [11765, 11767], [11766, 11768, 11823], [11767, 11769], [11650, 11768, 11770], [11769, 11771], [11770, 11772, 11824], [11771, 11773], [11651, 11772, 11774], [11773, 11775], [11774, 11776, 11825], [11775, 11777], [11652, 11776, 11778], [11777, 11779], [11778, 11780, 11826], [11779, 11781], [11653, 11780, 11782], [11781, 11783], [11782, 11784, 11827], [11783, 11785], [11654, 11784, 11786], [11785, 11787], [11786, 11788, 11828], [11787, 11789], [11655, 11788, 11790], [11789, 11791], [11790, 11792, 11829], [11791, 11793], [11656, 11792, 11794], [11793, 11795], [11794, 11830], [11659, 11832], [11663, 11836], [11667, 11840], [11671, 11844], [11675, 11848], [11679, 11852], [11683, 11856], [11687, 11860], [11691, 11864], [11695, 11868], [11699, 11872], [11703, 11876], [11707, 11880], [11711, 11884], [11715, 11888], [11719, 11892], [11723, 11896], [11727, 11900], [11731, 11904], [11735, 11908], [11739, 11912], [11743, 11916], [11747, 11920], [11751, 11924], [11755, 11928], [11759, 11932], [11763, 11936], [11767, 11940], [11771, 11944], [11775, 11948], [11779, 11952], [11783, 11956], [11787, 11960], [11791, 11964], [11795, 11968], [11832], [11796, 11831, 11833], [11832, 11834], [11833, 11835], [11834, 11836], [11797, 11835, 11837], [11836, 11838], [11837, 11839], [11838, 11840], [11798, 11839, 11841], [11840, 11842], [11841, 11843], [11842, 11844], [11799, 11843, 11845], [11844, 11846], [11845, 11847], [11846, 11848], [11800, 11847, 11849], [11848, 11850], [11849, 11851], [11850, 11852], [11801, 11851, 11853], [11852, 11854], [11853, 11855], [11854, 11856], [11802, 11855, 11857], [11856, 11858], [11857, 11859], [11858, 11860], [11803, 11859, 11861], [11860, 11862], [11861, 11863], [11862, 11864], [11804, 11863, 11865], [11864, 11866], [11865, 11867], [11866, 11868], [11805, 11867, 11869], [11868, 11870], [11869, 11871], [11870, 11872], [11806, 11871, 11873], [11872, 11874], [11873, 11875], [11874, 11876], [11807, 11875, 11877], [11876, 11878], [11877, 11879], [11878, 11880], [11808, 11879, 11881], [11880, 11882], [11881, 11883], [11882, 11884], [11809, 11883, 11885], [11884, 11886], [11885, 11887], [11886, 11888], [11810, 11887, 11889], [11888, 11890], [11889, 11891], [11890, 11892], [11811, 11891, 11893], [11892, 11894], [11893, 11895], [11894, 11896], [11812, 11895, 11897], [11896, 11898], [11897, 11899], [11898, 11900], [11813, 11899, 11901], [11900, 11902], [11901, 11903], [11902, 11904], [11814, 11903, 11905], [11904, 11906], [11905, 11907], [11906, 11908], [11815, 11907, 11909], [11908, 11910], [11909, 11911], [11910, 11912], [11816, 11911, 11913], [11912, 11914], [11913, 11915], [11914, 11916], [11817, 11915, 11917], [11916, 11918], [11917, 11919], [11918, 11920], [11818, 11919, 11921], [11920, 11922], [11921, 11923], [11922, 11924], [11819, 11923, 11925], [11924, 11926], [11925, 11927], [11926, 11928], [11820, 11927, 11929], [11928, 11930], [11929, 11931], [11930, 11932], [11821, 11931, 11933], [11932, 11934], [11933, 11935], [11934, 11936], [11822, 11935, 11937], [11936, 11938], [11937, 11939], [11938, 11940], [11823, 11939, 11941], [11940, 11942], [11941, 11943], [11942, 11944], [11824, 11943, 11945], [11944, 11946], [11945, 11947], [11946, 11948], [11825, 11947, 11949], [11948, 11950], [11949, 11951], [11950, 11952], [11826, 11951, 11953], [11952, 11954], [11953, 11955], [11954, 11956], [11827, 11955, 11957], [11956, 11958], [11957, 11959], [11958, 11960], [11828, 11959, 11961], [11960, 11962], [11961, 11963], [11962, 11964], [11829, 11963, 11965], [11964, 11966], [11965, 11967], [11966, 11968], [11830, 11967]] SGERROR: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1, 138], [0, 2], [1, 3], [2, 4], [3, 5, 139], [4, 6], [5, 7], [6, 8], [7, 9, 140], [8, 10], [9, 11], [10, 12], [11, 13, 141], [12, 14], [13, 15], [14, 16], [15, 17, 142], [16, 18], [17, 19], [18, 20], [19, 21, 143], [20, 22], [21, 23], [22, 24], [23, 25, 144], [24, 26], [25, 27], [26, 28], [27, 29, 145], [28, 30], [29, 31], [30, 32], [31, 33, 146], [32, 34], [33, 35], [34, 36], [35, 37, 147], [36, 38], [37, 39], [38, 40], [39, 41, 148], [40, 42], [41, 43], [42, 44], [43, 45, 149], [44, 46], [45, 47], [46, 48], [47, 49, 150], [48, 50], [49, 51], [50, 52], [51, 53, 151], [52, 54], [53, 55], [54, 56], [55, 57, 152], [56, 58], [57, 59], [58, 60], [59, 61, 153], [60, 62], [61, 63], [62, 64], [63, 65, 154], [64, 66], [65, 67], [66, 68], [67, 69, 155], [68, 70], [69, 71], [70, 72], [71, 73, 156], [72, 74], [73, 75], [74, 76], [75, 77, 157], [76, 78], [77, 79], [78, 80], [79, 81, 158], [80, 82], [81, 83], [82, 84], [83, 85, 159], [84, 86], [85, 87], [86, 88], [87, 89, 160], [88, 90], [89, 91], [90, 92], [91, 93, 161], [92, 94], [93, 95], [94, 96], [95, 97, 162], [96, 98], [97, 99], [98, 100], [99, 101, 163], [100, 102], [101, 103], [102, 104], [103, 105, 164], [104, 106], [105, 107], [106, 108], [107, 109, 165], [108, 110], [109, 111], [110, 112], [111, 113, 166], [112, 114], [113, 115], [114, 116], [115, 117, 167], [116, 118], [117, 119], [118, 120], [119, 121, 168], [120, 122], [121, 123], [122, 124], [123, 125, 169], [124, 126], [125, 127], [126, 128], [127, 129, 170], [128, 130], [129, 131], [130, 132], [131, 133, 171], [132, 134], [133, 135], [134, 136], [135, 137, 172], [136], [0, 173], [4, 177], [8, 181], [12, 185], [16, 189], [20, 193], [24, 197], [28, 201], [32, 205], [36, 209], [40, 213], [44, 217], [48, 221], [52, 225], [56, 229], [60, 233], [64, 237], [68, 241], [72, 245], [76, 249], [80, 253], [84, 257], [88, 261], [92, 265], [96, 269], [100, 273], [104, 277], [108, 281], [112, 285], [116, 289], [120, 293], [124, 297], [128, 301], [132, 305], [136, 309], [138, 174], [173, 175], [174, 176, 312], [175, 177], [139, 176, 178], [177, 179], [178, 180, 313], [179, 181], [140, 180, 182], [181, 183], [182, 184, 314], [183, 185], [141, 184, 186], [185, 187], [186, 188, 315], [187, 189], [142, 188, 190], [189, 191], [190, 192, 316], [191, 193], [143, 192, 194], [193, 195], [194, 196, 317], [195, 197], [144, 196, 198], [197, 199], [198, 200, 318], [199, 201], [145, 200, 202], [201, 203], [202, 204, 319], [203, 205], [146, 204, 206], [205, 207], [206, 208, 320], [207, 209], [147, 208, 210], [209, 211], [210, 212, 321], [211, 213], [148, 212, 214], [213, 215], [214, 216, 322], [215, 217], [149, 216, 218], [217, 219], [218, 220, 323], [219, 221], [150, 220, 222], [221, 223], [222, 224, 324], [223, 225], [151, 224, 226], [225, 227], [226, 228, 325], [227, 229], [152, 228, 230], [229, 231], [230, 232, 326], [231, 233], [153, 232, 234], [233, 235], [234, 236, 327], [235, 237], [154, 236, 238], [237, 239], [238, 240, 328], [239, 241], [155, 240, 242], [241, 243], [242, 244, 329], [243, 245], [156, 244, 246], [245, 247], [246, 248, 330], [247, 249], [157, 248, 250], [249, 251], [250, 252, 331], [251, 253], [158, 252, 254], [253, 255], [254, 256, 332], [255, 257], [159, 256, 258], [257, 259], [258, 260, 333], [259, 261], [160, 260, 262], [261, 263], [262, 264, 334], [263, 265], [161, 264, 266], [265, 267], [266, 268, 335], [267, 269], [162, 268, 270], [269, 271], [270, 272, 336], [271, 273], [163, 272, 274], [273, 275], [274, 276, 337], [275, 277], [164, 276, 278], [277, 279], [278, 280, 338], [279, 281], [165, 280, 282], [281, 283], [282, 284, 339], [283, 285], [166, 284, 286], [285, 287], [286, 288, 340], [287, 289], [167, 288, 290], [289, 291], [290, 292, 341], [291, 293], [168, 292, 294], [293, 295], [294, 296, 342], [295, 297], [169, 296, 298], [297, 299], [298, 300, 343], [299, 301], [170, 300, 302], [301, 303], [302, 304, 344], [303, 305], [171, 304, 306], [305, 307], [306, 308, 345], [307, 309], [172, 308, 310], [309, 311], [310, 346], [175, 349], [179, 353], [183, 357], [187, 361], [191, 365], [195, 369], [199, 373], [203, 377], [207, 381], [211, 385], [215, 389], [219, 393], [223, 397], [227, 401], [231, 405], [235, 409], [239, 413], [243, 417], [247, 421], [251, 425], [255, 429], [259, 433], [263, 437], [267, 441], [271, 445], [275, 449], [279, 453], [283, 457], [287, 461], [291, 465], [295, 469], [299, 473], [303, 477], [307, 481], [311, 485], [348, 486], [347, 349], [312, 348, 350], [349, 351], [350, 352, 487], [351, 353], [313, 352, 354], [353, 355], [354, 356, 488], [355, 357], [314, 356, 358], [357, 359], [358, 360, 489], [359, 361], [315, 360, 362], [361, 363], [362, 364, 490], [363, 365], [316, 364, 366], [365, 367], [366, 368, 491], [367, 369], [317, 368, 370], [369, 371], [370, 372, 492], [371, 373], [318, 372, 374], [373, 375], [374, 376, 493], [375, 377], [319, 376, 378], [377, 379], [378, 380, 494], [379, 381], [320, 380, 382], [381, 383], [382, 384, 495], [383, 385], [321, 384, 386], [385, 387], [386, 388, 496], [387, 389], [322, 388, 390], [389, 391], [390, 392, 497], [391, 393], [323, 392, 394], [393, 395], [394, 396, 498], [395, 397], [324, 396, 398], [397, 399], [398, 400, 499], [399, 401], [325, 400, 402], [401, 403], [402, 404, 500], [403, 405], [326, 404, 406], [405, 407], [406, 408, 501], [407, 409], [327, 408, 410], [409, 411], [410, 412, 502], [411, 413], [328, 412, 414], [413, 415], [414, 416, 503], [415, 417], [329, 416, 418], [417, 419], [418, 420, 504], [419, 421], [330, 420, 422], [421, 423], [422, 424, 505], [423, 425], [331, 424, 426], [425, 427], [426, 428, 506], [427, 429], [332, 428, 430], [429, 431], [430, 432, 507], [431, 433], [333, 432, 434], [433, 435], [434, 436, 508], [435, 437], [334, 436, 438], [437, 439], [438, 440, 509], [439, 441], [335, 440, 442], [441, 443], [442, 444, 510], [443, 445], [336, 444, 446], [445, 447], [446, 448, 511], [447, 449], [337, 448, 450], [449, 451], [450, 452, 512], [451, 453], [338, 452, 454], [453, 455], [454, 456, 513], [455, 457], [339, 456, 458], [457, 459], [458, 460, 514], [459, 461], [340, 460, 462], [461, 463], [462, 464, 515], [463, 465], [341, 464, 466], [465, 467], [466, 468, 516], [467, 469], [342, 468, 470], [469, 471], [470, 472, 517], [471, 473], [343, 472, 474], [473, 475], [474, 476, 518], [475, 477], [344, 476, 478], [477, 479], [478, 480, 519], [479, 481], [345, 480, 482], [481, 483], [482, 484, 520], [483, 485], [346, 484], [347, 521], [351, 525], [355, 529], [359, 533], [363, 537], [367, 541], [371, 545], [375, 549], [379, 553], [383, 557], [387, 561], [391, 565], [395, 569], [399, 573], [403, 577], [407, 581], [411, 585], [415, 589], [419, 593], [423, 597], [427, 601], [431, 605], [435, 609], [439, 613], [443, 617], [447, 621], [451, 625], [455, 629], [459, 633], [463, 637], [467, 641], [471, 645], [475, 649], [479, 653], [483, 657], [486, 522], [521, 523], [522, 524, 660], [523, 525], [487, 524, 526], [525, 527], [526, 528, 661], [527, 529], [488, 528, 530], [529, 531], [530, 532, 662], [531, 533], [489, 532, 534], [533, 535], [534, 536, 663], [535, 537], [490, 536, 538], [537, 539], [538, 540, 664], [539, 541], [491, 540, 542], [541, 543], [542, 544, 665], [543, 545], [492, 544, 546], [545, 547], [546, 548, 666], [547, 549], [493, 548, 550], [549, 551], [550, 552, 667], [551, 553], [494, 552, 554], [553, 555], [554, 556, 668], [555, 557], [495, 556, 558], [557, 559], [558, 560, 669], [559, 561], [496, 560, 562], [561, 563], [562, 564, 670], [563, 565], [497, 564, 566], [565, 567], [566, 568, 671], [567, 569], [498, 568, 570], [569, 571], [570, 572, 672], [571, 573], [499, 572, 574], [573, 575], [574, 576, 673], [575, 577], [500, 576, 578], [577, 579], [578, 580, 674], [579, 581], [501, 580, 582], [581, 583], [582, 584, 675], [583, 585], [502, 584, 586], [585, 587], [586, 588, 676], [587, 589], [503, 588, 590], [589, 591], [590, 592, 677], [591, 593], [504, 592, 594], [593, 595], [594, 596, 678], [595, 597], [505, 596, 598], [597, 599], [598, 600, 679], [599, 601], [506, 600, 602], [601, 603], [602, 604, 680], [603, 605], [507, 604, 606], [605, 607], [606, 608, 681], [607, 609], [508, 608, 610], [609, 611], [610, 612, 682], [611, 613], [509, 612, 614], [613, 615], [614, 616, 683], [615, 617], [510, 616, 618], [617, 619], [618, 620, 684], [619, 621], [511, 620, 622], [621, 623], [622, 624, 685], [623, 625], [512, 624, 626], [625, 627], [626, 628, 686], [627, 629], [513, 628, 630], [629, 631], [630, 632, 687], [631, 633], [514, 632, 634], [633, 635], [634, 636, 688], [635, 637], [515, 636, 638], [637, 639], [638, 640, 689], [639, 641], [516, 640, 642], [641, 643], [642, 644, 690], [643, 645], [517, 644, 646], [645, 647], [646, 648, 691], [647, 649], [518, 648, 650], [649, 651], [650, 652, 692], [651, 653], [519, 652, 654], [653, 655], [654, 656, 693], [655, 657], [520, 656, 658], [657, 659], [658, 694], [523, 697], [527, 701], [531, 705], [535, 709], [539, 713], [543, 717], [547, 721], [551, 725], [555, 729], [559, 733], [563, 737], [567, 741], [571, 745], [575, 749], [579, 753], [583, 757], [587, 761], [591, 765], [595, 769], [599, 773], [603, 777], [607, 781], [611, 785], [615, 789], [619, 793], [623, 797], [627, 801], [631, 805], [635, 809], [639, 813], [643, 817], [647, 821], [651, 825], [655, 829], [659, 833], [696, 834], [695, 697], [660, 696, 698], [697, 699], [698, 700, 835], [699, 701], [661, 700, 702], [701, 703], [702, 704, 836], [703, 705], [662, 704, 706], [705, 707], [706, 708, 837], [707, 709], [663, 708, 710], [709, 711], [710, 712, 838], [711, 713], [664, 712, 714], [713, 715], [714, 716, 839], [715, 717], [665, 716, 718], [717, 719], [718, 720, 840], [719, 721], [666, 720, 722], [721, 723], [722, 724, 841], [723, 725], [667, 724, 726], [725, 727], [726, 728, 842], [727, 729], [668, 728, 730], [729, 731], [730, 732, 843], [731, 733], [669, 732, 734], [733, 735], [734, 736, 844], [735, 737], [670, 736, 738], [737, 739], [738, 740, 845], [739, 741], [671, 740, 742], [741, 743], [742, 744, 846], [743, 745], [672, 744, 746], [745, 747], [746, 748, 847], [747, 749], [673, 748, 750], [749, 751], [750, 752, 848], [751, 753], [674, 752, 754], [753, 755], [754, 756, 849], [755, 757], [675, 756, 758], [757, 759], [758, 760, 850], [759, 761], [676, 760, 762], [761, 763], [762, 764, 851], [763, 765], [677, 764, 766], [765, 767], [766, 768, 852], [767, 769], [678, 768, 770], [769, 771], [770, 772, 853], [771, 773], [679, 772, 774], [773, 775], [774, 776, 854], [775, 777], [680, 776, 778], [777, 779], [778, 780, 855], [779, 781], [681, 780, 782], [781, 783], [782, 784, 856], [783, 785], [682, 784, 786], [785, 787], [786, 788, 857], [787, 789], [683, 788, 790], [789, 791], [790, 792, 858], [791, 793], [684, 792, 794], [793, 795], [794, 796, 859], [795, 797], [685, 796, 798], [797, 799], [798, 800, 860], [799, 801], [686, 800, 802], [801, 803], [802, 804, 861], [803, 805], [687, 804, 806], [805, 807], [806, 808, 862], [807, 809], [688, 808, 810], [809, 811], [810, 812, 863], [811, 813], [689, 812, 814], [813, 815], [814, 816, 864], [815, 817], [690, 816, 818], [817, 819], [818, 820, 865], [819, 821], [691, 820, 822], [821, 823], [822, 824, 866], [823, 825], [692, 824, 826], [825, 827], [826, 828, 867], [827, 829], [693, 828, 830], [829, 831], [830, 832, 868], [831, 833], [694, 832], [695, 869], [699, 873], [703, 877], [707, 881], [711, 885], [715, 889], [719, 893], [723, 897], [727, 901], [731, 905], [735, 909], [739, 913], [743, 917], [747, 921], [751, 925], [755, 929], [759, 933], [763, 937], [767, 941], [771, 945], [775, 949], [779, 953], [783, 957], [787, 961], [791, 965], [795, 969], [799, 973], [803, 977], [807, 981], [811, 985], [815, 989], [819, 993], [823, 997], [827, 1001], [831, 1005], [834, 870], [869, 871], [870, 872, 1008], [871, 873], [835, 872, 874], [873, 875], [874, 876, 1009], [875, 877], [836, 876, 878], [877, 879], [878, 880, 1010], [879, 881], [837, 880, 882], [881, 883], [882, 884, 1011], [883, 885], [838, 884, 886], [885, 887], [886, 888, 1012], [887, 889], [839, 888, 890], [889, 891], [890, 892, 1013], [891, 893], [840, 892, 894], [893, 895], [894, 896, 1014], [895, 897], [841, 896, 898], [897, 899], [898, 900, 1015], [899, 901], [842, 900, 902], [901, 903], [902, 904, 1016], [903, 905], [843, 904, 906], [905, 907], [906, 908, 1017], [907, 909], [844, 908, 910], [909, 911], [910, 912, 1018], [911, 913], [845, 912, 914], [913, 915], [914, 916, 1019], [915, 917], [846, 916, 918], [917, 919], [918, 920, 1020], [919, 921], [847, 920, 922], [921, 923], [922, 924, 1021], [923, 925], [848, 924, 926], [925, 927], [926, 928, 1022], [927, 929], [849, 928, 930], [929, 931], [930, 932, 1023], [931, 933], [850, 932, 934], [933, 935], [934, 936, 1024], [935, 937], [851, 936, 938], [937, 939], [938, 940, 1025], [939, 941], [852, 940, 942], [941, 943], [942, 944, 1026], [943, 945], [853, 944, 946], [945, 947], [946, 948, 1027], [947, 949], [854, 948, 950], [949, 951], [950, 952, 1028], [951, 953], [855, 952, 954], [953, 955], [954, 956, 1029], [955, 957], [856, 956, 958], [957, 959], [958, 960, 1030], [959, 961], [857, 960, 962], [961, 963], [962, 964, 1031], [963, 965], [858, 964, 966], [965, 967], [966, 968, 1032], [967, 969], [859, 968, 970], [969, 971], [970, 972, 1033], [971, 973], [860, 972, 974], [973, 975], [974, 976, 1034], [975, 977], [861, 976, 978], [977, 979], [978, 980, 1035], [979, 981], [862, 980, 982], [981, 983], [982, 984, 1036], [983, 985], [863, 984, 986], [985, 987], [986, 988, 1037], [987, 989], [864, 988, 990], [989, 991], [990, 992, 1038], [991, 993], [865, 992, 994], [993, 995], [994, 996, 1039], [995, 997], [866, 996, 998], [997, 999], [998, 1000, 1040], [999, 1001], [867, 1000, 1002], [1001, 1003], [1002, 1004, 1041], [1003, 1005], [868, 1004, 1006], [1005, 1007], [1006, 1042], [871, 1045], [875, 1049], [879, 1053], [883, 1057], [887, 1061], [891, 1065], [895, 1069], [899, 1073], [903, 1077], [907, 1081], [911, 1085], [915, 1089], [919, 1093], [923, 1097], [927, 1101], [931, 1105], [935, 1109], [939, 1113], [943, 1117], [947, 1121], [951, 1125], [955, 1129], [959, 1133], [963, 1137], [967, 1141], [971, 1145], [975, 1149], [979, 1153], [983, 1157], [987, 1161], [991, 1165], [995, 1169], [999, 1173], [1003, 1177], [1007, 1181], [1044, 1182], [1043, 1045], [1008, 1044, 1046], [1045, 1047], [1046, 1048, 1183], [1047, 1049], [1009, 1048, 1050], [1049, 1051], [1050, 1052, 1184], [1051, 1053], [1010, 1052, 1054], [1053, 1055], [1054, 1056, 1185], [1055, 1057], [1011, 1056, 1058], [1057, 1059], [1058, 1060, 1186], [1059, 1061], [1012, 1060, 1062], [1061, 1063], [1062, 1064, 1187], [1063, 1065], [1013, 1064, 1066], [1065, 1067], [1066, 1068, 1188], [1067, 1069], [1014, 1068, 1070], [1069, 1071], [1070, 1072, 1189], [1071, 1073], [1015, 1072, 1074], [1073, 1075], [1074, 1076, 1190], [1075, 1077], [1016, 1076, 1078], [1077, 1079], [1078, 1080, 1191], [1079, 1081], [1017, 1080, 1082], [1081, 1083], [1082, 1084, 1192], [1083, 1085], [1018, 1084, 1086], [1085, 1087], [1086, 1088, 1193], [1087, 1089], [1019, 1088, 1090], [1089, 1091], [1090, 1092, 1194], [1091, 1093], [1020, 1092, 1094], [1093, 1095], [1094, 1096, 1195], [1095, 1097], [1021, 1096, 1098], [1097, 1099], [1098, 1100, 1196], [1099, 1101], [1022, 1100, 1102], [1101, 1103], [1102, 1104, 1197], [1103, 1105], [1023, 1104, 1106], [1105, 1107], [1106, 1108, 1198], [1107, 1109], [1024, 1108, 1110], [1109, 1111], [1110, 1112, 1199], [1111, 1113], [1025, 1112, 1114], [1113, 1115], [1114, 1116, 1200], [1115, 1117], [1026, 1116, 1118], [1117, 1119], [1118, 1120, 1201], [1119, 1121], [1027, 1120, 1122], [1121, 1123], [1122, 1124, 1202], [1123, 1125], [1028, 1124, 1126], [1125, 1127], [1126, 1128, 1203], [1127, 1129], [1029, 1128, 1130], [1129, 1131], [1130, 1132, 1204], [1131, 1133], [1030, 1132, 1134], [1133, 1135], [1134, 1136, 1205], [1135, 1137], [1031, 1136, 1138], [1137, 1139], [1138, 1140, 1206], [1139, 1141], [1032, 1140, 1142], [1141, 1143], [1142, 1144, 1207], [1143, 1145], [1033, 1144, 1146], [1145, 1147], [1146, 1148, 1208], [1147, 1149], [1034, 1148, 1150], [1149, 1151], [1150, 1152, 1209], [1151, 1153], [1035, 1152, 1154], [1153, 1155], [1154, 1156, 1210], [1155, 1157], [1036, 1156, 1158], [1157, 1159], [1158, 1160, 1211], [1159, 1161], [1037, 1160, 1162], [1161, 1163], [1162, 1164, 1212], [1163, 1165], [1038, 1164, 1166], [1165, 1167], [1166, 1168, 1213], [1167, 1169], [1039, 1168, 1170], [1169, 1171], [1170, 1172, 1214], [1171, 1173], [1040, 1172, 1174], [1173, 1175], [1174, 1176, 1215], [1175, 1177], [1041, 1176, 1178], [1177, 1179], [1178, 1180, 1216], [1179, 1181], [1042, 1180], [1043, 1217], [1047, 1221], [1051, 1225], [1055, 1229], [1059, 1233], [1063, 1237], [1067, 1241], [1071, 1245], [1075, 1249], [1079, 1253], [1083, 1257], [1087, 1261], [1091, 1265], [1095, 1269], [1099, 1273], [1103, 1277], [1107, 1281], [1111, 1285], [1115, 1289], [1119, 1293], [1123, 1297], [1127, 1301], [1131, 1305], [1135, 1309], [1139, 1313], [1143, 1317], [1147, 1321], [1151, 1325], [1155, 1329], [1159, 1333], [1163, 1337], [1167, 1341], [1171, 1345], [1175, 1349], [1179, 1353], [1182, 1218], [1217, 1219], [1218, 1220, 1356], [1219, 1221], [1183, 1220, 1222], [1221, 1223], [1222, 1224, 1357], [1223, 1225], [1184, 1224, 1226], [1225, 1227], [1226, 1228, 1358], [1227, 1229], [1185, 1228, 1230], [1229, 1231], [1230, 1232, 1359], [1231, 1233], [1186, 1232, 1234], [1233, 1235], [1234, 1236, 1360], [1235, 1237], [1187, 1236, 1238], [1237, 1239], [1238, 1240, 1361], [1239, 1241], [1188, 1240, 1242], [1241, 1243], [1242, 1244, 1362], [1243, 1245], [1189, 1244, 1246], [1245, 1247], [1246, 1248, 1363], [1247, 1249], [1190, 1248, 1250], [1249, 1251], [1250, 1252, 1364], [1251, 1253], [1191, 1252, 1254], [1253, 1255], [1254, 1256, 1365], [1255, 1257], [1192, 1256, 1258], [1257, 1259], [1258, 1260, 1366], [1259, 1261], [1193, 1260, 1262], [1261, 1263], [1262, 1264, 1367], [1263, 1265], [1194, 1264, 1266], [1265, 1267], [1266, 1268, 1368], [1267, 1269], [1195, 1268, 1270], [1269, 1271], [1270, 1272, 1369], [1271, 1273], [1196, 1272, 1274], [1273, 1275], [1274, 1276, 1370], [1275, 1277], [1197, 1276, 1278], [1277, 1279], [1278, 1280, 1371], [1279, 1281], [1198, 1280, 1282], [1281, 1283], [1282, 1284, 1372], [1283, 1285], [1199, 1284, 1286], [1285, 1287], [1286, 1288, 1373], [1287, 1289], [1200, 1288, 1290], [1289, 1291], [1290, 1292, 1374], [1291, 1293], [1201, 1292, 1294], [1293, 1295], [1294, 1296, 1375], [1295, 1297], [1202, 1296, 1298], [1297, 1299], [1298, 1300, 1376], [1299, 1301], [1203, 1300, 1302], [1301, 1303], [1302, 1304, 1377], [1303, 1305], [1204, 1304, 1306], [1305, 1307], [1306, 1308, 1378], [1307, 1309], [1205, 1308, 1310], [1309, 1311], [1310, 1312, 1379], [1311, 1313], [1206, 1312, 1314], [1313, 1315], [1314, 1316, 1380], [1315, 1317], [1207, 1316, 1318], [1317, 1319], [1318, 1320, 1381], [1319, 1321], [1208, 1320, 1322], [1321, 1323], [1322, 1324, 1382], [1323, 1325], [1209, 1324, 1326], [1325, 1327], [1326, 1328, 1383], [1327, 1329], [1210, 1328, 1330], [1329, 1331], [1330, 1332, 1384], [1331, 1333], [1211, 1332, 1334], [1333, 1335], [1334, 1336, 1385], [1335, 1337], [1212, 1336, 1338], [1337, 1339], [1338, 1340, 1386], [1339, 1341], [1213, 1340, 1342], [1341, 1343], [1342, 1344, 1387], [1343, 1345], [1214, 1344, 1346], [1345, 1347], [1346, 1348, 1388], [1347, 1349], [1215, 1348, 1350], [1349, 1351], [1350, 1352, 1389], [1351, 1353], [1216, 1352, 1354], [1353, 1355], [1354, 1390], [1219, 1393], [1223, 1397], [1227, 1401], [1231, 1405], [1235, 1409], [1239, 1413], [1243, 1417], [1247, 1421], [1251, 1425], [1255, 1429], [1259, 1433], [1263, 1437], [1267, 1441], [1271, 1445], [1275, 1449], [1279, 1453], [1283, 1457], [1287, 1461], [1291, 1465], [1295, 1469], [1299, 1473], [1303, 1477], [1307, 1481], [1311, 1485], [1315, 1489], [1319, 1493], [1323, 1497], [1327, 1501], [1331, 1505], [1335, 1509], [1339, 1513], [1343, 1517], [1347, 1521], [1351, 1525], [1355, 1529], [1392, 1530], [1391, 1393], [1356, 1392, 1394], [1393, 1395], [1394, 1396, 1531], [1395, 1397], [1357, 1396, 1398], [1397, 1399], [1398, 1400, 1532], [1399, 1401], [1358, 1400, 1402], [1401, 1403], [1402, 1404, 1533], [1403, 1405], [1359, 1404, 1406], [1405, 1407], [1406, 1408, 1534], [1407, 1409], [1360, 1408, 1410], [1409, 1411], [1410, 1412, 1535], [1411, 1413], [1361, 1412, 1414], [1413, 1415], [1414, 1416, 1536], [1415, 1417], [1362, 1416, 1418], [1417, 1419], [1418, 1420, 1537], [1419, 1421], [1363, 1420, 1422], [1421, 1423], [1422, 1424, 1538], [1423, 1425], [1364, 1424, 1426], [1425, 1427], [1426, 1428, 1539], [1427, 1429], [1365, 1428, 1430], [1429, 1431], [1430, 1432, 1540], [1431, 1433], [1366, 1432, 1434], [1433, 1435], [1434, 1436, 1541], [1435, 1437], [1367, 1436, 1438], [1437, 1439], [1438, 1440, 1542], [1439, 1441], [1368, 1440, 1442], [1441, 1443], [1442, 1444, 1543], [1443, 1445], [1369, 1444, 1446], [1445, 1447], [1446, 1448, 1544], [1447, 1449], [1370, 1448, 1450], [1449, 1451], [1450, 1452, 1545], [1451, 1453], [1371, 1452, 1454], [1453, 1455], [1454, 1456, 1546], [1455, 1457], [1372, 1456, 1458], [1457, 1459], [1458, 1460, 1547], [1459, 1461], [1373, 1460, 1462], [1461, 1463], [1462, 1464, 1548], [1463, 1465], [1374, 1464, 1466], [1465, 1467], [1466, 1468, 1549], [1467, 1469], [1375, 1468, 1470], [1469, 1471], [1470, 1472, 1550], [1471, 1473], [1376, 1472, 1474], [1473, 1475], [1474, 1476, 1551], [1475, 1477], [1377, 1476, 1478], [1477, 1479], [1478, 1480, 1552], [1479, 1481], [1378, 1480, 1482], [1481, 1483], [1482, 1484, 1553], [1483, 1485], [1379, 1484, 1486], [1485, 1487], [1486, 1488, 1554], [1487, 1489], [1380, 1488, 1490], [1489, 1491], [1490, 1492, 1555], [1491, 1493], [1381, 1492, 1494], [1493, 1495], [1494, 1496, 1556], [1495, 1497], [1382, 1496, 1498], [1497, 1499], [1498, 1500, 1557], [1499, 1501], [1383, 1500, 1502], [1501, 1503], [1502, 1504, 1558], [1503, 1505], [1384, 1504, 1506], [1505, 1507], [1506, 1508, 1559], [1507, 1509], [1385, 1508, 1510], [1509, 1511], [1510, 1512, 1560], [1511, 1513], [1386, 1512, 1514], [1513, 1515], [1514, 1516, 1561], [1515, 1517], [1387, 1516, 1518], [1517, 1519], [1518, 1520, 1562], [1519, 1521], [1388, 1520, 1522], [1521, 1523], [1522, 1524, 1563], [1523, 1525], [1389, 1524, 1526], [1525, 1527], [1526, 1528, 1564], [1527, 1529], [1390, 1528], [1391, 1565], [1395, 1569], [1399, 1573], [1403, 1577], [1407, 1581], [1411, 1585], [1415, 1589], [1419, 1593], [1423, 1597], [1427, 1601], [1431, 1605], [1435, 1609], [1439, 1613], [1443, 1617], [1447, 1621], [1451, 1625], [1455, 1629], [1459, 1633], [1463, 1637], [1467, 1641], [1471, 1645], [1475, 1649], [1479, 1653], [1483, 1657], [1487, 1661], [1491, 1665], [1495, 1669], [1499, 1673], [1503, 1677], [1507, 1681], [1511, 1685], [1515, 1689], [1519, 1693], [1523, 1697], [1527, 1701], [1530, 1566], [1565, 1567], [1566, 1568, 1704], [1567, 1569], [1531, 1568, 1570], [1569, 1571], [1570, 1572, 1705], [1571, 1573], [1532, 1572, 1574], [1573, 1575], [1574, 1576, 1706], [1575, 1577], [1533, 1576, 1578], [1577, 1579], [1578, 1580, 1707], [1579, 1581], [1534, 1580, 1582], [1581, 1583], [1582, 1584, 1708], [1583, 1585], [1535, 1584, 1586], [1585, 1587], [1586, 1588, 1709], [1587, 1589], [1536, 1588, 1590], [1589, 1591], [1590, 1592, 1710], [1591, 1593], [1537, 1592, 1594], [1593, 1595], [1594, 1596, 1711], [1595, 1597], [1538, 1596, 1598], [1597, 1599], [1598, 1600, 1712], [1599, 1601], [1539, 1600, 1602], [1601, 1603], [1602, 1604, 1713], [1603, 1605], [1540, 1604, 1606], [1605, 1607], [1606, 1608, 1714], [1607, 1609], [1541, 1608, 1610], [1609, 1611], [1610, 1612, 1715], [1611, 1613], [1542, 1612, 1614], [1613, 1615], [1614, 1616, 1716], [1615, 1617], [1543, 1616, 1618], [1617, 1619], [1618, 1620, 1717], [1619, 1621], [1544, 1620, 1622], [1621, 1623], [1622, 1624, 1718], [1623, 1625], [1545, 1624, 1626], [1625, 1627], [1626, 1628, 1719], [1627, 1629], [1546, 1628, 1630], [1629, 1631], [1630, 1632, 1720], [1631, 1633], [1547, 1632, 1634], [1633, 1635], [1634, 1636, 1721], [1635, 1637], [1548, 1636, 1638], [1637, 1639], [1638, 1640, 1722], [1639, 1641], [1549, 1640, 1642], [1641, 1643], [1642, 1644, 1723], [1643, 1645], [1550, 1644, 1646], [1645, 1647], [1646, 1648, 1724], [1647, 1649], [1551, 1648, 1650], [1649, 1651], [1650, 1652, 1725], [1651, 1653], [1552, 1652, 1654], [1653, 1655], [1654, 1656, 1726], [1655, 1657], [1553, 1656, 1658], [1657, 1659], [1658, 1660, 1727], [1659, 1661], [1554, 1660, 1662], [1661, 1663], [1662, 1664, 1728], [1663, 1665], [1555, 1664, 1666], [1665, 1667], [1666, 1668, 1729], [1667, 1669], [1556, 1668, 1670], [1669, 1671], [1670, 1672, 1730], [1671, 1673], [1557, 1672, 1674], [1673, 1675], [1674, 1676, 1731], [1675, 1677], [1558, 1676, 1678], [1677, 1679], [1678, 1680, 1732], [1679, 1681], [1559, 1680, 1682], [1681, 1683], [1682, 1684, 1733], [1683, 1685], [1560, 1684, 1686], [1685, 1687], [1686, 1688, 1734], [1687, 1689], [1561, 1688, 1690], [1689, 1691], [1690, 1692, 1735], [1691, 1693], [1562, 1692, 1694], [1693, 1695], [1694, 1696, 1736], [1695, 1697], [1563, 1696, 1698], [1697, 1699], [1698, 1700, 1737], [1699, 1701], [1564, 1700, 1702], [1701, 1703], [1702, 1738], [1567, 1741], [1571, 1745], [1575, 1749], [1579, 1753], [1583, 1757], [1587, 1761], [1591, 1765], [1595, 1769], [1599, 1773], [1603, 1777], [1607, 1781], [1611, 1785], [1615, 1789], [1619, 1793], [1623, 1797], [1627, 1801], [1631, 1805], [1635, 1809], [1639, 1813], [1643, 1817], [1647, 1821], [1651, 1825], [1655, 1829], [1659, 1833], [1663, 1837], [1667, 1841], [1671, 1845], [1675, 1849], [1679, 1853], [1683, 1857], [1687, 1861], [1691, 1865], [1695, 1869], [1699, 1873], [1703, 1877], [1740, 1878], [1739, 1741], [1704, 1740, 1742], [1741, 1743], [1742, 1744, 1879], [1743, 1745], [1705, 1744, 1746], [1745, 1747], [1746, 1748, 1880], [1747, 1749], [1706, 1748, 1750], [1749, 1751], [1750, 1752, 1881], [1751, 1753], [1707, 1752, 1754], [1753, 1755], [1754, 1756, 1882], [1755, 1757], [1708, 1756, 1758], [1757, 1759], [1758, 1760, 1883], [1759, 1761], [1709, 1760, 1762], [1761, 1763], [1762, 1764, 1884], [1763, 1765], [1710, 1764, 1766], [1765, 1767], [1766, 1768, 1885], [1767, 1769], [1711, 1768, 1770], [1769, 1771], [1770, 1772, 1886], [1771, 1773], [1712, 1772, 1774], [1773, 1775], [1774, 1776, 1887], [1775, 1777], [1713, 1776, 1778], [1777, 1779], [1778, 1780, 1888], [1779, 1781], [1714, 1780, 1782], [1781, 1783], [1782, 1784, 1889], [1783, 1785], [1715, 1784, 1786], [1785, 1787], [1786, 1788, 1890], [1787, 1789], [1716, 1788, 1790], [1789, 1791], [1790, 1792, 1891], [1791, 1793], [1717, 1792, 1794], [1793, 1795], [1794, 1796, 1892], [1795, 1797], [1718, 1796, 1798], [1797, 1799], [1798, 1800, 1893], [1799, 1801], [1719, 1800, 1802], [1801, 1803], [1802, 1804, 1894], [1803, 1805], [1720, 1804, 1806], [1805, 1807], [1806, 1808, 1895], [1807, 1809], [1721, 1808, 1810], [1809, 1811], [1810, 1812, 1896], [1811, 1813], [1722, 1812, 1814], [1813, 1815], [1814, 1816, 1897], [1815, 1817], [1723, 1816, 1818], [1817, 1819], [1818, 1820, 1898], [1819, 1821], [1724, 1820, 1822], [1821, 1823], [1822, 1824, 1899], [1823, 1825], [1725, 1824, 1826], [1825, 1827], [1826, 1828, 1900], [1827, 1829], [1726, 1828, 1830], [1829, 1831], [1830, 1832, 1901], [1831, 1833], [1727, 1832, 1834], [1833, 1835], [1834, 1836, 1902], [1835, 1837], [1728, 1836, 1838], [1837, 1839], [1838, 1840, 1903], [1839, 1841], [1729, 1840, 1842], [1841, 1843], [1842, 1844, 1904], [1843, 1845], [1730, 1844, 1846], [1845, 1847], [1846, 1848, 1905], [1847, 1849], [1731, 1848, 1850], [1849, 1851], [1850, 1852, 1906], [1851, 1853], [1732, 1852, 1854], [1853, 1855], [1854, 1856, 1907], [1855, 1857], [1733, 1856, 1858], [1857, 1859], [1858, 1860, 1908], [1859, 1861], [1734, 1860, 1862], [1861, 1863], [1862, 1864, 1909], [1863, 1865], [1735, 1864, 1866], [1865, 1867], [1866, 1868, 1910], [1867, 1869], [1736, 1868, 1870], [1869, 1871], [1870, 1872, 1911], [1871, 1873], [1737, 1872, 1874], [1873, 1875], [1874, 1876, 1912], [1875, 1877], [1738, 1876], [1739, 1913], [1743, 1917], [1747, 1921], [1751, 1925], [1755, 1929], [1759, 1933], [1763, 1937], [1767, 1941], [1771, 1945], [1775, 1949], [1779, 1953], [1783, 1957], [1787, 1961], [1791, 1965], [1795, 1969], [1799, 1973], [1803, 1977], [1807, 1981], [1811, 1985], [1815, 1989], [1819, 1993], [1823, 1997], [1827, 2001], [1831, 2005], [1835, 2009], [1839, 2013], [1843, 2017], [1847, 2021], [1851, 2025], [1855, 2029], [1859, 2033], [1863, 2037], [1867, 2041], [1871, 2045], [1875, 2049], [1878, 1914], [1913, 1915], [1914, 1916, 2052], [1915, 1917], [1879, 1916, 1918], [1917, 1919], [1918, 1920, 2053], [1919, 1921], [1880, 1920, 1922], [1921, 1923], [1922, 1924, 2054], [1923, 1925], [1881, 1924, 1926], [1925, 1927], [1926, 1928, 2055], [1927, 1929], [1882, 1928, 1930], [1929, 1931], [1930, 1932, 2056], [1931, 1933], [1883, 1932, 1934], [1933, 1935], [1934, 1936, 2057], [1935, 1937], [1884, 1936, 1938], [1937, 1939], [1938, 1940, 2058], [1939, 1941], [1885, 1940, 1942], [1941, 1943], [1942, 1944, 2059], [1943, 1945], [1886, 1944, 1946], [1945, 1947], [1946, 1948, 2060], [1947, 1949], [1887, 1948, 1950], [1949, 1951], [1950, 1952, 2061], [1951, 1953], [1888, 1952, 1954], [1953, 1955], [1954, 1956, 2062], [1955, 1957], [1889, 1956, 1958], [1957, 1959], [1958, 1960, 2063], [1959, 1961], [1890, 1960, 1962], [1961, 1963], [1962, 1964, 2064], [1963, 1965], [1891, 1964, 1966], [1965, 1967], [1966, 1968, 2065], [1967, 1969], [1892, 1968, 1970], [1969, 1971], [1970, 1972, 2066], [1971, 1973], [1893, 1972, 1974], [1973, 1975], [1974, 1976, 2067], [1975, 1977], [1894, 1976, 1978], [1977, 1979], [1978, 1980, 2068], [1979, 1981], [1895, 1980, 1982], [1981, 1983], [1982, 1984, 2069], [1983, 1985], [1896, 1984, 1986], [1985, 1987], [1986, 1988, 2070], [1987, 1989], [1897, 1988, 1990], [1989, 1991], [1990, 1992, 2071], [1991, 1993], [1898, 1992, 1994], [1993, 1995], [1994, 1996, 2072], [1995, 1997], [1899, 1996, 1998], [1997, 1999], [1998, 2000, 2073], [1999, 2001], [1900, 2000, 2002], [2001, 2003], [2002, 2004, 2074], [2003, 2005], [1901, 2004, 2006], [2005, 2007], [2006, 2008, 2075], [2007, 2009], [1902, 2008, 2010], [2009, 2011], [2010, 2012, 2076], [2011, 2013], [1903, 2012, 2014], [2013, 2015], [2014, 2016, 2077], [2015, 2017], [1904, 2016, 2018], [2017, 2019], [2018, 2020, 2078], [2019, 2021], [1905, 2020, 2022], [2021, 2023], [2022, 2024, 2079], [2023, 2025], [1906, 2024, 2026], [2025, 2027], [2026, 2028, 2080], [2027, 2029], [1907, 2028, 2030], [2029, 2031], [2030, 2032, 2081], [2031, 2033], [1908, 2032, 2034], [2033, 2035], [2034, 2036, 2082], [2035, 2037], [1909, 2036, 2038], [2037, 2039], [2038, 2040, 2083], [2039, 2041], [1910, 2040, 2042], [2041, 2043], [2042, 2044, 2084], [2043, 2045], [1911, 2044, 2046], [2045, 2047], [2046, 2048, 2085], [2047, 2049], [1912, 2048, 2050], [2049, 2051], [2050, 2086], [1915, 2089], [1919, 2093], [1923, 2097], [1927, 2101], [1931, 2105], [1935, 2109], [1939, 2113], [1943, 2117], [1947, 2121], [1951, 2125], [1955, 2129], [1959, 2133], [1963, 2137], [1967, 2141], [1971, 2145], [1975, 2149], [1979, 2153], [1983, 2157], [1987, 2161], [1991, 2165], [1995, 2169], [1999, 2173], [2003, 2177], [2007, 2181], [2011, 2185], [2015, 2189], [2019, 2193], [2023, 2197], [2027, 2201], [2031, 2205], [2035, 2209], [2039, 2213], [2043, 2217], [2047, 2221], [2051, 2225], [2088, 2226], [2087, 2089], [2052, 2088, 2090], [2089, 2091], [2090, 2092, 2227], [2091, 2093], [2053, 2092, 2094], [2093, 2095], [2094, 2096, 2228], [2095, 2097], [2054, 2096, 2098], [2097, 2099], [2098, 2100, 2229], [2099, 2101], [2055, 2100, 2102], [2101, 2103], [2102, 2104, 2230], [2103, 2105], [2056, 2104, 2106], [2105, 2107], [2106, 2108, 2231], [2107, 2109], [2057, 2108, 2110], [2109, 2111], [2110, 2112, 2232], [2111, 2113], [2058, 2112, 2114], [2113, 2115], [2114, 2116, 2233], [2115, 2117], [2059, 2116, 2118], [2117, 2119], [2118, 2120, 2234], [2119, 2121], [2060, 2120, 2122], [2121, 2123], [2122, 2124, 2235], [2123, 2125], [2061, 2124, 2126], [2125, 2127], [2126, 2128, 2236], [2127, 2129], [2062, 2128, 2130], [2129, 2131], [2130, 2132, 2237], [2131, 2133], [2063, 2132, 2134], [2133, 2135], [2134, 2136, 2238], [2135, 2137], [2064, 2136, 2138], [2137, 2139], [2138, 2140, 2239], [2139, 2141], [2065, 2140, 2142], [2141, 2143], [2142, 2144, 2240], [2143, 2145], [2066, 2144, 2146], [2145, 2147], [2146, 2148, 2241], [2147, 2149], [2067, 2148, 2150], [2149, 2151], [2150, 2152, 2242], [2151, 2153], [2068, 2152, 2154], [2153, 2155], [2154, 2156, 2243], [2155, 2157], [2069, 2156, 2158], [2157, 2159], [2158, 2160, 2244], [2159, 2161], [2070, 2160, 2162], [2161, 2163], [2162, 2164, 2245], [2163, 2165], [2071, 2164, 2166], [2165, 2167], [2166, 2168, 2246], [2167, 2169], [2072, 2168, 2170], [2169, 2171], [2170, 2172, 2247], [2171, 2173], [2073, 2172, 2174], [2173, 2175], [2174, 2176, 2248], [2175, 2177], [2074, 2176, 2178], [2177, 2179], [2178, 2180, 2249], [2179, 2181], [2075, 2180, 2182], [2181, 2183], [2182, 2184, 2250], [2183, 2185], [2076, 2184, 2186], [2185, 2187], [2186, 2188, 2251], [2187, 2189], [2077, 2188, 2190], [2189, 2191], [2190, 2192, 2252], [2191, 2193], [2078, 2192, 2194], [2193, 2195], [2194, 2196, 2253], [2195, 2197], [2079, 2196, 2198], [2197, 2199], [2198, 2200, 2254], [2199, 2201], [2080, 2200, 2202], [2201, 2203], [2202, 2204, 2255], [2203, 2205], [2081, 2204, 2206], [2205, 2207], [2206, 2208, 2256], [2207, 2209], [2082, 2208, 2210], [2209, 2211], [2210, 2212, 2257], [2211, 2213], [2083, 2212, 2214], [2213, 2215], [2214, 2216, 2258], [2215, 2217], [2084, 2216, 2218], [2217, 2219], [2218, 2220, 2259], [2219, 2221], [2085, 2220, 2222], [2221, 2223], [2222, 2224, 2260], [2223, 2225], [2086, 2224], [2087, 2261], [2091, 2265], [2095, 2269], [2099, 2273], [2103, 2277], [2107, 2281], [2111, 2285], [2115, 2289], [2119, 2293], [2123, 2297], [2127, 2301], [2131, 2305], [2135, 2309], [2139, 2313], [2143, 2317], [2147, 2321], [2151, 2325], [2155, 2329], [2159, 2333], [2163, 2337], [2167, 2341], [2171, 2345], [2175, 2349], [2179, 2353], [2183, 2357], [2187, 2361], [2191, 2365], [2195, 2369], [2199, 2373], [2203, 2377], [2207, 2381], [2211, 2385], [2215, 2389], [2219, 2393], [2223, 2397], [2226, 2262], [2261, 2263], [2262, 2264, 2400], [2263, 2265], [2227, 2264, 2266], [2265, 2267], [2266, 2268, 2401], [2267, 2269], [2228, 2268, 2270], [2269, 2271], [2270, 2272, 2402], [2271, 2273], [2229, 2272, 2274], [2273, 2275], [2274, 2276, 2403], [2275, 2277], [2230, 2276, 2278], [2277, 2279], [2278, 2280, 2404], [2279, 2281], [2231, 2280, 2282], [2281, 2283], [2282, 2284, 2405], [2283, 2285], [2232, 2284, 2286], [2285, 2287], [2286, 2288, 2406], [2287, 2289], [2233, 2288, 2290], [2289, 2291], [2290, 2292, 2407], [2291, 2293], [2234, 2292, 2294], [2293, 2295], [2294, 2296, 2408], [2295, 2297], [2235, 2296, 2298], [2297, 2299], [2298, 2300, 2409], [2299, 2301], [2236, 2300, 2302], [2301, 2303], [2302, 2304, 2410], [2303, 2305], [2237, 2304, 2306], [2305, 2307], [2306, 2308, 2411], [2307, 2309], [2238, 2308, 2310], [2309, 2311], [2310, 2312, 2412], [2311, 2313], [2239, 2312, 2314], [2313, 2315], [2314, 2316, 2413], [2315, 2317], [2240, 2316, 2318], [2317, 2319], [2318, 2320, 2414], [2319, 2321], [2241, 2320, 2322], [2321, 2323], [2322, 2324, 2415], [2323, 2325], [2242, 2324, 2326], [2325, 2327], [2326, 2328, 2416], [2327, 2329], [2243, 2328, 2330], [2329, 2331], [2330, 2332, 2417], [2331, 2333], [2244, 2332, 2334], [2333, 2335], [2334, 2336, 2418], [2335, 2337], [2245, 2336, 2338], [2337, 2339], [2338, 2340, 2419], [2339, 2341], [2246, 2340, 2342], [2341, 2343], [2342, 2344, 2420], [2343, 2345], [2247, 2344, 2346], [2345, 2347], [2346, 2348, 2421], [2347, 2349], [2248, 2348, 2350], [2349, 2351], [2350, 2352, 2422], [2351, 2353], [2249, 2352, 2354], [2353, 2355], [2354, 2356, 2423], [2355, 2357], [2250, 2356, 2358], [2357, 2359], [2358, 2360, 2424], [2359, 2361], [2251, 2360, 2362], [2361, 2363], [2362, 2364, 2425], [2363, 2365], [2252, 2364, 2366], [2365, 2367], [2366, 2368, 2426], [2367, 2369], [2253, 2368, 2370], [2369, 2371], [2370, 2372, 2427], [2371, 2373], [2254, 2372, 2374], [2373, 2375], [2374, 2376, 2428], [2375, 2377], [2255, 2376, 2378], [2377, 2379], [2378, 2380, 2429], [2379, 2381], [2256, 2380, 2382], [2381, 2383], [2382, 2384, 2430], [2383, 2385], [2257, 2384, 2386], [2385, 2387], [2386, 2388, 2431], [2387, 2389], [2258, 2388, 2390], [2389, 2391], [2390, 2392, 2432], [2391, 2393], [2259, 2392, 2394], [2393, 2395], [2394, 2396, 2433], [2395, 2397], [2260, 2396, 2398], [2397, 2399], [2398, 2434], [2263, 2437], [2267, 2441], [2271, 2445], [2275, 2449], [2279, 2453], [2283, 2457], [2287, 2461], [2291, 2465], [2295, 2469], [2299, 2473], [2303, 2477], [2307, 2481], [2311, 2485], [2315, 2489], [2319, 2493], [2323, 2497], [2327, 2501], [2331, 2505], [2335, 2509], [2339, 2513], [2343, 2517], [2347, 2521], [2351, 2525], [2355, 2529], [2359, 2533], [2363, 2537], [2367, 2541], [2371, 2545], [2375, 2549], [2379, 2553], [2383, 2557], [2387, 2561], [2391, 2565], [2395, 2569], [2399, 2573], [2436, 2574], [2435, 2437], [2400, 2436, 2438], [2437, 2439], [2438, 2440, 2575], [2439, 2441], [2401, 2440, 2442], [2441, 2443], [2442, 2444, 2576], [2443, 2445], [2402, 2444, 2446], [2445, 2447], [2446, 2448, 2577], [2447, 2449], [2403, 2448, 2450], [2449, 2451], [2450, 2452, 2578], [2451, 2453], [2404, 2452, 2454], [2453, 2455], [2454, 2456, 2579], [2455, 2457], [2405, 2456, 2458], [2457, 2459], [2458, 2460, 2580], [2459, 2461], [2406, 2460, 2462], [2461, 2463], [2462, 2464, 2581], [2463, 2465], [2407, 2464, 2466], [2465, 2467], [2466, 2468, 2582], [2467, 2469], [2408, 2468, 2470], [2469, 2471], [2470, 2472, 2583], [2471, 2473], [2409, 2472, 2474], [2473, 2475], [2474, 2476, 2584], [2475, 2477], [2410, 2476, 2478], [2477, 2479], [2478, 2480, 2585], [2479, 2481], [2411, 2480, 2482], [2481, 2483], [2482, 2484, 2586], [2483, 2485], [2412, 2484, 2486], [2485, 2487], [2486, 2488, 2587], [2487, 2489], [2413, 2488, 2490], [2489, 2491], [2490, 2492, 2588], [2491, 2493], [2414, 2492, 2494], [2493, 2495], [2494, 2496, 2589], [2495, 2497], [2415, 2496, 2498], [2497, 2499], [2498, 2500, 2590], [2499, 2501], [2416, 2500, 2502], [2501, 2503], [2502, 2504, 2591], [2503, 2505], [2417, 2504, 2506], [2505, 2507], [2506, 2508, 2592], [2507, 2509], [2418, 2508, 2510], [2509, 2511], [2510, 2512, 2593], [2511, 2513], [2419, 2512, 2514], [2513, 2515], [2514, 2516, 2594], [2515, 2517], [2420, 2516, 2518], [2517, 2519], [2518, 2520, 2595], [2519, 2521], [2421, 2520, 2522], [2521, 2523], [2522, 2524, 2596], [2523, 2525], [2422, 2524, 2526], [2525, 2527], [2526, 2528, 2597], [2527, 2529], [2423, 2528, 2530], [2529, 2531], [2530, 2532, 2598], [2531, 2533], [2424, 2532, 2534], [2533, 2535], [2534, 2536, 2599], [2535, 2537], [2425, 2536, 2538], [2537, 2539], [2538, 2540, 2600], [2539, 2541], [2426, 2540, 2542], [2541, 2543], [2542, 2544, 2601], [2543, 2545], [2427, 2544, 2546], [2545, 2547], [2546, 2548, 2602], [2547, 2549], [2428, 2548, 2550], [2549, 2551], [2550, 2552, 2603], [2551, 2553], [2429, 2552, 2554], [2553, 2555], [2554, 2556, 2604], [2555, 2557], [2430, 2556, 2558], [2557, 2559], [2558, 2560, 2605], [2559, 2561], [2431, 2560, 2562], [2561, 2563], [2562, 2564, 2606], [2563, 2565], [2432, 2564, 2566], [2565, 2567], [2566, 2568, 2607], [2567, 2569], [2433, 2568, 2570], [2569, 2571], [2570, 2572, 2608], [2571, 2573], [2434, 2572], [2435, 2609], [2439, 2613], [2443, 2617], [2447, 2621], [2451, 2625], [2455, 2629], [2459, 2633], [2463, 2637], [2467, 2641], [2471, 2645], [2475, 2649], [2479, 2653], [2483, 2657], [2487, 2661], [2491, 2665], [2495, 2669], [2499, 2673], [2503, 2677], [2507, 2681], [2511, 2685], [2515, 2689], [2519, 2693], [2523, 2697], [2527, 2701], [2531, 2705], [2535, 2709], [2539, 2713], [2543, 2717], [2547, 2721], [2551, 2725], [2555, 2729], [2559, 2733], [2563, 2737], [2567, 2741], [2571, 2745], [2574, 2610], [2609, 2611], [2610, 2612, 2748], [2611, 2613], [2575, 2612, 2614], [2613, 2615], [2614, 2616, 2749], [2615, 2617], [2576, 2616, 2618], [2617, 2619], [2618, 2620, 2750], [2619, 2621], [2577, 2620, 2622], [2621, 2623], [2622, 2624, 2751], [2623, 2625], [2578, 2624, 2626], [2625, 2627], [2626, 2628, 2752], [2627, 2629], [2579, 2628, 2630], [2629, 2631], [2630, 2632, 2753], [2631, 2633], [2580, 2632, 2634], [2633, 2635], [2634, 2636, 2754], [2635, 2637], [2581, 2636, 2638], [2637, 2639], [2638, 2640, 2755], [2639, 2641], [2582, 2640, 2642], [2641, 2643], [2642, 2644, 2756], [2643, 2645], [2583, 2644, 2646], [2645, 2647], [2646, 2648, 2757], [2647, 2649], [2584, 2648, 2650], [2649, 2651], [2650, 2652, 2758], [2651, 2653], [2585, 2652, 2654], [2653, 2655], [2654, 2656, 2759], [2655, 2657], [2586, 2656, 2658], [2657, 2659], [2658, 2660, 2760], [2659, 2661], [2587, 2660, 2662], [2661, 2663], [2662, 2664, 2761], [2663, 2665], [2588, 2664, 2666], [2665, 2667], [2666, 2668, 2762], [2667, 2669], [2589, 2668, 2670], [2669, 2671], [2670, 2672, 2763], [2671, 2673], [2590, 2672, 2674], [2673, 2675], [2674, 2676, 2764], [2675, 2677], [2591, 2676, 2678], [2677, 2679], [2678, 2680, 2765], [2679, 2681], [2592, 2680, 2682], [2681, 2683], [2682, 2684, 2766], [2683, 2685], [2593, 2684, 2686], [2685, 2687], [2686, 2688, 2767], [2687, 2689], [2594, 2688, 2690], [2689, 2691], [2690, 2692, 2768], [2691, 2693], [2595, 2692, 2694], [2693, 2695], [2694, 2696, 2769], [2695, 2697], [2596, 2696, 2698], [2697, 2699], [2698, 2700, 2770], [2699, 2701], [2597, 2700, 2702], [2701, 2703], [2702, 2704, 2771], [2703, 2705], [2598, 2704, 2706], [2705, 2707], [2706, 2708, 2772], [2707, 2709], [2599, 2708, 2710], [2709, 2711], [2710, 2712, 2773], [2711, 2713], [2600, 2712, 2714], [2713, 2715], [2714, 2716, 2774], [2715, 2717], [2601, 2716, 2718], [2717, 2719], [2718, 2720, 2775], [2719, 2721], [2602, 2720, 2722], [2721, 2723], [2722, 2724, 2776], [2723, 2725], [2603, 2724, 2726], [2725, 2727], [2726, 2728, 2777], [2727, 2729], [2604, 2728, 2730], [2729, 2731], [2730, 2732, 2778], [2731, 2733], [2605, 2732, 2734], [2733, 2735], [2734, 2736, 2779], [2735, 2737], [2606, 2736, 2738], [2737, 2739], [2738, 2740, 2780], [2739, 2741], [2607, 2740, 2742], [2741, 2743], [2742, 2744, 2781], [2743, 2745], [2608, 2744, 2746], [2745, 2747], [2746, 2782], [2611, 2785], [2615, 2789], [2619, 2793], [2623, 2797], [2627, 2801], [2631, 2805], [2635, 2809], [2639, 2813], [2643, 2817], [2647, 2821], [2651, 2825], [2655, 2829], [2659, 2833], [2663, 2837], [2667, 2841], [2671, 2845], [2675, 2849], [2679, 2853], [2683, 2857], [2687, 2861], [2691, 2865], [2695, 2869], [2699, 2873], [2703, 2877], [2707, 2881], [2711, 2885], [2715, 2889], [2719, 2893], [2723, 2897], [2727, 2901], [2731, 2905], [2735, 2909], [2739, 2913], [2743, 2917], [2747, 2921], [2784, 2922], [2783, 2785], [2748, 2784, 2786], [2785, 2787], [2786, 2788, 2923], [2787, 2789], [2749, 2788, 2790], [2789, 2791], [2790, 2792, 2924], [2791, 2793], [2750, 2792, 2794], [2793, 2795], [2794, 2796, 2925], [2795, 2797], [2751, 2796, 2798], [2797, 2799], [2798, 2800, 2926], [2799, 2801], [2752, 2800, 2802], [2801, 2803], [2802, 2804, 2927], [2803, 2805], [2753, 2804, 2806], [2805, 2807], [2806, 2808, 2928], [2807, 2809], [2754, 2808, 2810], [2809, 2811], [2810, 2812, 2929], [2811, 2813], [2755, 2812, 2814], [2813, 2815], [2814, 2816, 2930], [2815, 2817], [2756, 2816, 2818], [2817, 2819], [2818, 2820, 2931], [2819, 2821], [2757, 2820, 2822], [2821, 2823], [2822, 2824, 2932], [2823, 2825], [2758, 2824, 2826], [2825, 2827], [2826, 2828, 2933], [2827, 2829], [2759, 2828, 2830], [2829, 2831], [2830, 2832, 2934], [2831, 2833], [2760, 2832, 2834], [2833, 2835], [2834, 2836, 2935], [2835, 2837], [2761, 2836, 2838], [2837, 2839], [2838, 2840, 2936], [2839, 2841], [2762, 2840, 2842], [2841, 2843], [2842, 2844, 2937], [2843, 2845], [2763, 2844, 2846], [2845, 2847], [2846, 2848, 2938], [2847, 2849], [2764, 2848, 2850], [2849, 2851], [2850, 2852, 2939], [2851, 2853], [2765, 2852, 2854], [2853, 2855], [2854, 2856, 2940], [2855, 2857], [2766, 2856, 2858], [2857, 2859], [2858, 2860, 2941], [2859, 2861], [2767, 2860, 2862], [2861, 2863], [2862, 2864, 2942], [2863, 2865], [2768, 2864, 2866], [2865, 2867], [2866, 2868, 2943], [2867, 2869], [2769, 2868, 2870], [2869, 2871], [2870, 2872, 2944], [2871, 2873], [2770, 2872, 2874], [2873, 2875], [2874, 2876, 2945], [2875, 2877], [2771, 2876, 2878], [2877, 2879], [2878, 2880, 2946], [2879, 2881], [2772, 2880, 2882], [2881, 2883], [2882, 2884, 2947], [2883, 2885], [2773, 2884, 2886], [2885, 2887], [2886, 2888, 2948], [2887, 2889], [2774, 2888, 2890], [2889, 2891], [2890, 2892, 2949], [2891, 2893], [2775, 2892, 2894], [2893, 2895], [2894, 2896, 2950], [2895, 2897], [2776, 2896, 2898], [2897, 2899], [2898, 2900, 2951], [2899, 2901], [2777, 2900, 2902], [2901, 2903], [2902, 2904, 2952], [2903, 2905], [2778, 2904, 2906], [2905, 2907], [2906, 2908, 2953], [2907, 2909], [2779, 2908, 2910], [2909, 2911], [2910, 2912, 2954], [2911, 2913], [2780, 2912, 2914], [2913, 2915], [2914, 2916, 2955], [2915, 2917], [2781, 2916, 2918], [2917, 2919], [2918, 2920, 2956], [2919, 2921], [2782, 2920], [2783, 2957], [2787, 2961], [2791, 2965], [2795, 2969], [2799, 2973], [2803, 2977], [2807, 2981], [2811, 2985], [2815, 2989], [2819, 2993], [2823, 2997], [2827, 3001], [2831, 3005], [2835, 3009], [2839, 3013], [2843, 3017], [2847, 3021], [2851, 3025], [2855, 3029], [2859, 3033], [2863, 3037], [2867, 3041], [2871, 3045], [2875, 3049], [2879, 3053], [2883, 3057], [2887, 3061], [2891, 3065], [2895, 3069], [2899, 3073], [2903, 3077], [2907, 3081], [2911, 3085], [2915, 3089], [2919, 3093], [2922, 2958], [2957, 2959], [2958, 2960, 3096], [2959, 2961], [2923, 2960, 2962], [2961, 2963], [2962, 2964, 3097], [2963, 2965], [2924, 2964, 2966], [2965, 2967], [2966, 2968, 3098], [2967, 2969], [2925, 2968, 2970], [2969, 2971], [2970, 2972, 3099], [2971, 2973], [2926, 2972, 2974], [2973, 2975], [2974, 2976, 3100], [2975, 2977], [2927, 2976, 2978], [2977, 2979], [2978, 2980, 3101], [2979, 2981], [2928, 2980, 2982], [2981, 2983], [2982, 2984, 3102], [2983, 2985], [2929, 2984, 2986], [2985, 2987], [2986, 2988, 3103], [2987, 2989], [2930, 2988, 2990], [2989, 2991], [2990, 2992, 3104], [2991, 2993], [2931, 2992, 2994], [2993, 2995], [2994, 2996, 3105], [2995, 2997], [2932, 2996, 2998], [2997, 2999], [2998, 3000, 3106], [2999, 3001], [2933, 3000, 3002], [3001, 3003], [3002, 3004, 3107], [3003, 3005], [2934, 3004, 3006], [3005, 3007], [3006, 3008, 3108], [3007, 3009], [2935, 3008, 3010], [3009, 3011], [3010, 3012, 3109], [3011, 3013], [2936, 3012, 3014], [3013, 3015], [3014, 3016, 3110], [3015, 3017], [2937, 3016, 3018], [3017, 3019], [3018, 3020, 3111], [3019, 3021], [2938, 3020, 3022], [3021, 3023], [3022, 3024, 3112], [3023, 3025], [2939, 3024, 3026], [3025, 3027], [3026, 3028, 3113], [3027, 3029], [2940, 3028, 3030], [3029, 3031], [3030, 3032, 3114], [3031, 3033], [2941, 3032, 3034], [3033, 3035], [3034, 3036, 3115], [3035, 3037], [2942, 3036, 3038], [3037, 3039], [3038, 3040, 3116], [3039, 3041], [2943, 3040, 3042], [3041, 3043], [3042, 3044, 3117], [3043, 3045], [2944, 3044, 3046], [3045, 3047], [3046, 3048, 3118], [3047, 3049], [2945, 3048, 3050], [3049, 3051], [3050, 3052, 3119], [3051, 3053], [2946, 3052, 3054], [3053, 3055], [3054, 3056, 3120], [3055, 3057], [2947, 3056, 3058], [3057, 3059], [3058, 3060, 3121], [3059, 3061], [2948, 3060, 3062], [3061, 3063], [3062, 3064, 3122], [3063, 3065], [2949, 3064, 3066], [3065, 3067], [3066, 3068, 3123], [3067, 3069], [2950, 3068, 3070], [3069, 3071], [3070, 3072, 3124], [3071, 3073], [2951, 3072, 3074], [3073, 3075], [3074, 3076, 3125], [3075, 3077], [2952, 3076, 3078], [3077, 3079], [3078, 3080, 3126], [3079, 3081], [2953, 3080, 3082], [3081, 3083], [3082, 3084, 3127], [3083, 3085], [2954, 3084, 3086], [3085, 3087], [3086, 3088, 3128], [3087, 3089], [2955, 3088, 3090], [3089, 3091], [3090, 3092, 3129], [3091, 3093], [2956, 3092, 3094], [3093, 3095], [3094, 3130], [2959, 3133], [2963, 3137], [2967, 3141], [2971, 3145], [2975, 3149], [2979, 3153], [2983, 3157], [2987, 3161], [2991, 3165], [2995, 3169], [2999, 3173], [3003, 3177], [3007, 3181], [3011, 3185], [3015, 3189], [3019, 3193], [3023, 3197], [3027, 3201], [3031, 3205], [3035, 3209], [3039, 3213], [3043, 3217], [3047, 3221], [3051, 3225], [3055, 3229], [3059, 3233], [3063, 3237], [3067, 3241], [3071, 3245], [3075, 3249], [3079, 3253], [3083, 3257], [3087, 3261], [3091, 3265], [3095, 3269], [3132, 3270], [3131, 3133], [3096, 3132, 3134], [3133, 3135], [3134, 3136, 3271], [3135, 3137], [3097, 3136, 3138], [3137, 3139], [3138, 3140, 3272], [3139, 3141], [3098, 3140, 3142], [3141, 3143], [3142, 3144, 3273], [3143, 3145], [3099, 3144, 3146], [3145, 3147], [3146, 3148, 3274], [3147, 3149], [3100, 3148, 3150], [3149, 3151], [3150, 3152, 3275], [3151, 3153], [3101, 3152, 3154], [3153, 3155], [3154, 3156, 3276], [3155, 3157], [3102, 3156, 3158], [3157, 3159], [3158, 3160, 3277], [3159, 3161], [3103, 3160, 3162], [3161, 3163], [3162, 3164, 3278], [3163, 3165], [3104, 3164, 3166], [3165, 3167], [3166, 3168, 3279], [3167, 3169], [3105, 3168, 3170], [3169, 3171], [3170, 3172, 3280], [3171, 3173], [3106, 3172, 3174], [3173, 3175], [3174, 3176, 3281], [3175, 3177], [3107, 3176, 3178], [3177, 3179], [3178, 3180, 3282], [3179, 3181], [3108, 3180, 3182], [3181, 3183], [3182, 3184, 3283], [3183, 3185], [3109, 3184, 3186], [3185, 3187], [3186, 3188, 3284], [3187, 3189], [3110, 3188, 3190], [3189, 3191], [3190, 3192, 3285], [3191, 3193], [3111, 3192, 3194], [3193, 3195], [3194, 3196, 3286], [3195, 3197], [3112, 3196, 3198], [3197, 3199], [3198, 3200, 3287], [3199, 3201], [3113, 3200, 3202], [3201, 3203], [3202, 3204, 3288], [3203, 3205], [3114, 3204, 3206], [3205, 3207], [3206, 3208, 3289], [3207, 3209], [3115, 3208, 3210], [3209, 3211], [3210, 3212, 3290], [3211, 3213], [3116, 3212, 3214], [3213, 3215], [3214, 3216, 3291], [3215, 3217], [3117, 3216, 3218], [3217, 3219], [3218, 3220, 3292], [3219, 3221], [3118, 3220, 3222], [3221, 3223], [3222, 3224, 3293], [3223, 3225], [3119, 3224, 3226], [3225, 3227], [3226, 3228, 3294], [3227, 3229], [3120, 3228, 3230], [3229, 3231], [3230, 3232, 3295], [3231, 3233], [3121, 3232, 3234], [3233, 3235], [3234, 3236, 3296], [3235, 3237], [3122, 3236, 3238], [3237, 3239], [3238, 3240, 3297], [3239, 3241], [3123, 3240, 3242], [3241, 3243], [3242, 3244, 3298], [3243, 3245], [3124, 3244, 3246], [3245, 3247], [3246, 3248, 3299], [3247, 3249], [3125, 3248, 3250], [3249, 3251], [3250, 3252, 3300], [3251, 3253], [3126, 3252, 3254], [3253, 3255], [3254, 3256, 3301], [3255, 3257], [3127, 3256, 3258], [3257, 3259], [3258, 3260, 3302], [3259, 3261], [3128, 3260, 3262], [3261, 3263], [3262, 3264, 3303], [3263, 3265], [3129, 3264, 3266], [3265, 3267], [3266, 3268, 3304], [3267, 3269], [3130, 3268], [3131, 3305], [3135, 3309], [3139, 3313], [3143, 3317], [3147, 3321], [3151, 3325], [3155, 3329], [3159, 3333], [3163, 3337], [3167, 3341], [3171, 3345], [3175, 3349], [3179, 3353], [3183, 3357], [3187, 3361], [3191, 3365], [3195, 3369], [3199, 3373], [3203, 3377], [3207, 3381], [3211, 3385], [3215, 3389], [3219, 3393], [3223, 3397], [3227, 3401], [3231, 3405], [3235, 3409], [3239, 3413], [3243, 3417], [3247, 3421], [3251, 3425], [3255, 3429], [3259, 3433], [3263, 3437], [3267, 3441], [3270, 3306], [3305, 3307], [3306, 3308, 3444], [3307, 3309], [3271, 3308, 3310], [3309, 3311], [3310, 3312, 3445], [3311, 3313], [3272, 3312, 3314], [3313, 3315], [3314, 3316, 3446], [3315, 3317], [3273, 3316, 3318], [3317, 3319], [3318, 3320, 3447], [3319, 3321], [3274, 3320, 3322], [3321, 3323], [3322, 3324, 3448], [3323, 3325], [3275, 3324, 3326], [3325, 3327], [3326, 3328, 3449], [3327, 3329], [3276, 3328, 3330], [3329, 3331], [3330, 3332, 3450], [3331, 3333], [3277, 3332, 3334], [3333, 3335], [3334, 3336, 3451], [3335, 3337], [3278, 3336, 3338], [3337, 3339], [3338, 3340, 3452], [3339, 3341], [3279, 3340, 3342], [3341, 3343], [3342, 3344, 3453], [3343, 3345], [3280, 3344, 3346], [3345, 3347], [3346, 3348, 3454], [3347, 3349], [3281, 3348, 3350], [3349, 3351], [3350, 3352, 3455], [3351, 3353], [3282, 3352, 3354], [3353, 3355], [3354, 3356, 3456], [3355, 3357], [3283, 3356, 3358], [3357, 3359], [3358, 3360, 3457], [3359, 3361], [3284, 3360, 3362], [3361, 3363], [3362, 3364, 3458], [3363, 3365], [3285, 3364, 3366], [3365, 3367], [3366, 3368, 3459], [3367, 3369], [3286, 3368, 3370], [3369, 3371], [3370, 3372, 3460], [3371, 3373], [3287, 3372, 3374], [3373, 3375], [3374, 3376, 3461], [3375, 3377], [3288, 3376, 3378], [3377, 3379], [3378, 3380, 3462], [3379, 3381], [3289, 3380, 3382], [3381, 3383], [3382, 3384, 3463], [3383, 3385], [3290, 3384, 3386], [3385, 3387], [3386, 3388, 3464], [3387, 3389], [3291, 3388, 3390], [3389, 3391], [3390, 3392, 3465], [3391, 3393], [3292, 3392, 3394], [3393, 3395], [3394, 3396, 3466], [3395, 3397], [3293, 3396, 3398], [3397, 3399], [3398, 3400, 3467], [3399, 3401], [3294, 3400, 3402], [3401, 3403], [3402, 3404, 3468], [3403, 3405], [3295, 3404, 3406], [3405, 3407], [3406, 3408, 3469], [3407, 3409], [3296, 3408, 3410], [3409, 3411], [3410, 3412, 3470], [3411, 3413], [3297, 3412, 3414], [3413, 3415], [3414, 3416, 3471], [3415, 3417], [3298, 3416, 3418], [3417, 3419], [3418, 3420, 3472], [3419, 3421], [3299, 3420, 3422], [3421, 3423], [3422, 3424, 3473], [3423, 3425], [3300, 3424, 3426], [3425, 3427], [3426, 3428, 3474], [3427, 3429], [3301, 3428, 3430], [3429, 3431], [3430, 3432, 3475], [3431, 3433], [3302, 3432, 3434], [3433, 3435], [3434, 3436, 3476], [3435, 3437], [3303, 3436, 3438], [3437, 3439], [3438, 3440, 3477], [3439, 3441], [3304, 3440, 3442], [3441, 3443], [3442, 3478], [3307, 3481], [3311, 3485], [3315, 3489], [3319, 3493], [3323, 3497], [3327, 3501], [3331, 3505], [3335, 3509], [3339, 3513], [3343, 3517], [3347, 3521], [3351, 3525], [3355, 3529], [3359, 3533], [3363, 3537], [3367, 3541], [3371, 3545], [3375, 3549], [3379, 3553], [3383, 3557], [3387, 3561], [3391, 3565], [3395, 3569], [3399, 3573], [3403, 3577], [3407, 3581], [3411, 3585], [3415, 3589], [3419, 3593], [3423, 3597], [3427, 3601], [3431, 3605], [3435, 3609], [3439, 3613], [3443, 3617], [3480, 3618], [3479, 3481], [3444, 3480, 3482], [3481, 3483], [3482, 3484, 3619], [3483, 3485], [3445, 3484, 3486], [3485, 3487], [3486, 3488, 3620], [3487, 3489], [3446, 3488, 3490], [3489, 3491], [3490, 3492, 3621], [3491, 3493], [3447, 3492, 3494], [3493, 3495], [3494, 3496, 3622], [3495, 3497], [3448, 3496, 3498], [3497, 3499], [3498, 3500, 3623], [3499, 3501], [3449, 3500, 3502], [3501, 3503], [3502, 3504, 3624], [3503, 3505], [3450, 3504, 3506], [3505, 3507], [3506, 3508, 3625], [3507, 3509], [3451, 3508, 3510], [3509, 3511], [3510, 3512, 3626], [3511, 3513], [3452, 3512, 3514], [3513, 3515], [3514, 3516, 3627], [3515, 3517], [3453, 3516, 3518], [3517, 3519], [3518, 3520, 3628], [3519, 3521], [3454, 3520, 3522], [3521, 3523], [3522, 3524, 3629], [3523, 3525], [3455, 3524, 3526], [3525, 3527], [3526, 3528, 3630], [3527, 3529], [3456, 3528, 3530], [3529, 3531], [3530, 3532, 3631], [3531, 3533], [3457, 3532, 3534], [3533, 3535], [3534, 3536, 3632], [3535, 3537], [3458, 3536, 3538], [3537, 3539], [3538, 3540, 3633], [3539, 3541], [3459, 3540, 3542], [3541, 3543], [3542, 3544, 3634], [3543, 3545], [3460, 3544, 3546], [3545, 3547], [3546, 3548, 3635], [3547, 3549], [3461, 3548, 3550], [3549, 3551], [3550, 3552, 3636], [3551, 3553], [3462, 3552, 3554], [3553, 3555], [3554, 3556, 3637], [3555, 3557], [3463, 3556, 3558], [3557, 3559], [3558, 3560, 3638], [3559, 3561], [3464, 3560, 3562], [3561, 3563], [3562, 3564, 3639], [3563, 3565], [3465, 3564, 3566], [3565, 3567], [3566, 3568, 3640], [3567, 3569], [3466, 3568, 3570], [3569, 3571], [3570, 3572, 3641], [3571, 3573], [3467, 3572, 3574], [3573, 3575], [3574, 3576, 3642], [3575, 3577], [3468, 3576, 3578], [3577, 3579], [3578, 3580, 3643], [3579, 3581], [3469, 3580, 3582], [3581, 3583], [3582, 3584, 3644], [3583, 3585], [3470, 3584, 3586], [3585, 3587], [3586, 3588, 3645], [3587, 3589], [3471, 3588, 3590], [3589, 3591], [3590, 3592, 3646], [3591, 3593], [3472, 3592, 3594], [3593, 3595], [3594, 3596, 3647], [3595, 3597], [3473, 3596, 3598], [3597, 3599], [3598, 3600, 3648], [3599, 3601], [3474, 3600, 3602], [3601, 3603], [3602, 3604, 3649], [3603, 3605], [3475, 3604, 3606], [3605, 3607], [3606, 3608, 3650], [3607, 3609], [3476, 3608, 3610], [3609, 3611], [3610, 3612, 3651], [3611, 3613], [3477, 3612, 3614], [3613, 3615], [3614, 3616, 3652], [3615, 3617], [3478, 3616], [3479, 3653], [3483, 3657], [3487, 3661], [3491, 3665], [3495, 3669], [3499, 3673], [3503, 3677], [3507, 3681], [3511, 3685], [3515, 3689], [3519, 3693], [3523, 3697], [3527, 3701], [3531, 3705], [3535, 3709], [3539, 3713], [3543, 3717], [3547, 3721], [3551, 3725], [3555, 3729], [3559, 3733], [3563, 3737], [3567, 3741], [3571, 3745], [3575, 3749], [3579, 3753], [3583, 3757], [3587, 3761], [3591, 3765], [3595, 3769], [3599, 3773], [3603, 3777], [3607, 3781], [3611, 3785], [3615, 3789], [3618, 3654], [3653, 3655], [3654, 3656, 3792], [3655, 3657], [3619, 3656, 3658], [3657, 3659], [3658, 3660, 3793], [3659, 3661], [3620, 3660, 3662], [3661, 3663], [3662, 3664, 3794], [3663, 3665], [3621, 3664, 3666], [3665, 3667], [3666, 3668, 3795], [3667, 3669], [3622, 3668, 3670], [3669, 3671], [3670, 3672, 3796], [3671, 3673], [3623, 3672, 3674], [3673, 3675], [3674, 3676, 3797], [3675, 3677], [3624, 3676, 3678], [3677, 3679], [3678, 3680, 3798], [3679, 3681], [3625, 3680, 3682], [3681, 3683], [3682, 3684, 3799], [3683, 3685], [3626, 3684, 3686], [3685, 3687], [3686, 3688, 3800], [3687, 3689], [3627, 3688, 3690], [3689, 3691], [3690, 3692, 3801], [3691, 3693], [3628, 3692, 3694], [3693, 3695], [3694, 3696, 3802], [3695, 3697], [3629, 3696, 3698], [3697, 3699], [3698, 3700, 3803], [3699, 3701], [3630, 3700, 3702], [3701, 3703], [3702, 3704, 3804], [3703, 3705], [3631, 3704, 3706], [3705, 3707], [3706, 3708, 3805], [3707, 3709], [3632, 3708, 3710], [3709, 3711], [3710, 3712, 3806], [3711, 3713], [3633, 3712, 3714], [3713, 3715], [3714, 3716, 3807], [3715, 3717], [3634, 3716, 3718], [3717, 3719], [3718, 3720, 3808], [3719, 3721], [3635, 3720, 3722], [3721, 3723], [3722, 3724, 3809], [3723, 3725], [3636, 3724, 3726], [3725, 3727], [3726, 3728, 3810], [3727, 3729], [3637, 3728, 3730], [3729, 3731], [3730, 3732, 3811], [3731, 3733], [3638, 3732, 3734], [3733, 3735], [3734, 3736, 3812], [3735, 3737], [3639, 3736, 3738], [3737, 3739], [3738, 3740, 3813], [3739, 3741], [3640, 3740, 3742], [3741, 3743], [3742, 3744, 3814], [3743, 3745], [3641, 3744, 3746], [3745, 3747], [3746, 3748, 3815], [3747, 3749], [3642, 3748, 3750], [3749, 3751], [3750, 3752, 3816], [3751, 3753], [3643, 3752, 3754], [3753, 3755], [3754, 3756, 3817], [3755, 3757], [3644, 3756, 3758], [3757, 3759], [3758, 3760, 3818], [3759, 3761], [3645, 3760, 3762], [3761, 3763], [3762, 3764, 3819], [3763, 3765], [3646, 3764, 3766], [3765, 3767], [3766, 3768, 3820], [3767, 3769], [3647, 3768, 3770], [3769, 3771], [3770, 3772, 3821], [3771, 3773], [3648, 3772, 3774], [3773, 3775], [3774, 3776, 3822], [3775, 3777], [3649, 3776, 3778], [3777, 3779], [3778, 3780, 3823], [3779, 3781], [3650, 3780, 3782], [3781, 3783], [3782, 3784, 3824], [3783, 3785], [3651, 3784, 3786], [3785, 3787], [3786, 3788, 3825], [3787, 3789], [3652, 3788, 3790], [3789, 3791], [3790, 3826], [3655, 3829], [3659, 3833], [3663, 3837], [3667, 3841], [3671, 3845], [3675, 3849], [3679, 3853], [3683, 3857], [3687, 3861], [3691, 3865], [3695, 3869], [3699, 3873], [3703, 3877], [3707, 3881], [3711, 3885], [3715, 3889], [3719, 3893], [3723, 3897], [3727, 3901], [3731, 3905], [3735, 3909], [3739, 3913], [3743, 3917], [3747, 3921], [3751, 3925], [3755, 3929], [3759, 3933], [3763, 3937], [3767, 3941], [3771, 3945], [3775, 3949], [3779, 3953], [3783, 3957], [3787, 3961], [3791, 3965], [3828, 3966], [3827, 3829], [3792, 3828, 3830], [3829, 3831], [3830, 3832, 3967], [3831, 3833], [3793, 3832, 3834], [3833, 3835], [3834, 3836, 3968], [3835, 3837], [3794, 3836, 3838], [3837, 3839], [3838, 3840, 3969], [3839, 3841], [3795, 3840, 3842], [3841, 3843], [3842, 3844, 3970], [3843, 3845], [3796, 3844, 3846], [3845, 3847], [3846, 3848, 3971], [3847, 3849], [3797, 3848, 3850], [3849, 3851], [3850, 3852, 3972], [3851, 3853], [3798, 3852, 3854], [3853, 3855], [3854, 3856, 3973], [3855, 3857], [3799, 3856, 3858], [3857, 3859], [3858, 3860, 3974], [3859, 3861], [3800, 3860, 3862], [3861, 3863], [3862, 3864, 3975], [3863, 3865], [3801, 3864, 3866], [3865, 3867], [3866, 3868, 3976], [3867, 3869], [3802, 3868, 3870], [3869, 3871], [3870, 3872, 3977], [3871, 3873], [3803, 3872, 3874], [3873, 3875], [3874, 3876, 3978], [3875, 3877], [3804, 3876, 3878], [3877, 3879], [3878, 3880, 3979], [3879, 3881], [3805, 3880, 3882], [3881, 3883], [3882, 3884, 3980], [3883, 3885], [3806, 3884, 3886], [3885, 3887], [3886, 3888, 3981], [3887, 3889], [3807, 3888, 3890], [3889, 3891], [3890, 3892, 3982], [3891, 3893], [3808, 3892, 3894], [3893, 3895], [3894, 3896, 3983], [3895, 3897], [3809, 3896, 3898], [3897, 3899], [3898, 3900, 3984], [3899, 3901], [3810, 3900, 3902], [3901, 3903], [3902, 3904, 3985], [3903, 3905], [3811, 3904, 3906], [3905, 3907], [3906, 3908, 3986], [3907, 3909], [3812, 3908, 3910], [3909, 3911], [3910, 3912, 3987], [3911, 3913], [3813, 3912, 3914], [3913, 3915], [3914, 3916, 3988], [3915, 3917], [3814, 3916, 3918], [3917, 3919], [3918, 3920, 3989], [3919, 3921], [3815, 3920, 3922], [3921, 3923], [3922, 3924, 3990], [3923, 3925], [3816, 3924, 3926], [3925, 3927], [3926, 3928, 3991], [3927, 3929], [3817, 3928, 3930], [3929, 3931], [3930, 3932, 3992], [3931, 3933], [3818, 3932, 3934], [3933, 3935], [3934, 3936, 3993], [3935, 3937], [3819, 3936, 3938], [3937, 3939], [3938, 3940, 3994], [3939, 3941], [3820, 3940, 3942], [3941, 3943], [3942, 3944, 3995], [3943, 3945], [3821, 3944, 3946], [3945, 3947], [3946, 3948, 3996], [3947, 3949], [3822, 3948, 3950], [3949, 3951], [3950, 3952, 3997], [3951, 3953], [3823, 3952, 3954], [3953, 3955], [3954, 3956, 3998], [3955, 3957], [3824, 3956, 3958], [3957, 3959], [3958, 3960, 3999], [3959, 3961], [3825, 3960, 3962], [3961, 3963], [3962, 3964, 4000], [3963, 3965], [3826, 3964], [3827, 4001], [3831, 4005], [3835, 4009], [3839, 4013], [3843, 4017], [3847, 4021], [3851, 4025], [3855, 4029], [3859, 4033], [3863, 4037], [3867, 4041], [3871, 4045], [3875, 4049], [3879, 4053], [3883, 4057], [3887, 4061], [3891, 4065], [3895, 4069], [3899, 4073], [3903, 4077], [3907, 4081], [3911, 4085], [3915, 4089], [3919, 4093], [3923, 4097], [3927, 4101], [3931, 4105], [3935, 4109], [3939, 4113], [3943, 4117], [3947, 4121], [3951, 4125], [3955, 4129], [3959, 4133], [3963, 4137], [3966, 4002], [4001, 4003], [4002, 4004, 4140], [4003, 4005], [3967, 4004, 4006], [4005, 4007], [4006, 4008, 4141], [4007, 4009], [3968, 4008, 4010], [4009, 4011], [4010, 4012, 4142], [4011, 4013], [3969, 4012, 4014], [4013, 4015], [4014, 4016, 4143], [4015, 4017], [3970, 4016, 4018], [4017, 4019], [4018, 4020, 4144], [4019, 4021], [3971, 4020, 4022], [4021, 4023], [4022, 4024, 4145], [4023, 4025], [3972, 4024, 4026], [4025, 4027], [4026, 4028, 4146], [4027, 4029], [3973, 4028, 4030], [4029, 4031], [4030, 4032, 4147], [4031, 4033], [3974, 4032, 4034], [4033, 4035], [4034, 4036, 4148], [4035, 4037], [3975, 4036, 4038], [4037, 4039], [4038, 4040, 4149], [4039, 4041], [3976, 4040, 4042], [4041, 4043], [4042, 4044, 4150], [4043, 4045], [3977, 4044, 4046], [4045, 4047], [4046, 4048, 4151], [4047, 4049], [3978, 4048, 4050], [4049, 4051], [4050, 4052, 4152], [4051, 4053], [3979, 4052, 4054], [4053, 4055], [4054, 4056, 4153], [4055, 4057], [3980, 4056, 4058], [4057, 4059], [4058, 4060, 4154], [4059, 4061], [3981, 4060, 4062], [4061, 4063], [4062, 4064, 4155], [4063, 4065], [3982, 4064, 4066], [4065, 4067], [4066, 4068, 4156], [4067, 4069], [3983, 4068, 4070], [4069, 4071], [4070, 4072, 4157], [4071, 4073], [3984, 4072, 4074], [4073, 4075], [4074, 4076, 4158], [4075, 4077], [3985, 4076, 4078], [4077, 4079], [4078, 4080, 4159], [4079, 4081], [3986, 4080, 4082], [4081, 4083], [4082, 4084, 4160], [4083, 4085], [3987, 4084, 4086], [4085, 4087], [4086, 4088, 4161], [4087, 4089], [3988, 4088, 4090], [4089, 4091], [4090, 4092, 4162], [4091, 4093], [3989, 4092, 4094], [4093, 4095], [4094, 4096, 4163], [4095, 4097], [3990, 4096, 4098], [4097, 4099], [4098, 4100, 4164], [4099, 4101], [3991, 4100, 4102], [4101, 4103], [4102, 4104, 4165], [4103, 4105], [3992, 4104, 4106], [4105, 4107], [4106, 4108, 4166], [4107, 4109], [3993, 4108, 4110], [4109, 4111], [4110, 4112, 4167], [4111, 4113], [3994, 4112, 4114], [4113, 4115], [4114, 4116, 4168], [4115, 4117], [3995, 4116, 4118], [4117, 4119], [4118, 4120, 4169], [4119, 4121], [3996, 4120, 4122], [4121, 4123], [4122, 4124, 4170], [4123, 4125], [3997, 4124, 4126], [4125, 4127], [4126, 4128, 4171], [4127, 4129], [3998, 4128, 4130], [4129, 4131], [4130, 4132, 4172], [4131, 4133], [3999, 4132, 4134], [4133, 4135], [4134, 4136, 4173], [4135, 4137], [4000, 4136, 4138], [4137, 4139], [4138, 4174], [4003, 4177], [4007, 4181], [4011, 4185], [4015, 4189], [4019, 4193], [4023, 4197], [4027, 4201], [4031, 4205], [4035, 4209], [4039, 4213], [4043, 4217], [4047, 4221], [4051, 4225], [4055, 4229], [4059, 4233], [4063, 4237], [4067, 4241], [4071, 4245], [4075, 4249], [4079, 4253], [4083, 4257], [4087, 4261], [4091, 4265], [4095, 4269], [4099, 4273], [4103, 4277], [4107, 4281], [4111, 4285], [4115, 4289], [4119, 4293], [4123, 4297], [4127, 4301], [4131, 4305], [4135, 4309], [4139, 4313], [4176, 4314], [4175, 4177], [4140, 4176, 4178], [4177, 4179], [4178, 4180, 4315], [4179, 4181], [4141, 4180, 4182], [4181, 4183], [4182, 4184, 4316], [4183, 4185], [4142, 4184, 4186], [4185, 4187], [4186, 4188, 4317], [4187, 4189], [4143, 4188, 4190], [4189, 4191], [4190, 4192, 4318], [4191, 4193], [4144, 4192, 4194], [4193, 4195], [4194, 4196, 4319], [4195, 4197], [4145, 4196, 4198], [4197, 4199], [4198, 4200, 4320], [4199, 4201], [4146, 4200, 4202], [4201, 4203], [4202, 4204, 4321], [4203, 4205], [4147, 4204, 4206], [4205, 4207], [4206, 4208, 4322], [4207, 4209], [4148, 4208, 4210], [4209, 4211], [4210, 4212, 4323], [4211, 4213], [4149, 4212, 4214], [4213, 4215], [4214, 4216, 4324], [4215, 4217], [4150, 4216, 4218], [4217, 4219], [4218, 4220, 4325], [4219, 4221], [4151, 4220, 4222], [4221, 4223], [4222, 4224, 4326], [4223, 4225], [4152, 4224, 4226], [4225, 4227], [4226, 4228, 4327], [4227, 4229], [4153, 4228, 4230], [4229, 4231], [4230, 4232, 4328], [4231, 4233], [4154, 4232, 4234], [4233, 4235], [4234, 4236, 4329], [4235, 4237], [4155, 4236, 4238], [4237, 4239], [4238, 4240, 4330], [4239, 4241], [4156, 4240, 4242], [4241, 4243], [4242, 4244, 4331], [4243, 4245], [4157, 4244, 4246], [4245, 4247], [4246, 4248, 4332], [4247, 4249], [4158, 4248, 4250], [4249, 4251], [4250, 4252, 4333], [4251, 4253], [4159, 4252, 4254], [4253, 4255], [4254, 4256, 4334], [4255, 4257], [4160, 4256, 4258], [4257, 4259], [4258, 4260, 4335], [4259, 4261], [4161, 4260, 4262], [4261, 4263], [4262, 4264, 4336], [4263, 4265], [4162, 4264, 4266], [4265, 4267], [4266, 4268, 4337], [4267, 4269], [4163, 4268, 4270], [4269, 4271], [4270, 4272, 4338], [4271, 4273], [4164, 4272, 4274], [4273, 4275], [4274, 4276, 4339], [4275, 4277], [4165, 4276, 4278], [4277, 4279], [4278, 4280, 4340], [4279, 4281], [4166, 4280, 4282], [4281, 4283], [4282, 4284, 4341], [4283, 4285], [4167, 4284, 4286], [4285, 4287], [4286, 4288, 4342], [4287, 4289], [4168, 4288, 4290], [4289, 4291], [4290, 4292, 4343], [4291, 4293], [4169, 4292, 4294], [4293, 4295], [4294, 4296, 4344], [4295, 4297], [4170, 4296, 4298], [4297, 4299], [4298, 4300, 4345], [4299, 4301], [4171, 4300, 4302], [4301, 4303], [4302, 4304, 4346], [4303, 4305], [4172, 4304, 4306], [4305, 4307], [4306, 4308, 4347], [4307, 4309], [4173, 4308, 4310], [4309, 4311], [4310, 4312, 4348], [4311, 4313], [4174, 4312], [4175, 4349], [4179, 4353], [4183, 4357], [4187, 4361], [4191, 4365], [4195, 4369], [4199, 4373], [4203, 4377], [4207, 4381], [4211, 4385], [4215, 4389], [4219, 4393], [4223, 4397], [4227, 4401], [4231, 4405], [4235, 4409], [4239, 4413], [4243, 4417], [4247, 4421], [4251, 4425], [4255, 4429], [4259, 4433], [4263, 4437], [4267, 4441], [4271, 4445], [4275, 4449], [4279, 4453], [4283, 4457], [4287, 4461], [4291, 4465], [4295, 4469], [4299, 4473], [4303, 4477], [4307, 4481], [4311, 4485], [4314, 4350], [4349, 4351], [4350, 4352, 4488], [4351, 4353], [4315, 4352, 4354], [4353, 4355], [4354, 4356, 4489], [4355, 4357], [4316, 4356, 4358], [4357, 4359], [4358, 4360, 4490], [4359, 4361], [4317, 4360, 4362], [4361, 4363], [4362, 4364, 4491], [4363, 4365], [4318, 4364, 4366], [4365, 4367], [4366, 4368, 4492], [4367, 4369], [4319, 4368, 4370], [4369, 4371], [4370, 4372, 4493], [4371, 4373], [4320, 4372, 4374], [4373, 4375], [4374, 4376, 4494], [4375, 4377], [4321, 4376, 4378], [4377, 4379], [4378, 4380, 4495], [4379, 4381], [4322, 4380, 4382], [4381, 4383], [4382, 4384, 4496], [4383, 4385], [4323, 4384, 4386], [4385, 4387], [4386, 4388, 4497], [4387, 4389], [4324, 4388, 4390], [4389, 4391], [4390, 4392, 4498], [4391, 4393], [4325, 4392, 4394], [4393, 4395], [4394, 4396, 4499], [4395, 4397], [4326, 4396, 4398], [4397, 4399], [4398, 4400, 4500], [4399, 4401], [4327, 4400, 4402], [4401, 4403], [4402, 4404, 4501], [4403, 4405], [4328, 4404, 4406], [4405, 4407], [4406, 4408, 4502], [4407, 4409], [4329, 4408, 4410], [4409, 4411], [4410, 4412, 4503], [4411, 4413], [4330, 4412, 4414], [4413, 4415], [4414, 4416, 4504], [4415, 4417], [4331, 4416, 4418], [4417, 4419], [4418, 4420, 4505], [4419, 4421], [4332, 4420, 4422], [4421, 4423], [4422, 4424, 4506], [4423, 4425], [4333, 4424, 4426], [4425, 4427], [4426, 4428, 4507], [4427, 4429], [4334, 4428, 4430], [4429, 4431], [4430, 4432, 4508], [4431, 4433], [4335, 4432, 4434], [4433, 4435], [4434, 4436, 4509], [4435, 4437], [4336, 4436, 4438], [4437, 4439], [4438, 4440, 4510], [4439, 4441], [4337, 4440, 4442], [4441, 4443], [4442, 4444, 4511], [4443, 4445], [4338, 4444, 4446], [4445, 4447], [4446, 4448, 4512], [4447, 4449], [4339, 4448, 4450], [4449, 4451], [4450, 4452, 4513], [4451, 4453], [4340, 4452, 4454], [4453, 4455], [4454, 4456, 4514], [4455, 4457], [4341, 4456, 4458], [4457, 4459], [4458, 4460, 4515], [4459, 4461], [4342, 4460, 4462], [4461, 4463], [4462, 4464, 4516], [4463, 4465], [4343, 4464, 4466], [4465, 4467], [4466, 4468, 4517], [4467, 4469], [4344, 4468, 4470], [4469, 4471], [4470, 4472, 4518], [4471, 4473], [4345, 4472, 4474], [4473, 4475], [4474, 4476, 4519], [4475, 4477], [4346, 4476, 4478], [4477, 4479], [4478, 4480, 4520], [4479, 4481], [4347, 4480, 4482], [4481, 4483], [4482, 4484, 4521], [4483, 4485], [4348, 4484, 4486], [4485, 4487], [4486, 4522], [4351, 4525], [4355, 4529], [4359, 4533], [4363, 4537], [4367, 4541], [4371, 4545], [4375, 4549], [4379, 4553], [4383, 4557], [4387, 4561], [4391, 4565], [4395, 4569], [4399, 4573], [4403, 4577], [4407, 4581], [4411, 4585], [4415, 4589], [4419, 4593], [4423, 4597], [4427, 4601], [4431, 4605], [4435, 4609], [4439, 4613], [4443, 4617], [4447, 4621], [4451, 4625], [4455, 4629], [4459, 4633], [4463, 4637], [4467, 4641], [4471, 4645], [4475, 4649], [4479, 4653], [4483, 4657], [4487, 4661], [4524, 4662], [4523, 4525], [4488, 4524, 4526], [4525, 4527], [4526, 4528, 4663], [4527, 4529], [4489, 4528, 4530], [4529, 4531], [4530, 4532, 4664], [4531, 4533], [4490, 4532, 4534], [4533, 4535], [4534, 4536, 4665], [4535, 4537], [4491, 4536, 4538], [4537, 4539], [4538, 4540, 4666], [4539, 4541], [4492, 4540, 4542], [4541, 4543], [4542, 4544, 4667], [4543, 4545], [4493, 4544, 4546], [4545, 4547], [4546, 4548, 4668], [4547, 4549], [4494, 4548, 4550], [4549, 4551], [4550, 4552, 4669], [4551, 4553], [4495, 4552, 4554], [4553, 4555], [4554, 4556, 4670], [4555, 4557], [4496, 4556, 4558], [4557, 4559], [4558, 4560, 4671], [4559, 4561], [4497, 4560, 4562], [4561, 4563], [4562, 4564, 4672], [4563, 4565], [4498, 4564, 4566], [4565, 4567], [4566, 4568, 4673], [4567, 4569], [4499, 4568, 4570], [4569, 4571], [4570, 4572, 4674], [4571, 4573], [4500, 4572, 4574], [4573, 4575], [4574, 4576, 4675], [4575, 4577], [4501, 4576, 4578], [4577, 4579], [4578, 4580, 4676], [4579, 4581], [4502, 4580, 4582], [4581, 4583], [4582, 4584, 4677], [4583, 4585], [4503, 4584, 4586], [4585, 4587], [4586, 4588, 4678], [4587, 4589], [4504, 4588, 4590], [4589, 4591], [4590, 4592, 4679], [4591, 4593], [4505, 4592, 4594], [4593, 4595], [4594, 4596, 4680], [4595, 4597], [4506, 4596, 4598], [4597, 4599], [4598, 4600, 4681], [4599, 4601], [4507, 4600, 4602], [4601, 4603], [4602, 4604, 4682], [4603, 4605], [4508, 4604, 4606], [4605, 4607], [4606, 4608, 4683], [4607, 4609], [4509, 4608, 4610], [4609, 4611], [4610, 4612, 4684], [4611, 4613], [4510, 4612, 4614], [4613, 4615], [4614, 4616, 4685], [4615, 4617], [4511, 4616, 4618], [4617, 4619], [4618, 4620, 4686], [4619, 4621], [4512, 4620, 4622], [4621, 4623], [4622, 4624, 4687], [4623, 4625], [4513, 4624, 4626], [4625, 4627], [4626, 4628, 4688], [4627, 4629], [4514, 4628, 4630], [4629, 4631], [4630, 4632, 4689], [4631, 4633], [4515, 4632, 4634], [4633, 4635], [4634, 4636, 4690], [4635, 4637], [4516, 4636, 4638], [4637, 4639], [4638, 4640, 4691], [4639, 4641], [4517, 4640, 4642], [4641, 4643], [4642, 4644, 4692], [4643, 4645], [4518, 4644, 4646], [4645, 4647], [4646, 4648, 4693], [4647, 4649], [4519, 4648, 4650], [4649, 4651], [4650, 4652, 4694], [4651, 4653], [4520, 4652, 4654], [4653, 4655], [4654, 4656, 4695], [4655, 4657], [4521, 4656, 4658], [4657, 4659], [4658, 4660, 4696], [4659, 4661], [4522, 4660], [4523, 4697], [4527, 4701], [4531, 4705], [4535, 4709], [4539, 4713], [4543, 4717], [4547, 4721], [4551, 4725], [4555, 4729], [4559, 4733], [4563, 4737], [4567, 4741], [4571, 4745], [4575, 4749], [4579, 4753], [4583, 4757], [4587, 4761], [4591, 4765], [4595, 4769], [4599, 4773], [4603, 4777], [4607, 4781], [4611, 4785], [4615, 4789], [4619, 4793], [4623, 4797], [4627, 4801], [4631, 4805], [4635, 4809], [4639, 4813], [4643, 4817], [4647, 4821], [4651, 4825], [4655, 4829], [4659, 4833], [4662, 4698], [4697, 4699], [4698, 4700, 4836], [4699, 4701], [4663, 4700, 4702], [4701, 4703], [4702, 4704, 4837], [4703, 4705], [4664, 4704, 4706], [4705, 4707], [4706, 4708, 4838], [4707, 4709], [4665, 4708, 4710], [4709, 4711], [4710, 4712, 4839], [4711, 4713], [4666, 4712, 4714], [4713, 4715], [4714, 4716, 4840], [4715, 4717], [4667, 4716, 4718], [4717, 4719], [4718, 4720, 4841], [4719, 4721], [4668, 4720, 4722], [4721, 4723], [4722, 4724, 4842], [4723, 4725], [4669, 4724, 4726], [4725, 4727], [4726, 4728, 4843], [4727, 4729], [4670, 4728, 4730], [4729, 4731], [4730, 4732, 4844], [4731, 4733], [4671, 4732, 4734], [4733, 4735], [4734, 4736, 4845], [4735, 4737], [4672, 4736, 4738], [4737, 4739], [4738, 4740, 4846], [4739, 4741], [4673, 4740, 4742], [4741, 4743], [4742, 4744, 4847], [4743, 4745], [4674, 4744, 4746], [4745, 4747], [4746, 4748, 4848], [4747, 4749], [4675, 4748, 4750], [4749, 4751], [4750, 4752, 4849], [4751, 4753], [4676, 4752, 4754], [4753, 4755], [4754, 4756, 4850], [4755, 4757], [4677, 4756, 4758], [4757, 4759], [4758, 4760, 4851], [4759, 4761], [4678, 4760, 4762], [4761, 4763], [4762, 4764, 4852], [4763, 4765], [4679, 4764, 4766], [4765, 4767], [4766, 4768, 4853], [4767, 4769], [4680, 4768, 4770], [4769, 4771], [4770, 4772, 4854], [4771, 4773], [4681, 4772, 4774], [4773, 4775], [4774, 4776, 4855], [4775, 4777], [4682, 4776, 4778], [4777, 4779], [4778, 4780, 4856], [4779, 4781], [4683, 4780, 4782], [4781, 4783], [4782, 4784, 4857], [4783, 4785], [4684, 4784, 4786], [4785, 4787], [4786, 4788, 4858], [4787, 4789], [4685, 4788, 4790], [4789, 4791], [4790, 4792, 4859], [4791, 4793], [4686, 4792, 4794], [4793, 4795], [4794, 4796, 4860], [4795, 4797], [4687, 4796, 4798], [4797, 4799], [4798, 4800, 4861], [4799, 4801], [4688, 4800, 4802], [4801, 4803], [4802, 4804, 4862], [4803, 4805], [4689, 4804, 4806], [4805, 4807], [4806, 4808, 4863], [4807, 4809], [4690, 4808, 4810], [4809, 4811], [4810, 4812, 4864], [4811, 4813], [4691, 4812, 4814], [4813, 4815], [4814, 4816, 4865], [4815, 4817], [4692, 4816, 4818], [4817, 4819], [4818, 4820, 4866], [4819, 4821], [4693, 4820, 4822], [4821, 4823], [4822, 4824, 4867], [4823, 4825], [4694, 4824, 4826], [4825, 4827], [4826, 4828, 4868], [4827, 4829], [4695, 4828, 4830], [4829, 4831], [4830, 4832, 4869], [4831, 4833], [4696, 4832, 4834], [4833, 4835], [4834, 4870], [4699, 4873], [4703, 4877], [4707, 4881], [4711, 4885], [4715, 4889], [4719, 4893], [4723, 4897], [4727, 4901], [4731, 4905], [4735, 4909], [4739, 4913], [4743, 4917], [4747, 4921], [4751, 4925], [4755, 4929], [4759, 4933], [4763, 4937], [4767, 4941], [4771, 4945], [4775, 4949], [4779, 4953], [4783, 4957], [4787, 4961], [4791, 4965], [4795, 4969], [4799, 4973], [4803, 4977], [4807, 4981], [4811, 4985], [4815, 4989], [4819, 4993], [4823, 4997], [4827, 5001], [4831, 5005], [4835, 5009], [4872, 5010], [4871, 4873], [4836, 4872, 4874], [4873, 4875], [4874, 4876, 5011], [4875, 4877], [4837, 4876, 4878], [4877, 4879], [4878, 4880, 5012], [4879, 4881], [4838, 4880, 4882], [4881, 4883], [4882, 4884, 5013], [4883, 4885], [4839, 4884, 4886], [4885, 4887], [4886, 4888, 5014], [4887, 4889], [4840, 4888, 4890], [4889, 4891], [4890, 4892, 5015], [4891, 4893], [4841, 4892, 4894], [4893, 4895], [4894, 4896, 5016], [4895, 4897], [4842, 4896, 4898], [4897, 4899], [4898, 4900, 5017], [4899, 4901], [4843, 4900, 4902], [4901, 4903], [4902, 4904, 5018], [4903, 4905], [4844, 4904, 4906], [4905, 4907], [4906, 4908, 5019], [4907, 4909], [4845, 4908, 4910], [4909, 4911], [4910, 4912, 5020], [4911, 4913], [4846, 4912, 4914], [4913, 4915], [4914, 4916, 5021], [4915, 4917], [4847, 4916, 4918], [4917, 4919], [4918, 4920, 5022], [4919, 4921], [4848, 4920, 4922], [4921, 4923], [4922, 4924, 5023], [4923, 4925], [4849, 4924, 4926], [4925, 4927], [4926, 4928, 5024], [4927, 4929], [4850, 4928, 4930], [4929, 4931], [4930, 4932, 5025], [4931, 4933], [4851, 4932, 4934], [4933, 4935], [4934, 4936, 5026], [4935, 4937], [4852, 4936, 4938], [4937, 4939], [4938, 4940, 5027], [4939, 4941], [4853, 4940, 4942], [4941, 4943], [4942, 4944, 5028], [4943, 4945], [4854, 4944, 4946], [4945, 4947], [4946, 4948, 5029], [4947, 4949], [4855, 4948, 4950], [4949, 4951], [4950, 4952, 5030], [4951, 4953], [4856, 4952, 4954], [4953, 4955], [4954, 4956, 5031], [4955, 4957], [4857, 4956, 4958], [4957, 4959], [4958, 4960, 5032], [4959, 4961], [4858, 4960, 4962], [4961, 4963], [4962, 4964, 5033], [4963, 4965], [4859, 4964, 4966], [4965, 4967], [4966, 4968, 5034], [4967, 4969], [4860, 4968, 4970], [4969, 4971], [4970, 4972, 5035], [4971, 4973], [4861, 4972, 4974], [4973, 4975], [4974, 4976, 5036], [4975, 4977], [4862, 4976, 4978], [4977, 4979], [4978, 4980, 5037], [4979, 4981], [4863, 4980, 4982], [4981, 4983], [4982, 4984, 5038], [4983, 4985], [4864, 4984, 4986], [4985, 4987], [4986, 4988, 5039], [4987, 4989], [4865, 4988, 4990], [4989, 4991], [4990, 4992, 5040], [4991, 4993], [4866, 4992, 4994], [4993, 4995], [4994, 4996, 5041], [4995, 4997], [4867, 4996, 4998], [4997, 4999], [4998, 5000, 5042], [4999, 5001], [4868, 5000, 5002], [5001, 5003], [5002, 5004, 5043], [5003, 5005], [4869, 5004, 5006], [5005, 5007], [5006, 5008, 5044], [5007, 5009], [4870, 5008], [4871, 5045], [4875, 5049], [4879, 5053], [4883, 5057], [4887, 5061], [4891, 5065], [4895, 5069], [4899, 5073], [4903, 5077], [4907, 5081], [4911, 5085], [4915, 5089], [4919, 5093], [4923, 5097], [4927, 5101], [4931, 5105], [4935, 5109], [4939, 5113], [4943, 5117], [4947, 5121], [4951, 5125], [4955, 5129], [4959, 5133], [4963, 5137], [4967, 5141], [4971, 5145], [4975, 5149], [4979, 5153], [4983, 5157], [4987, 5161], [4991, 5165], [4995, 5169], [4999, 5173], [5003, 5177], [5007, 5181], [5010, 5046], [5045, 5047], [5046, 5048, 5184], [5047, 5049], [5011, 5048, 5050], [5049, 5051], [5050, 5052, 5185], [5051, 5053], [5012, 5052, 5054], [5053, 5055], [5054, 5056, 5186], [5055, 5057], [5013, 5056, 5058], [5057, 5059], [5058, 5060, 5187], [5059, 5061], [5014, 5060, 5062], [5061, 5063], [5062, 5064, 5188], [5063, 5065], [5015, 5064, 5066], [5065, 5067], [5066, 5068, 5189], [5067, 5069], [5016, 5068, 5070], [5069, 5071], [5070, 5072, 5190], [5071, 5073], [5017, 5072, 5074], [5073, 5075], [5074, 5076, 5191], [5075, 5077], [5018, 5076, 5078], [5077, 5079], [5078, 5080, 5192], [5079, 5081], [5019, 5080, 5082], [5081, 5083], [5082, 5084, 5193], [5083, 5085], [5020, 5084, 5086], [5085, 5087], [5086, 5088, 5194], [5087, 5089], [5021, 5088, 5090], [5089, 5091], [5090, 5092, 5195], [5091, 5093], [5022, 5092, 5094], [5093, 5095], [5094, 5096, 5196], [5095, 5097], [5023, 5096, 5098], [5097, 5099], [5098, 5100, 5197], [5099, 5101], [5024, 5100, 5102], [5101, 5103], [5102, 5104, 5198], [5103, 5105], [5025, 5104, 5106], [5105, 5107], [5106, 5108, 5199], [5107, 5109], [5026, 5108, 5110], [5109, 5111], [5110, 5112, 5200], [5111, 5113], [5027, 5112, 5114], [5113, 5115], [5114, 5116, 5201], [5115, 5117], [5028, 5116, 5118], [5117, 5119], [5118, 5120, 5202], [5119, 5121], [5029, 5120, 5122], [5121, 5123], [5122, 5124, 5203], [5123, 5125], [5030, 5124, 5126], [5125, 5127], [5126, 5128, 5204], [5127, 5129], [5031, 5128, 5130], [5129, 5131], [5130, 5132, 5205], [5131, 5133], [5032, 5132, 5134], [5133, 5135], [5134, 5136, 5206], [5135, 5137], [5033, 5136, 5138], [5137, 5139], [5138, 5140, 5207], [5139, 5141], [5034, 5140, 5142], [5141, 5143], [5142, 5144, 5208], [5143, 5145], [5035, 5144, 5146], [5145, 5147], [5146, 5148, 5209], [5147, 5149], [5036, 5148, 5150], [5149, 5151], [5150, 5152, 5210], [5151, 5153], [5037, 5152, 5154], [5153, 5155], [5154, 5156, 5211], [5155, 5157], [5038, 5156, 5158], [5157, 5159], [5158, 5160, 5212], [5159, 5161], [5039, 5160, 5162], [5161, 5163], [5162, 5164, 5213], [5163, 5165], [5040, 5164, 5166], [5165, 5167], [5166, 5168, 5214], [5167, 5169], [5041, 5168, 5170], [5169, 5171], [5170, 5172, 5215], [5171, 5173], [5042, 5172, 5174], [5173, 5175], [5174, 5176, 5216], [5175, 5177], [5043, 5176, 5178], [5177, 5179], [5178, 5180, 5217], [5179, 5181], [5044, 5180, 5182], [5181, 5183], [5182, 5218], [5047, 5221], [5051, 5225], [5055, 5229], [5059, 5233], [5063, 5237], [5067, 5241], [5071, 5245], [5075, 5249], [5079, 5253], [5083, 5257], [5087, 5261], [5091, 5265], [5095, 5269], [5099, 5273], [5103, 5277], [5107, 5281], [5111, 5285], [5115, 5289], [5119, 5293], [5123, 5297], [5127, 5301], [5131, 5305], [5135, 5309], [5139, 5313], [5143, 5317], [5147, 5321], [5151, 5325], [5155, 5329], [5159, 5333], [5163, 5337], [5167, 5341], [5171, 5345], [5175, 5349], [5179, 5353], [5183, 5357], [5220, 5358], [5219, 5221], [5184, 5220, 5222], [5221, 5223], [5222, 5224, 5359], [5223, 5225], [5185, 5224, 5226], [5225, 5227], [5226, 5228, 5360], [5227, 5229], [5186, 5228, 5230], [5229, 5231], [5230, 5232, 5361], [5231, 5233], [5187, 5232, 5234], [5233, 5235], [5234, 5236, 5362], [5235, 5237], [5188, 5236, 5238], [5237, 5239], [5238, 5240, 5363], [5239, 5241], [5189, 5240, 5242], [5241, 5243], [5242, 5244, 5364], [5243, 5245], [5190, 5244, 5246], [5245, 5247], [5246, 5248, 5365], [5247, 5249], [5191, 5248, 5250], [5249, 5251], [5250, 5252, 5366], [5251, 5253], [5192, 5252, 5254], [5253, 5255], [5254, 5256, 5367], [5255, 5257], [5193, 5256, 5258], [5257, 5259], [5258, 5260, 5368], [5259, 5261], [5194, 5260, 5262], [5261, 5263], [5262, 5264, 5369], [5263, 5265], [5195, 5264, 5266], [5265, 5267], [5266, 5268, 5370], [5267, 5269], [5196, 5268, 5270], [5269, 5271], [5270, 5272, 5371], [5271, 5273], [5197, 5272, 5274], [5273, 5275], [5274, 5276, 5372], [5275, 5277], [5198, 5276, 5278], [5277, 5279], [5278, 5280, 5373], [5279, 5281], [5199, 5280, 5282], [5281, 5283], [5282, 5284, 5374], [5283, 5285], [5200, 5284, 5286], [5285, 5287], [5286, 5288, 5375], [5287, 5289], [5201, 5288, 5290], [5289, 5291], [5290, 5292, 5376], [5291, 5293], [5202, 5292, 5294], [5293, 5295], [5294, 5296, 5377], [5295, 5297], [5203, 5296, 5298], [5297, 5299], [5298, 5300, 5378], [5299, 5301], [5204, 5300, 5302], [5301, 5303], [5302, 5304, 5379], [5303, 5305], [5205, 5304, 5306], [5305, 5307], [5306, 5308, 5380], [5307, 5309], [5206, 5308, 5310], [5309, 5311], [5310, 5312, 5381], [5311, 5313], [5207, 5312, 5314], [5313, 5315], [5314, 5316, 5382], [5315, 5317], [5208, 5316, 5318], [5317, 5319], [5318, 5320, 5383], [5319, 5321], [5209, 5320, 5322], [5321, 5323], [5322, 5324, 5384], [5323, 5325], [5210, 5324, 5326], [5325, 5327], [5326, 5328, 5385], [5327, 5329], [5211, 5328, 5330], [5329, 5331], [5330, 5332, 5386], [5331, 5333], [5212, 5332, 5334], [5333, 5335], [5334, 5336, 5387], [5335, 5337], [5213, 5336, 5338], [5337, 5339], [5338, 5340, 5388], [5339, 5341], [5214, 5340, 5342], [5341, 5343], [5342, 5344, 5389], [5343, 5345], [5215, 5344, 5346], [5345, 5347], [5346, 5348, 5390], [5347, 5349], [5216, 5348, 5350], [5349, 5351], [5350, 5352, 5391], [5351, 5353], [5217, 5352, 5354], [5353, 5355], [5354, 5356, 5392], [5355, 5357], [5218, 5356], [5219, 5393], [5223, 5397], [5227, 5401], [5231, 5405], [5235, 5409], [5239, 5413], [5243, 5417], [5247, 5421], [5251, 5425], [5255, 5429], [5259, 5433], [5263, 5437], [5267, 5441], [5271, 5445], [5275, 5449], [5279, 5453], [5283, 5457], [5287, 5461], [5291, 5465], [5295, 5469], [5299, 5473], [5303, 5477], [5307, 5481], [5311, 5485], [5315, 5489], [5319, 5493], [5323, 5497], [5327, 5501], [5331, 5505], [5335, 5509], [5339, 5513], [5343, 5517], [5347, 5521], [5351, 5525], [5355, 5529], [5358, 5394], [5393, 5395], [5394, 5396, 5532], [5395, 5397], [5359, 5396, 5398], [5397, 5399], [5398, 5400, 5533], [5399, 5401], [5360, 5400, 5402], [5401, 5403], [5402, 5404, 5534], [5403, 5405], [5361, 5404, 5406], [5405, 5407], [5406, 5408, 5535], [5407, 5409], [5362, 5408, 5410], [5409, 5411], [5410, 5412, 5536], [5411, 5413], [5363, 5412, 5414], [5413, 5415], [5414, 5416, 5537], [5415, 5417], [5364, 5416, 5418], [5417, 5419], [5418, 5420, 5538], [5419, 5421], [5365, 5420, 5422], [5421, 5423], [5422, 5424, 5539], [5423, 5425], [5366, 5424, 5426], [5425, 5427], [5426, 5428, 5540], [5427, 5429], [5367, 5428, 5430], [5429, 5431], [5430, 5432, 5541], [5431, 5433], [5368, 5432, 5434], [5433, 5435], [5434, 5436, 5542], [5435, 5437], [5369, 5436, 5438], [5437, 5439], [5438, 5440, 5543], [5439, 5441], [5370, 5440, 5442], [5441, 5443], [5442, 5444, 5544], [5443, 5445], [5371, 5444, 5446], [5445, 5447], [5446, 5448, 5545], [5447, 5449], [5372, 5448, 5450], [5449, 5451], [5450, 5452, 5546], [5451, 5453], [5373, 5452, 5454], [5453, 5455], [5454, 5456, 5547], [5455, 5457], [5374, 5456, 5458], [5457, 5459], [5458, 5460, 5548], [5459, 5461], [5375, 5460, 5462], [5461, 5463], [5462, 5464, 5549], [5463, 5465], [5376, 5464, 5466], [5465, 5467], [5466, 5468, 5550], [5467, 5469], [5377, 5468, 5470], [5469, 5471], [5470, 5472, 5551], [5471, 5473], [5378, 5472, 5474], [5473, 5475], [5474, 5476, 5552], [5475, 5477], [5379, 5476, 5478], [5477, 5479], [5478, 5480, 5553], [5479, 5481], [5380, 5480, 5482], [5481, 5483], [5482, 5484, 5554], [5483, 5485], [5381, 5484, 5486], [5485, 5487], [5486, 5488, 5555], [5487, 5489], [5382, 5488, 5490], [5489, 5491], [5490, 5492, 5556], [5491, 5493], [5383, 5492, 5494], [5493, 5495], [5494, 5496, 5557], [5495, 5497], [5384, 5496, 5498], [5497, 5499], [5498, 5500, 5558], [5499, 5501], [5385, 5500, 5502], [5501, 5503], [5502, 5504, 5559], [5503, 5505], [5386, 5504, 5506], [5505, 5507], [5506, 5508, 5560], [5507, 5509], [5387, 5508, 5510], [5509, 5511], [5510, 5512, 5561], [5511, 5513], [5388, 5512, 5514], [5513, 5515], [5514, 5516, 5562], [5515, 5517], [5389, 5516, 5518], [5517, 5519], [5518, 5520, 5563], [5519, 5521], [5390, 5520, 5522], [5521, 5523], [5522, 5524, 5564], [5523, 5525], [5391, 5524, 5526], [5525, 5527], [5526, 5528, 5565], [5527, 5529], [5392, 5528, 5530], [5529, 5531], [5530, 5566], [5395, 5569], [5399, 5573], [5403, 5577], [5407, 5581], [5411, 5585], [5415, 5589], [5419, 5593], [5423, 5597], [5427, 5601], [5431, 5605], [5435, 5609], [5439, 5613], [5443, 5617], [5447, 5621], [5451, 5625], [5455, 5629], [5459, 5633], [5463, 5637], [5467, 5641], [5471, 5645], [5475, 5649], [5479, 5653], [5483, 5657], [5487, 5661], [5491, 5665], [5495, 5669], [5499, 5673], [5503, 5677], [5507, 5681], [5511, 5685], [5515, 5689], [5519, 5693], [5523, 5697], [5527, 5701], [5531, 5705], [5568, 5706], [5567, 5569], [5532, 5568, 5570], [5569, 5571], [5570, 5572, 5707], [5571, 5573], [5533, 5572, 5574], [5573, 5575], [5574, 5576, 5708], [5575, 5577], [5534, 5576, 5578], [5577, 5579], [5578, 5580, 5709], [5579, 5581], [5535, 5580, 5582], [5581, 5583], [5582, 5584, 5710], [5583, 5585], [5536, 5584, 5586], [5585, 5587], [5586, 5588, 5711], [5587, 5589], [5537, 5588, 5590], [5589, 5591], [5590, 5592, 5712], [5591, 5593], [5538, 5592, 5594], [5593, 5595], [5594, 5596, 5713], [5595, 5597], [5539, 5596, 5598], [5597, 5599], [5598, 5600, 5714], [5599, 5601], [5540, 5600, 5602], [5601, 5603], [5602, 5604, 5715], [5603, 5605], [5541, 5604, 5606], [5605, 5607], [5606, 5608, 5716], [5607, 5609], [5542, 5608, 5610], [5609, 5611], [5610, 5612, 5717], [5611, 5613], [5543, 5612, 5614], [5613, 5615], [5614, 5616, 5718], [5615, 5617], [5544, 5616, 5618], [5617, 5619], [5618, 5620, 5719], [5619, 5621], [5545, 5620, 5622], [5621, 5623], [5622, 5624, 5720], [5623, 5625], [5546, 5624, 5626], [5625, 5627], [5626, 5628, 5721], [5627, 5629], [5547, 5628, 5630], [5629, 5631], [5630, 5632, 5722], [5631, 5633], [5548, 5632, 5634], [5633, 5635], [5634, 5636, 5723], [5635, 5637], [5549, 5636, 5638], [5637, 5639], [5638, 5640, 5724], [5639, 5641], [5550, 5640, 5642], [5641, 5643], [5642, 5644, 5725], [5643, 5645], [5551, 5644, 5646], [5645, 5647], [5646, 5648, 5726], [5647, 5649], [5552, 5648, 5650], [5649, 5651], [5650, 5652, 5727], [5651, 5653], [5553, 5652, 5654], [5653, 5655], [5654, 5656, 5728], [5655, 5657], [5554, 5656, 5658], [5657, 5659], [5658, 5660, 5729], [5659, 5661], [5555, 5660, 5662], [5661, 5663], [5662, 5664, 5730], [5663, 5665], [5556, 5664, 5666], [5665, 5667], [5666, 5668, 5731], [5667, 5669], [5557, 5668, 5670], [5669, 5671], [5670, 5672, 5732], [5671, 5673], [5558, 5672, 5674], [5673, 5675], [5674, 5676, 5733], [5675, 5677], [5559, 5676, 5678], [5677, 5679], [5678, 5680, 5734], [5679, 5681], [5560, 5680, 5682], [5681, 5683], [5682, 5684, 5735], [5683, 5685], [5561, 5684, 5686], [5685, 5687], [5686, 5688, 5736], [5687, 5689], [5562, 5688, 5690], [5689, 5691], [5690, 5692, 5737], [5691, 5693], [5563, 5692, 5694], [5693, 5695], [5694, 5696, 5738], [5695, 5697], [5564, 5696, 5698], [5697, 5699], [5698, 5700, 5739], [5699, 5701], [5565, 5700, 5702], [5701, 5703], [5702, 5704, 5740], [5703, 5705], [5566, 5704], [5567, 5741], [5571, 5745], [5575, 5749], [5579, 5753], [5583, 5757], [5587, 5761], [5591, 5765], [5595, 5769], [5599, 5773], [5603, 5777], [5607, 5781], [5611, 5785], [5615, 5789], [5619, 5793], [5623, 5797], [5627, 5801], [5631, 5805], [5635, 5809], [5639, 5813], [5643, 5817], [5647, 5821], [5651, 5825], [5655, 5829], [5659, 5833], [5663, 5837], [5667, 5841], [5671, 5845], [5675, 5849], [5679, 5853], [5683, 5857], [5687, 5861], [5691, 5865], [5695, 5869], [5699, 5873], [5703, 5877], [5706, 5742], [5741, 5743], [5742, 5744, 5880], [5743, 5745], [5707, 5744, 5746], [5745, 5747], [5746, 5748, 5881], [5747, 5749], [5708, 5748, 5750], [5749, 5751], [5750, 5752, 5882], [5751, 5753], [5709, 5752, 5754], [5753, 5755], [5754, 5756, 5883], [5755, 5757], [5710, 5756, 5758], [5757, 5759], [5758, 5760, 5884], [5759, 5761], [5711, 5760, 5762], [5761, 5763], [5762, 5764, 5885], [5763, 5765], [5712, 5764, 5766], [5765, 5767], [5766, 5768, 5886], [5767, 5769], [5713, 5768, 5770], [5769, 5771], [5770, 5772, 5887], [5771, 5773], [5714, 5772, 5774], [5773, 5775], [5774, 5776, 5888], [5775, 5777], [5715, 5776, 5778], [5777, 5779], [5778, 5780, 5889], [5779, 5781], [5716, 5780, 5782], [5781, 5783], [5782, 5784, 5890], [5783, 5785], [5717, 5784, 5786], [5785, 5787], [5786, 5788, 5891], [5787, 5789], [5718, 5788, 5790], [5789, 5791], [5790, 5792, 5892], [5791, 5793], [5719, 5792, 5794], [5793, 5795], [5794, 5796, 5893], [5795, 5797], [5720, 5796, 5798], [5797, 5799], [5798, 5800, 5894], [5799, 5801], [5721, 5800, 5802], [5801, 5803], [5802, 5804, 5895], [5803, 5805], [5722, 5804, 5806], [5805, 5807], [5806, 5808, 5896], [5807, 5809], [5723, 5808, 5810], [5809, 5811], [5810, 5812, 5897], [5811, 5813], [5724, 5812, 5814], [5813, 5815], [5814, 5816, 5898], [5815, 5817], [5725, 5816, 5818], [5817, 5819], [5818, 5820, 5899], [5819, 5821], [5726, 5820, 5822], [5821, 5823], [5822, 5824, 5900], [5823, 5825], [5727, 5824, 5826], [5825, 5827], [5826, 5828, 5901], [5827, 5829], [5728, 5828, 5830], [5829, 5831], [5830, 5832, 5902], [5831, 5833], [5729, 5832, 5834], [5833, 5835], [5834, 5836, 5903], [5835, 5837], [5730, 5836, 5838], [5837, 5839], [5838, 5840, 5904], [5839, 5841], [5731, 5840, 5842], [5841, 5843], [5842, 5844, 5905], [5843, 5845], [5732, 5844, 5846], [5845, 5847], [5846, 5848, 5906], [5847, 5849], [5733, 5848, 5850], [5849, 5851], [5850, 5852, 5907], [5851, 5853], [5734, 5852, 5854], [5853, 5855], [5854, 5856, 5908], [5855, 5857], [5735, 5856, 5858], [5857, 5859], [5858, 5860, 5909], [5859, 5861], [5736, 5860, 5862], [5861, 5863], [5862, 5864, 5910], [5863, 5865], [5737, 5864, 5866], [5865, 5867], [5866, 5868, 5911], [5867, 5869], [5738, 5868, 5870], [5869, 5871], [5870, 5872, 5912], [5871, 5873], [5739, 5872, 5874], [5873, 5875], [5874, 5876, 5913], [5875, 5877], [5740, 5876, 5878], [5877, 5879], [5878, 5914], [5743, 5917], [5747, 5921], [5751, 5925], [5755, 5929], [5759, 5933], [5763, 5937], [5767, 5941], [5771, 5945], [5775, 5949], [5779, 5953], [5783, 5957], [5787, 5961], [5791, 5965], [5795, 5969], [5799, 5973], [5803, 5977], [5807, 5981], [5811, 5985], [5815, 5989], [5819, 5993], [5823, 5997], [5827, 6001], [5831, 6005], [5835, 6009], [5839, 6013], [5843, 6017], [5847, 6021], [5851, 6025], [5855, 6029], [5859, 6033], [5863, 6037], [5867, 6041], [5871, 6045], [5875, 6049], [5879, 6053], [5916, 6054], [5915, 5917], [5880, 5916, 5918], [5917, 5919], [5918, 5920, 6055], [5919, 5921], [5881, 5920, 5922], [5921, 5923], [5922, 5924, 6056], [5923, 5925], [5882, 5924, 5926], [5925, 5927], [5926, 5928, 6057], [5927, 5929], [5883, 5928, 5930], [5929, 5931], [5930, 5932, 6058], [5931, 5933], [5884, 5932, 5934], [5933, 5935], [5934, 5936, 6059], [5935, 5937], [5885, 5936, 5938], [5937, 5939], [5938, 5940, 6060], [5939, 5941], [5886, 5940, 5942], [5941, 5943], [5942, 5944, 6061], [5943, 5945], [5887, 5944, 5946], [5945, 5947], [5946, 5948, 6062], [5947, 5949], [5888, 5948, 5950], [5949, 5951], [5950, 5952, 6063], [5951, 5953], [5889, 5952, 5954], [5953, 5955], [5954, 5956, 6064], [5955, 5957], [5890, 5956, 5958], [5957, 5959], [5958, 5960, 6065], [5959, 5961], [5891, 5960, 5962], [5961, 5963], [5962, 5964, 6066], [5963, 5965], [5892, 5964, 5966], [5965, 5967], [5966, 5968, 6067], [5967, 5969], [5893, 5968, 5970], [5969, 5971], [5970, 5972, 6068], [5971, 5973], [5894, 5972, 5974], [5973, 5975], [5974, 5976, 6069], [5975, 5977], [5895, 5976, 5978], [5977, 5979], [5978, 5980, 6070], [5979, 5981], [5896, 5980, 5982], [5981, 5983], [5982, 5984, 6071], [5983, 5985], [5897, 5984, 5986], [5985, 5987], [5986, 5988, 6072], [5987, 5989], [5898, 5988, 5990], [5989, 5991], [5990, 5992, 6073], [5991, 5993], [5899, 5992, 5994], [5993, 5995], [5994, 5996, 6074], [5995, 5997], [5900, 5996, 5998], [5997, 5999], [5998, 6000, 6075], [5999, 6001], [5901, 6000, 6002], [6001, 6003], [6002, 6004, 6076], [6003, 6005], [5902, 6004, 6006], [6005, 6007], [6006, 6008, 6077], [6007, 6009], [5903, 6008, 6010], [6009, 6011], [6010, 6012, 6078], [6011, 6013], [5904, 6012, 6014], [6013, 6015], [6014, 6016, 6079], [6015, 6017], [5905, 6016, 6018], [6017, 6019], [6018, 6020, 6080], [6019, 6021], [5906, 6020, 6022], [6021, 6023], [6022, 6024, 6081], [6023, 6025], [5907, 6024, 6026], [6025, 6027], [6026, 6028, 6082], [6027, 6029], [5908, 6028, 6030], [6029, 6031], [6030, 6032, 6083], [6031, 6033], [5909, 6032, 6034], [6033, 6035], [6034, 6036, 6084], [6035, 6037], [5910, 6036, 6038], [6037, 6039], [6038, 6040, 6085], [6039, 6041], [5911, 6040, 6042], [6041, 6043], [6042, 6044, 6086], [6043, 6045], [5912, 6044, 6046], [6045, 6047], [6046, 6048, 6087], [6047, 6049], [5913, 6048, 6050], [6049, 6051], [6050, 6052, 6088], [6051, 6053], [5914, 6052], [5915, 6089], [5919, 6093], [5923, 6097], [5927, 6101], [5931, 6105], [5935, 6109], [5939, 6113], [5943, 6117], [5947, 6121], [5951, 6125], [5955, 6129], [5959, 6133], [5963, 6137], [5967, 6141], [5971, 6145], [5975, 6149], [5979, 6153], [5983, 6157], [5987, 6161], [5991, 6165], [5995, 6169], [5999, 6173], [6003, 6177], [6007, 6181], [6011, 6185], [6015, 6189], [6019, 6193], [6023, 6197], [6027, 6201], [6031, 6205], [6035, 6209], [6039, 6213], [6043, 6217], [6047, 6221], [6051, 6225], [6054, 6090], [6089, 6091], [6090, 6092, 6228], [6091, 6093], [6055, 6092, 6094], [6093, 6095], [6094, 6096, 6229], [6095, 6097], [6056, 6096, 6098], [6097, 6099], [6098, 6100, 6230], [6099, 6101], [6057, 6100, 6102], [6101, 6103], [6102, 6104, 6231], [6103, 6105], [6058, 6104, 6106], [6105, 6107], [6106, 6108, 6232], [6107, 6109], [6059, 6108, 6110], [6109, 6111], [6110, 6112, 6233], [6111, 6113], [6060, 6112, 6114], [6113, 6115], [6114, 6116, 6234], [6115, 6117], [6061, 6116, 6118], [6117, 6119], [6118, 6120, 6235], [6119, 6121], [6062, 6120, 6122], [6121, 6123], [6122, 6124, 6236], [6123, 6125], [6063, 6124, 6126], [6125, 6127], [6126, 6128, 6237], [6127, 6129], [6064, 6128, 6130], [6129, 6131], [6130, 6132, 6238], [6131, 6133], [6065, 6132, 6134], [6133, 6135], [6134, 6136, 6239], [6135, 6137], [6066, 6136, 6138], [6137, 6139], [6138, 6140, 6240], [6139, 6141], [6067, 6140, 6142], [6141, 6143], [6142, 6144, 6241], [6143, 6145], [6068, 6144, 6146], [6145, 6147], [6146, 6148, 6242], [6147, 6149], [6069, 6148, 6150], [6149, 6151], [6150, 6152, 6243], [6151, 6153], [6070, 6152, 6154], [6153, 6155], [6154, 6156, 6244], [6155, 6157], [6071, 6156, 6158], [6157, 6159], [6158, 6160, 6245], [6159, 6161], [6072, 6160, 6162], [6161, 6163], [6162, 6164, 6246], [6163, 6165], [6073, 6164, 6166], [6165, 6167], [6166, 6168, 6247], [6167, 6169], [6074, 6168, 6170], [6169, 6171], [6170, 6172, 6248], [6171, 6173], [6075, 6172, 6174], [6173, 6175], [6174, 6176, 6249], [6175, 6177], [6076, 6176, 6178], [6177, 6179], [6178, 6180, 6250], [6179, 6181], [6077, 6180, 6182], [6181, 6183], [6182, 6184, 6251], [6183, 6185], [6078, 6184, 6186], [6185, 6187], [6186, 6188, 6252], [6187, 6189], [6079, 6188, 6190], [6189, 6191], [6190, 6192, 6253], [6191, 6193], [6080, 6192, 6194], [6193, 6195], [6194, 6196, 6254], [6195, 6197], [6081, 6196, 6198], [6197, 6199], [6198, 6200, 6255], [6199, 6201], [6082, 6200, 6202], [6201, 6203], [6202, 6204, 6256], [6203, 6205], [6083, 6204, 6206], [6205, 6207], [6206, 6208, 6257], [6207, 6209], [6084, 6208, 6210], [6209, 6211], [6210, 6212, 6258], [6211, 6213], [6085, 6212, 6214], [6213, 6215], [6214, 6216, 6259], [6215, 6217], [6086, 6216, 6218], [6217, 6219], [6218, 6220, 6260], [6219, 6221], [6087, 6220, 6222], [6221, 6223], [6222, 6224, 6261], [6223, 6225], [6088, 6224, 6226], [6225, 6227], [6226, 6262], [6091, 6265], [6095, 6269], [6099, 6273], [6103, 6277], [6107, 6281], [6111, 6285], [6115, 6289], [6119, 6293], [6123, 6297], [6127, 6301], [6131, 6305], [6135, 6309], [6139, 6313], [6143, 6317], [6147, 6321], [6151, 6325], [6155, 6329], [6159, 6333], [6163, 6337], [6167, 6341], [6171, 6345], [6175, 6349], [6179, 6353], [6183, 6357], [6187, 6361], [6191, 6365], [6195, 6369], [6199, 6373], [6203, 6377], [6207, 6381], [6211, 6385], [6215, 6389], [6219, 6393], [6223, 6397], [6227, 6401], [6264, 6402], [6263, 6265], [6228, 6264, 6266], [6265, 6267], [6266, 6268, 6403], [6267, 6269], [6229, 6268, 6270], [6269, 6271], [6270, 6272, 6404], [6271, 6273], [6230, 6272, 6274], [6273, 6275], [6274, 6276, 6405], [6275, 6277], [6231, 6276, 6278], [6277, 6279], [6278, 6280, 6406], [6279, 6281], [6232, 6280, 6282], [6281, 6283], [6282, 6284, 6407], [6283, 6285], [6233, 6284, 6286], [6285, 6287], [6286, 6288, 6408], [6287, 6289], [6234, 6288, 6290], [6289, 6291], [6290, 6292, 6409], [6291, 6293], [6235, 6292, 6294], [6293, 6295], [6294, 6296, 6410], [6295, 6297], [6236, 6296, 6298], [6297, 6299], [6298, 6300, 6411], [6299, 6301], [6237, 6300, 6302], [6301, 6303], [6302, 6304, 6412], [6303, 6305], [6238, 6304, 6306], [6305, 6307], [6306, 6308, 6413], [6307, 6309], [6239, 6308, 6310], [6309, 6311], [6310, 6312, 6414], [6311, 6313], [6240, 6312, 6314], [6313, 6315], [6314, 6316, 6415], [6315, 6317], [6241, 6316, 6318], [6317, 6319], [6318, 6320, 6416], [6319, 6321], [6242, 6320, 6322], [6321, 6323], [6322, 6324, 6417], [6323, 6325], [6243, 6324, 6326], [6325, 6327], [6326, 6328, 6418], [6327, 6329], [6244, 6328, 6330], [6329, 6331], [6330, 6332, 6419], [6331, 6333], [6245, 6332, 6334], [6333, 6335], [6334, 6336, 6420], [6335, 6337], [6246, 6336, 6338], [6337, 6339], [6338, 6340, 6421], [6339, 6341], [6247, 6340, 6342], [6341, 6343], [6342, 6344, 6422], [6343, 6345], [6248, 6344, 6346], [6345, 6347], [6346, 6348, 6423], [6347, 6349], [6249, 6348, 6350], [6349, 6351], [6350, 6352, 6424], [6351, 6353], [6250, 6352, 6354], [6353, 6355], [6354, 6356, 6425], [6355, 6357], [6251, 6356, 6358], [6357, 6359], [6358, 6360, 6426], [6359, 6361], [6252, 6360, 6362], [6361, 6363], [6362, 6364, 6427], [6363, 6365], [6253, 6364, 6366], [6365, 6367], [6366, 6368, 6428], [6367, 6369], [6254, 6368, 6370], [6369, 6371], [6370, 6372, 6429], [6371, 6373], [6255, 6372, 6374], [6373, 6375], [6374, 6376, 6430], [6375, 6377], [6256, 6376, 6378], [6377, 6379], [6378, 6380, 6431], [6379, 6381], [6257, 6380, 6382], [6381, 6383], [6382, 6384, 6432], [6383, 6385], [6258, 6384, 6386], [6385, 6387], [6386, 6388, 6433], [6387, 6389], [6259, 6388, 6390], [6389, 6391], [6390, 6392, 6434], [6391, 6393], [6260, 6392, 6394], [6393, 6395], [6394, 6396, 6435], [6395, 6397], [6261, 6396, 6398], [6397, 6399], [6398, 6400, 6436], [6399, 6401], [6262, 6400], [6263, 6437], [6267, 6441], [6271, 6445], [6275, 6449], [6279, 6453], [6283, 6457], [6287, 6461], [6291, 6465], [6295, 6469], [6299, 6473], [6303, 6477], [6307, 6481], [6311, 6485], [6315, 6489], [6319, 6493], [6323, 6497], [6327, 6501], [6331, 6505], [6335, 6509], [6339, 6513], [6343, 6517], [6347, 6521], [6351, 6525], [6355, 6529], [6359, 6533], [6363, 6537], [6367, 6541], [6371, 6545], [6375, 6549], [6379, 6553], [6383, 6557], [6387, 6561], [6391, 6565], [6395, 6569], [6399, 6573], [6402, 6438], [6437, 6439], [6438, 6440, 6576], [6439, 6441], [6403, 6440, 6442], [6441, 6443], [6442, 6444, 6577], [6443, 6445], [6404, 6444, 6446], [6445, 6447], [6446, 6448, 6578], [6447, 6449], [6405, 6448, 6450], [6449, 6451], [6450, 6452, 6579], [6451, 6453], [6406, 6452, 6454], [6453, 6455], [6454, 6456, 6580], [6455, 6457], [6407, 6456, 6458], [6457, 6459], [6458, 6460, 6581], [6459, 6461], [6408, 6460, 6462], [6461, 6463], [6462, 6464, 6582], [6463, 6465], [6409, 6464, 6466], [6465, 6467], [6466, 6468, 6583], [6467, 6469], [6410, 6468, 6470], [6469, 6471], [6470, 6472, 6584], [6471, 6473], [6411, 6472, 6474], [6473, 6475], [6474, 6476, 6585], [6475, 6477], [6412, 6476, 6478], [6477, 6479], [6478, 6480, 6586], [6479, 6481], [6413, 6480, 6482], [6481, 6483], [6482, 6484, 6587], [6483, 6485], [6414, 6484, 6486], [6485, 6487], [6486, 6488, 6588], [6487, 6489], [6415, 6488, 6490], [6489, 6491], [6490, 6492, 6589], [6491, 6493], [6416, 6492, 6494], [6493, 6495], [6494, 6496, 6590], [6495, 6497], [6417, 6496, 6498], [6497, 6499], [6498, 6500, 6591], [6499, 6501], [6418, 6500, 6502], [6501, 6503], [6502, 6504, 6592], [6503, 6505], [6419, 6504, 6506], [6505, 6507], [6506, 6508, 6593], [6507, 6509], [6420, 6508, 6510], [6509, 6511], [6510, 6512, 6594], [6511, 6513], [6421, 6512, 6514], [6513, 6515], [6514, 6516, 6595], [6515, 6517], [6422, 6516, 6518], [6517, 6519], [6518, 6520, 6596], [6519, 6521], [6423, 6520, 6522], [6521, 6523], [6522, 6524, 6597], [6523, 6525], [6424, 6524, 6526], [6525, 6527], [6526, 6528, 6598], [6527, 6529], [6425, 6528, 6530], [6529, 6531], [6530, 6532, 6599], [6531, 6533], [6426, 6532, 6534], [6533, 6535], [6534, 6536, 6600], [6535, 6537], [6427, 6536, 6538], [6537, 6539], [6538, 6540, 6601], [6539, 6541], [6428, 6540, 6542], [6541, 6543], [6542, 6544, 6602], [6543, 6545], [6429, 6544, 6546], [6545, 6547], [6546, 6548, 6603], [6547, 6549], [6430, 6548, 6550], [6549, 6551], [6550, 6552, 6604], [6551, 6553], [6431, 6552, 6554], [6553, 6555], [6554, 6556, 6605], [6555, 6557], [6432, 6556, 6558], [6557, 6559], [6558, 6560, 6606], [6559, 6561], [6433, 6560, 6562], [6561, 6563], [6562, 6564, 6607], [6563, 6565], [6434, 6564, 6566], [6565, 6567], [6566, 6568, 6608], [6567, 6569], [6435, 6568, 6570], [6569, 6571], [6570, 6572, 6609], [6571, 6573], [6436, 6572, 6574], [6573, 6575], [6574, 6610], [6439, 6613], [6443, 6617], [6447, 6621], [6451, 6625], [6455, 6629], [6459, 6633], [6463, 6637], [6467, 6641], [6471, 6645], [6475, 6649], [6479, 6653], [6483, 6657], [6487, 6661], [6491, 6665], [6495, 6669], [6499, 6673], [6503, 6677], [6507, 6681], [6511, 6685], [6515, 6689], [6519, 6693], [6523, 6697], [6527, 6701], [6531, 6705], [6535, 6709], [6539, 6713], [6543, 6717], [6547, 6721], [6551, 6725], [6555, 6729], [6559, 6733], [6563, 6737], [6567, 6741], [6571, 6745], [6575, 6749], [6612, 6750], [6611, 6613], [6576, 6612, 6614], [6613, 6615], [6614, 6616, 6751], [6615, 6617], [6577, 6616, 6618], [6617, 6619], [6618, 6620, 6752], [6619, 6621], [6578, 6620, 6622], [6621, 6623], [6622, 6624, 6753], [6623, 6625], [6579, 6624, 6626], [6625, 6627], [6626, 6628, 6754], [6627, 6629], [6580, 6628, 6630], [6629, 6631], [6630, 6632, 6755], [6631, 6633], [6581, 6632, 6634], [6633, 6635], [6634, 6636, 6756], [6635, 6637], [6582, 6636, 6638], [6637, 6639], [6638, 6640, 6757], [6639, 6641], [6583, 6640, 6642], [6641, 6643], [6642, 6644, 6758], [6643, 6645], [6584, 6644, 6646], [6645, 6647], [6646, 6648, 6759], [6647, 6649], [6585, 6648, 6650], [6649, 6651], [6650, 6652, 6760], [6651, 6653], [6586, 6652, 6654], [6653, 6655], [6654, 6656, 6761], [6655, 6657], [6587, 6656, 6658], [6657, 6659], [6658, 6660, 6762], [6659, 6661], [6588, 6660, 6662], [6661, 6663], [6662, 6664, 6763], [6663, 6665], [6589, 6664, 6666], [6665, 6667], [6666, 6668, 6764], [6667, 6669], [6590, 6668, 6670], [6669, 6671], [6670, 6672, 6765], [6671, 6673], [6591, 6672, 6674], [6673, 6675], [6674, 6676, 6766], [6675, 6677], [6592, 6676, 6678], [6677, 6679], [6678, 6680, 6767], [6679, 6681], [6593, 6680, 6682], [6681, 6683], [6682, 6684, 6768], [6683, 6685], [6594, 6684, 6686], [6685, 6687], [6686, 6688, 6769], [6687, 6689], [6595, 6688, 6690], [6689, 6691], [6690, 6692, 6770], [6691, 6693], [6596, 6692, 6694], [6693, 6695], [6694, 6696, 6771], [6695, 6697], [6597, 6696, 6698], [6697, 6699], [6698, 6700, 6772], [6699, 6701], [6598, 6700, 6702], [6701, 6703], [6702, 6704, 6773], [6703, 6705], [6599, 6704, 6706], [6705, 6707], [6706, 6708, 6774], [6707, 6709], [6600, 6708, 6710], [6709, 6711], [6710, 6712, 6775], [6711, 6713], [6601, 6712, 6714], [6713, 6715], [6714, 6716, 6776], [6715, 6717], [6602, 6716, 6718], [6717, 6719], [6718, 6720, 6777], [6719, 6721], [6603, 6720, 6722], [6721, 6723], [6722, 6724, 6778], [6723, 6725], [6604, 6724, 6726], [6725, 6727], [6726, 6728, 6779], [6727, 6729], [6605, 6728, 6730], [6729, 6731], [6730, 6732, 6780], [6731, 6733], [6606, 6732, 6734], [6733, 6735], [6734, 6736, 6781], [6735, 6737], [6607, 6736, 6738], [6737, 6739], [6738, 6740, 6782], [6739, 6741], [6608, 6740, 6742], [6741, 6743], [6742, 6744, 6783], [6743, 6745], [6609, 6744, 6746], [6745, 6747], [6746, 6748, 6784], [6747, 6749], [6610, 6748], [6611, 6785], [6615, 6789], [6619, 6793], [6623, 6797], [6627, 6801], [6631, 6805], [6635, 6809], [6639, 6813], [6643, 6817], [6647, 6821], [6651, 6825], [6655, 6829], [6659, 6833], [6663, 6837], [6667, 6841], [6671, 6845], [6675, 6849], [6679, 6853], [6683, 6857], [6687, 6861], [6691, 6865], [6695, 6869], [6699, 6873], [6703, 6877], [6707, 6881], [6711, 6885], [6715, 6889], [6719, 6893], [6723, 6897], [6727, 6901], [6731, 6905], [6735, 6909], [6739, 6913], [6743, 6917], [6747, 6921], [6750, 6786], [6785, 6787], [6786, 6788, 6924], [6787, 6789], [6751, 6788, 6790], [6789, 6791], [6790, 6792, 6925], [6791, 6793], [6752, 6792, 6794], [6793, 6795], [6794, 6796, 6926], [6795, 6797], [6753, 6796, 6798], [6797, 6799], [6798, 6800, 6927], [6799, 6801], [6754, 6800, 6802], [6801, 6803], [6802, 6804, 6928], [6803, 6805], [6755, 6804, 6806], [6805, 6807], [6806, 6808, 6929], [6807, 6809], [6756, 6808, 6810], [6809, 6811], [6810, 6812, 6930], [6811, 6813], [6757, 6812, 6814], [6813, 6815], [6814, 6816, 6931], [6815, 6817], [6758, 6816, 6818], [6817, 6819], [6818, 6820, 6932], [6819, 6821], [6759, 6820, 6822], [6821, 6823], [6822, 6824, 6933], [6823, 6825], [6760, 6824, 6826], [6825, 6827], [6826, 6828, 6934], [6827, 6829], [6761, 6828, 6830], [6829, 6831], [6830, 6832, 6935], [6831, 6833], [6762, 6832, 6834], [6833, 6835], [6834, 6836, 6936], [6835, 6837], [6763, 6836, 6838], [6837, 6839], [6838, 6840, 6937], [6839, 6841], [6764, 6840, 6842], [6841, 6843], [6842, 6844, 6938], [6843, 6845], [6765, 6844, 6846], [6845, 6847], [6846, 6848, 6939], [6847, 6849], [6766, 6848, 6850], [6849, 6851], [6850, 6852, 6940], [6851, 6853], [6767, 6852, 6854], [6853, 6855], [6854, 6856, 6941], [6855, 6857], [6768, 6856, 6858], [6857, 6859], [6858, 6860, 6942], [6859, 6861], [6769, 6860, 6862], [6861, 6863], [6862, 6864, 6943], [6863, 6865], [6770, 6864, 6866], [6865, 6867], [6866, 6868, 6944], [6867, 6869], [6771, 6868, 6870], [6869, 6871], [6870, 6872, 6945], [6871, 6873], [6772, 6872, 6874], [6873, 6875], [6874, 6876, 6946], [6875, 6877], [6773, 6876, 6878], [6877, 6879], [6878, 6880, 6947], [6879, 6881], [6774, 6880, 6882], [6881, 6883], [6882, 6884, 6948], [6883, 6885], [6775, 6884, 6886], [6885, 6887], [6886, 6888, 6949], [6887, 6889], [6776, 6888, 6890], [6889, 6891], [6890, 6892, 6950], [6891, 6893], [6777, 6892, 6894], [6893, 6895], [6894, 6896, 6951], [6895, 6897], [6778, 6896, 6898], [6897, 6899], [6898, 6900, 6952], [6899, 6901], [6779, 6900, 6902], [6901, 6903], [6902, 6904, 6953], [6903, 6905], [6780, 6904, 6906], [6905, 6907], [6906, 6908, 6954], [6907, 6909], [6781, 6908, 6910], [6909, 6911], [6910, 6912, 6955], [6911, 6913], [6782, 6912, 6914], [6913, 6915], [6914, 6916, 6956], [6915, 6917], [6783, 6916, 6918], [6917, 6919], [6918, 6920, 6957], [6919, 6921], [6784, 6920, 6922], [6921, 6923], [6922, 6958], [6787, 6961], [6791, 6965], [6795, 6969], [6799, 6973], [6803, 6977], [6807, 6981], [6811, 6985], [6815, 6989], [6819, 6993], [6823, 6997], [6827, 7001], [6831, 7005], [6835, 7009], [6839, 7013], [6843, 7017], [6847, 7021], [6851, 7025], [6855, 7029], [6859, 7033], [6863, 7037], [6867, 7041], [6871, 7045], [6875, 7049], [6879, 7053], [6883, 7057], [6887, 7061], [6891, 7065], [6895, 7069], [6899, 7073], [6903, 7077], [6907, 7081], [6911, 7085], [6915, 7089], [6919, 7093], [6923, 7097], [6960, 7098], [6959, 6961], [6924, 6960, 6962], [6961, 6963], [6962, 6964, 7099], [6963, 6965], [6925, 6964, 6966], [6965, 6967], [6966, 6968, 7100], [6967, 6969], [6926, 6968, 6970], [6969, 6971], [6970, 6972, 7101], [6971, 6973], [6927, 6972, 6974], [6973, 6975], [6974, 6976, 7102], [6975, 6977], [6928, 6976, 6978], [6977, 6979], [6978, 6980, 7103], [6979, 6981], [6929, 6980, 6982], [6981, 6983], [6982, 6984, 7104], [6983, 6985], [6930, 6984, 6986], [6985, 6987], [6986, 6988, 7105], [6987, 6989], [6931, 6988, 6990], [6989, 6991], [6990, 6992, 7106], [6991, 6993], [6932, 6992, 6994], [6993, 6995], [6994, 6996, 7107], [6995, 6997], [6933, 6996, 6998], [6997, 6999], [6998, 7000, 7108], [6999, 7001], [6934, 7000, 7002], [7001, 7003], [7002, 7004, 7109], [7003, 7005], [6935, 7004, 7006], [7005, 7007], [7006, 7008, 7110], [7007, 7009], [6936, 7008, 7010], [7009, 7011], [7010, 7012, 7111], [7011, 7013], [6937, 7012, 7014], [7013, 7015], [7014, 7016, 7112], [7015, 7017], [6938, 7016, 7018], [7017, 7019], [7018, 7020, 7113], [7019, 7021], [6939, 7020, 7022], [7021, 7023], [7022, 7024, 7114], [7023, 7025], [6940, 7024, 7026], [7025, 7027], [7026, 7028, 7115], [7027, 7029], [6941, 7028, 7030], [7029, 7031], [7030, 7032, 7116], [7031, 7033], [6942, 7032, 7034], [7033, 7035], [7034, 7036, 7117], [7035, 7037], [6943, 7036, 7038], [7037, 7039], [7038, 7040, 7118], [7039, 7041], [6944, 7040, 7042], [7041, 7043], [7042, 7044, 7119], [7043, 7045], [6945, 7044, 7046], [7045, 7047], [7046, 7048, 7120], [7047, 7049], [6946, 7048, 7050], [7049, 7051], [7050, 7052, 7121], [7051, 7053], [6947, 7052, 7054], [7053, 7055], [7054, 7056, 7122], [7055, 7057], [6948, 7056, 7058], [7057, 7059], [7058, 7060, 7123], [7059, 7061], [6949, 7060, 7062], [7061, 7063], [7062, 7064, 7124], [7063, 7065], [6950, 7064, 7066], [7065, 7067], [7066, 7068, 7125], [7067, 7069], [6951, 7068, 7070], [7069, 7071], [7070, 7072, 7126], [7071, 7073], [6952, 7072, 7074], [7073, 7075], [7074, 7076, 7127], [7075, 7077], [6953, 7076, 7078], [7077, 7079], [7078, 7080, 7128], [7079, 7081], [6954, 7080, 7082], [7081, 7083], [7082, 7084, 7129], [7083, 7085], [6955, 7084, 7086], [7085, 7087], [7086, 7088, 7130], [7087, 7089], [6956, 7088, 7090], [7089, 7091], [7090, 7092, 7131], [7091, 7093], [6957, 7092, 7094], [7093, 7095], [7094, 7096, 7132], [7095, 7097], [6958, 7096], [6959, 7133], [6963, 7137], [6967, 7141], [6971, 7145], [6975, 7149], [6979, 7153], [6983, 7157], [6987, 7161], [6991, 7165], [6995, 7169], [6999, 7173], [7003, 7177], [7007, 7181], [7011, 7185], [7015, 7189], [7019, 7193], [7023, 7197], [7027, 7201], [7031, 7205], [7035, 7209], [7039, 7213], [7043, 7217], [7047, 7221], [7051, 7225], [7055, 7229], [7059, 7233], [7063, 7237], [7067, 7241], [7071, 7245], [7075, 7249], [7079, 7253], [7083, 7257], [7087, 7261], [7091, 7265], [7095, 7269], [7098, 7134], [7133, 7135], [7134, 7136, 7272], [7135, 7137], [7099, 7136, 7138], [7137, 7139], [7138, 7140, 7273], [7139, 7141], [7100, 7140, 7142], [7141, 7143], [7142, 7144, 7274], [7143, 7145], [7101, 7144, 7146], [7145, 7147], [7146, 7148, 7275], [7147, 7149], [7102, 7148, 7150], [7149, 7151], [7150, 7152, 7276], [7151, 7153], [7103, 7152, 7154], [7153, 7155], [7154, 7156, 7277], [7155, 7157], [7104, 7156, 7158], [7157, 7159], [7158, 7160, 7278], [7159, 7161], [7105, 7160, 7162], [7161, 7163], [7162, 7164, 7279], [7163, 7165], [7106, 7164, 7166], [7165, 7167], [7166, 7168, 7280], [7167, 7169], [7107, 7168, 7170], [7169, 7171], [7170, 7172, 7281], [7171, 7173], [7108, 7172, 7174], [7173, 7175], [7174, 7176, 7282], [7175, 7177], [7109, 7176, 7178], [7177, 7179], [7178, 7180, 7283], [7179, 7181], [7110, 7180, 7182], [7181, 7183], [7182, 7184, 7284], [7183, 7185], [7111, 7184, 7186], [7185, 7187], [7186, 7188, 7285], [7187, 7189], [7112, 7188, 7190], [7189, 7191], [7190, 7192, 7286], [7191, 7193], [7113, 7192, 7194], [7193, 7195], [7194, 7196, 7287], [7195, 7197], [7114, 7196, 7198], [7197, 7199], [7198, 7200, 7288], [7199, 7201], [7115, 7200, 7202], [7201, 7203], [7202, 7204, 7289], [7203, 7205], [7116, 7204, 7206], [7205, 7207], [7206, 7208, 7290], [7207, 7209], [7117, 7208, 7210], [7209, 7211], [7210, 7212, 7291], [7211, 7213], [7118, 7212, 7214], [7213, 7215], [7214, 7216, 7292], [7215, 7217], [7119, 7216, 7218], [7217, 7219], [7218, 7220, 7293], [7219, 7221], [7120, 7220, 7222], [7221, 7223], [7222, 7224, 7294], [7223, 7225], [7121, 7224, 7226], [7225, 7227], [7226, 7228, 7295], [7227, 7229], [7122, 7228, 7230], [7229, 7231], [7230, 7232, 7296], [7231, 7233], [7123, 7232, 7234], [7233, 7235], [7234, 7236, 7297], [7235, 7237], [7124, 7236, 7238], [7237, 7239], [7238, 7240, 7298], [7239, 7241], [7125, 7240, 7242], [7241, 7243], [7242, 7244, 7299], [7243, 7245], [7126, 7244, 7246], [7245, 7247], [7246, 7248, 7300], [7247, 7249], [7127, 7248, 7250], [7249, 7251], [7250, 7252, 7301], [7251, 7253], [7128, 7252, 7254], [7253, 7255], [7254, 7256, 7302], [7255, 7257], [7129, 7256, 7258], [7257, 7259], [7258, 7260, 7303], [7259, 7261], [7130, 7260, 7262], [7261, 7263], [7262, 7264, 7304], [7263, 7265], [7131, 7264, 7266], [7265, 7267], [7266, 7268, 7305], [7267, 7269], [7132, 7268, 7270], [7269, 7271], [7270, 7306], [7135, 7309], [7139, 7313], [7143, 7317], [7147, 7321], [7151, 7325], [7155, 7329], [7159, 7333], [7163, 7337], [7167, 7341], [7171, 7345], [7175, 7349], [7179, 7353], [7183, 7357], [7187, 7361], [7191, 7365], [7195, 7369], [7199, 7373], [7203, 7377], [7207, 7381], [7211, 7385], [7215, 7389], [7219, 7393], [7223, 7397], [7227, 7401], [7231, 7405], [7235, 7409], [7239, 7413], [7243, 7417], [7247, 7421], [7251, 7425], [7255, 7429], [7259, 7433], [7263, 7437], [7267, 7441], [7271, 7445], [7308, 7446], [7307, 7309], [7272, 7308, 7310], [7309, 7311], [7310, 7312, 7447], [7311, 7313], [7273, 7312, 7314], [7313, 7315], [7314, 7316, 7448], [7315, 7317], [7274, 7316, 7318], [7317, 7319], [7318, 7320, 7449], [7319, 7321], [7275, 7320, 7322], [7321, 7323], [7322, 7324, 7450], [7323, 7325], [7276, 7324, 7326], [7325, 7327], [7326, 7328, 7451], [7327, 7329], [7277, 7328, 7330], [7329, 7331], [7330, 7332, 7452], [7331, 7333], [7278, 7332, 7334], [7333, 7335], [7334, 7336, 7453], [7335, 7337], [7279, 7336, 7338], [7337, 7339], [7338, 7340, 7454], [7339, 7341], [7280, 7340, 7342], [7341, 7343], [7342, 7344, 7455], [7343, 7345], [7281, 7344, 7346], [7345, 7347], [7346, 7348, 7456], [7347, 7349], [7282, 7348, 7350], [7349, 7351], [7350, 7352, 7457], [7351, 7353], [7283, 7352, 7354], [7353, 7355], [7354, 7356, 7458], [7355, 7357], [7284, 7356, 7358], [7357, 7359], [7358, 7360, 7459], [7359, 7361], [7285, 7360, 7362], [7361, 7363], [7362, 7364, 7460], [7363, 7365], [7286, 7364, 7366], [7365, 7367], [7366, 7368, 7461], [7367, 7369], [7287, 7368, 7370], [7369, 7371], [7370, 7372, 7462], [7371, 7373], [7288, 7372, 7374], [7373, 7375], [7374, 7376, 7463], [7375, 7377], [7289, 7376, 7378], [7377, 7379], [7378, 7380, 7464], [7379, 7381], [7290, 7380, 7382], [7381, 7383], [7382, 7384, 7465], [7383, 7385], [7291, 7384, 7386], [7385, 7387], [7386, 7388, 7466], [7387, 7389], [7292, 7388, 7390], [7389, 7391], [7390, 7392, 7467], [7391, 7393], [7293, 7392, 7394], [7393, 7395], [7394, 7396, 7468], [7395, 7397], [7294, 7396, 7398], [7397, 7399], [7398, 7400, 7469], [7399, 7401], [7295, 7400, 7402], [7401, 7403], [7402, 7404, 7470], [7403, 7405], [7296, 7404, 7406], [7405, 7407], [7406, 7408, 7471], [7407, 7409], [7297, 7408, 7410], [7409, 7411], [7410, 7412, 7472], [7411, 7413], [7298, 7412, 7414], [7413, 7415], [7414, 7416, 7473], [7415, 7417], [7299, 7416, 7418], [7417, 7419], [7418, 7420, 7474], [7419, 7421], [7300, 7420, 7422], [7421, 7423], [7422, 7424, 7475], [7423, 7425], [7301, 7424, 7426], [7425, 7427], [7426, 7428, 7476], [7427, 7429], [7302, 7428, 7430], [7429, 7431], [7430, 7432, 7477], [7431, 7433], [7303, 7432, 7434], [7433, 7435], [7434, 7436, 7478], [7435, 7437], [7304, 7436, 7438], [7437, 7439], [7438, 7440, 7479], [7439, 7441], [7305, 7440, 7442], [7441, 7443], [7442, 7444, 7480], [7443, 7445], [7306, 7444], [7307, 7481], [7311, 7485], [7315, 7489], [7319, 7493], [7323, 7497], [7327, 7501], [7331, 7505], [7335, 7509], [7339, 7513], [7343, 7517], [7347, 7521], [7351, 7525], [7355, 7529], [7359, 7533], [7363, 7537], [7367, 7541], [7371, 7545], [7375, 7549], [7379, 7553], [7383, 7557], [7387, 7561], [7391, 7565], [7395, 7569], [7399, 7573], [7403, 7577], [7407, 7581], [7411, 7585], [7415, 7589], [7419, 7593], [7423, 7597], [7427, 7601], [7431, 7605], [7435, 7609], [7439, 7613], [7443, 7617], [7446, 7482], [7481, 7483], [7482, 7484, 7620], [7483, 7485], [7447, 7484, 7486], [7485, 7487], [7486, 7488, 7621], [7487, 7489], [7448, 7488, 7490], [7489, 7491], [7490, 7492, 7622], [7491, 7493], [7449, 7492, 7494], [7493, 7495], [7494, 7496, 7623], [7495, 7497], [7450, 7496, 7498], [7497, 7499], [7498, 7500, 7624], [7499, 7501], [7451, 7500, 7502], [7501, 7503], [7502, 7504, 7625], [7503, 7505], [7452, 7504, 7506], [7505, 7507], [7506, 7508, 7626], [7507, 7509], [7453, 7508, 7510], [7509, 7511], [7510, 7512, 7627], [7511, 7513], [7454, 7512, 7514], [7513, 7515], [7514, 7516, 7628], [7515, 7517], [7455, 7516, 7518], [7517, 7519], [7518, 7520, 7629], [7519, 7521], [7456, 7520, 7522], [7521, 7523], [7522, 7524, 7630], [7523, 7525], [7457, 7524, 7526], [7525, 7527], [7526, 7528, 7631], [7527, 7529], [7458, 7528, 7530], [7529, 7531], [7530, 7532, 7632], [7531, 7533], [7459, 7532, 7534], [7533, 7535], [7534, 7536, 7633], [7535, 7537], [7460, 7536, 7538], [7537, 7539], [7538, 7540, 7634], [7539, 7541], [7461, 7540, 7542], [7541, 7543], [7542, 7544, 7635], [7543, 7545], [7462, 7544, 7546], [7545, 7547], [7546, 7548, 7636], [7547, 7549], [7463, 7548, 7550], [7549, 7551], [7550, 7552, 7637], [7551, 7553], [7464, 7552, 7554], [7553, 7555], [7554, 7556, 7638], [7555, 7557], [7465, 7556, 7558], [7557, 7559], [7558, 7560, 7639], [7559, 7561], [7466, 7560, 7562], [7561, 7563], [7562, 7564, 7640], [7563, 7565], [7467, 7564, 7566], [7565, 7567], [7566, 7568, 7641], [7567, 7569], [7468, 7568, 7570], [7569, 7571], [7570, 7572, 7642], [7571, 7573], [7469, 7572, 7574], [7573, 7575], [7574, 7576, 7643], [7575, 7577], [7470, 7576, 7578], [7577, 7579], [7578, 7580, 7644], [7579, 7581], [7471, 7580, 7582], [7581, 7583], [7582, 7584, 7645], [7583, 7585], [7472, 7584, 7586], [7585, 7587], [7586, 7588, 7646], [7587, 7589], [7473, 7588, 7590], [7589, 7591], [7590, 7592, 7647], [7591, 7593], [7474, 7592, 7594], [7593, 7595], [7594, 7596, 7648], [7595, 7597], [7475, 7596, 7598], [7597, 7599], [7598, 7600, 7649], [7599, 7601], [7476, 7600, 7602], [7601, 7603], [7602, 7604, 7650], [7603, 7605], [7477, 7604, 7606], [7605, 7607], [7606, 7608, 7651], [7607, 7609], [7478, 7608, 7610], [7609, 7611], [7610, 7612, 7652], [7611, 7613], [7479, 7612, 7614], [7613, 7615], [7614, 7616, 7653], [7615, 7617], [7480, 7616, 7618], [7617, 7619], [7618, 7654], [7483, 7657], [7487, 7661], [7491, 7665], [7495, 7669], [7499, 7673], [7503, 7677], [7507, 7681], [7511, 7685], [7515, 7689], [7519, 7693], [7523, 7697], [7527, 7701], [7531, 7705], [7535, 7709], [7539, 7713], [7543, 7717], [7547, 7721], [7551, 7725], [7555, 7729], [7559, 7733], [7563, 7737], [7567, 7741], [7571, 7745], [7575, 7749], [7579, 7753], [7583, 7757], [7587, 7761], [7591, 7765], [7595, 7769], [7599, 7773], [7603, 7777], [7607, 7781], [7611, 7785], [7615, 7789], [7619, 7793], [7656, 7794], [7655, 7657], [7620, 7656, 7658], [7657, 7659], [7658, 7660, 7795], [7659, 7661], [7621, 7660, 7662], [7661, 7663], [7662, 7664, 7796], [7663, 7665], [7622, 7664, 7666], [7665, 7667], [7666, 7668, 7797], [7667, 7669], [7623, 7668, 7670], [7669, 7671], [7670, 7672, 7798], [7671, 7673], [7624, 7672, 7674], [7673, 7675], [7674, 7676, 7799], [7675, 7677], [7625, 7676, 7678], [7677, 7679], [7678, 7680, 7800], [7679, 7681], [7626, 7680, 7682], [7681, 7683], [7682, 7684, 7801], [7683, 7685], [7627, 7684, 7686], [7685, 7687], [7686, 7688, 7802], [7687, 7689], [7628, 7688, 7690], [7689, 7691], [7690, 7692, 7803], [7691, 7693], [7629, 7692, 7694], [7693, 7695], [7694, 7696, 7804], [7695, 7697], [7630, 7696, 7698], [7697, 7699], [7698, 7700, 7805], [7699, 7701], [7631, 7700, 7702], [7701, 7703], [7702, 7704, 7806], [7703, 7705], [7632, 7704, 7706], [7705, 7707], [7706, 7708, 7807], [7707, 7709], [7633, 7708, 7710], [7709, 7711], [7710, 7712, 7808], [7711, 7713], [7634, 7712, 7714], [7713, 7715], [7714, 7716, 7809], [7715, 7717], [7635, 7716, 7718], [7717, 7719], [7718, 7720, 7810], [7719, 7721], [7636, 7720, 7722], [7721, 7723], [7722, 7724, 7811], [7723, 7725], [7637, 7724, 7726], [7725, 7727], [7726, 7728, 7812], [7727, 7729], [7638, 7728, 7730], [7729, 7731], [7730, 7732, 7813], [7731, 7733], [7639, 7732, 7734], [7733, 7735], [7734, 7736, 7814], [7735, 7737], [7640, 7736, 7738], [7737, 7739], [7738, 7740, 7815], [7739, 7741], [7641, 7740, 7742], [7741, 7743], [7742, 7744, 7816], [7743, 7745], [7642, 7744, 7746], [7745, 7747], [7746, 7748, 7817], [7747, 7749], [7643, 7748, 7750], [7749, 7751], [7750, 7752, 7818], [7751, 7753], [7644, 7752, 7754], [7753, 7755], [7754, 7756, 7819], [7755, 7757], [7645, 7756, 7758], [7757, 7759], [7758, 7760, 7820], [7759, 7761], [7646, 7760, 7762], [7761, 7763], [7762, 7764, 7821], [7763, 7765], [7647, 7764, 7766], [7765, 7767], [7766, 7768, 7822], [7767, 7769], [7648, 7768, 7770], [7769, 7771], [7770, 7772, 7823], [7771, 7773], [7649, 7772, 7774], [7773, 7775], [7774, 7776, 7824], [7775, 7777], [7650, 7776, 7778], [7777, 7779], [7778, 7780, 7825], [7779, 7781], [7651, 7780, 7782], [7781, 7783], [7782, 7784, 7826], [7783, 7785], [7652, 7784, 7786], [7785, 7787], [7786, 7788, 7827], [7787, 7789], [7653, 7788, 7790], [7789, 7791], [7790, 7792, 7828], [7791, 7793], [7654, 7792], [7655, 7829], [7659, 7833], [7663, 7837], [7667, 7841], [7671, 7845], [7675, 7849], [7679, 7853], [7683, 7857], [7687, 7861], [7691, 7865], [7695, 7869], [7699, 7873], [7703, 7877], [7707, 7881], [7711, 7885], [7715, 7889], [7719, 7893], [7723, 7897], [7727, 7901], [7731, 7905], [7735, 7909], [7739, 7913], [7743, 7917], [7747, 7921], [7751, 7925], [7755, 7929], [7759, 7933], [7763, 7937], [7767, 7941], [7771, 7945], [7775, 7949], [7779, 7953], [7783, 7957], [7787, 7961], [7791, 7965], [7794, 7830], [7829, 7831], [7830, 7832, 7968], [7831, 7833], [7795, 7832, 7834], [7833, 7835], [7834, 7836, 7969], [7835, 7837], [7796, 7836, 7838], [7837, 7839], [7838, 7840, 7970], [7839, 7841], [7797, 7840, 7842], [7841, 7843], [7842, 7844, 7971], [7843, 7845], [7798, 7844, 7846], [7845, 7847], [7846, 7848, 7972], [7847, 7849], [7799, 7848, 7850], [7849, 7851], [7850, 7852, 7973], [7851, 7853], [7800, 7852, 7854], [7853, 7855], [7854, 7856, 7974], [7855, 7857], [7801, 7856, 7858], [7857, 7859], [7858, 7860, 7975], [7859, 7861], [7802, 7860, 7862], [7861, 7863], [7862, 7864, 7976], [7863, 7865], [7803, 7864, 7866], [7865, 7867], [7866, 7868, 7977], [7867, 7869], [7804, 7868, 7870], [7869, 7871], [7870, 7872, 7978], [7871, 7873], [7805, 7872, 7874], [7873, 7875], [7874, 7876, 7979], [7875, 7877], [7806, 7876, 7878], [7877, 7879], [7878, 7880, 7980], [7879, 7881], [7807, 7880, 7882], [7881, 7883], [7882, 7884, 7981], [7883, 7885], [7808, 7884, 7886], [7885, 7887], [7886, 7888, 7982], [7887, 7889], [7809, 7888, 7890], [7889, 7891], [7890, 7892, 7983], [7891, 7893], [7810, 7892, 7894], [7893, 7895], [7894, 7896, 7984], [7895, 7897], [7811, 7896, 7898], [7897, 7899], [7898, 7900, 7985], [7899, 7901], [7812, 7900, 7902], [7901, 7903], [7902, 7904, 7986], [7903, 7905], [7813, 7904, 7906], [7905, 7907], [7906, 7908, 7987], [7907, 7909], [7814, 7908, 7910], [7909, 7911], [7910, 7912, 7988], [7911, 7913], [7815, 7912, 7914], [7913, 7915], [7914, 7916, 7989], [7915, 7917], [7816, 7916, 7918], [7917, 7919], [7918, 7920, 7990], [7919, 7921], [7817, 7920, 7922], [7921, 7923], [7922, 7924, 7991], [7923, 7925], [7818, 7924, 7926], [7925, 7927], [7926, 7928, 7992], [7927, 7929], [7819, 7928, 7930], [7929, 7931], [7930, 7932, 7993], [7931, 7933], [7820, 7932, 7934], [7933, 7935], [7934, 7936, 7994], [7935, 7937], [7821, 7936, 7938], [7937, 7939], [7938, 7940, 7995], [7939, 7941], [7822, 7940, 7942], [7941, 7943], [7942, 7944, 7996], [7943, 7945], [7823, 7944, 7946], [7945, 7947], [7946, 7948, 7997], [7947, 7949], [7824, 7948, 7950], [7949, 7951], [7950, 7952, 7998], [7951, 7953], [7825, 7952, 7954], [7953, 7955], [7954, 7956, 7999], [7955, 7957], [7826, 7956, 7958], [7957, 7959], [7958, 7960, 8000], [7959, 7961], [7827, 7960, 7962], [7961, 7963], [7962, 7964, 8001], [7963, 7965], [7828, 7964, 7966], [7965, 7967], [7966, 8002], [7831, 8005], [7835, 8009], [7839, 8013], [7843, 8017], [7847, 8021], [7851, 8025], [7855, 8029], [7859, 8033], [7863, 8037], [7867, 8041], [7871, 8045], [7875, 8049], [7879, 8053], [7883, 8057], [7887, 8061], [7891, 8065], [7895, 8069], [7899, 8073], [7903, 8077], [7907, 8081], [7911, 8085], [7915, 8089], [7919, 8093], [7923, 8097], [7927, 8101], [7931, 8105], [7935, 8109], [7939, 8113], [7943, 8117], [7947, 8121], [7951, 8125], [7955, 8129], [7959, 8133], [7963, 8137], [7967, 8141], [8004, 8142], [8003, 8005], [7968, 8004, 8006], [8005, 8007], [8006, 8008, 8143], [8007, 8009], [7969, 8008, 8010], [8009, 8011], [8010, 8012, 8144], [8011, 8013], [7970, 8012, 8014], [8013, 8015], [8014, 8016, 8145], [8015, 8017], [7971, 8016, 8018], [8017, 8019], [8018, 8020, 8146], [8019, 8021], [7972, 8020, 8022], [8021, 8023], [8022, 8024, 8147], [8023, 8025], [7973, 8024, 8026], [8025, 8027], [8026, 8028, 8148], [8027, 8029], [7974, 8028, 8030], [8029, 8031], [8030, 8032, 8149], [8031, 8033], [7975, 8032, 8034], [8033, 8035], [8034, 8036, 8150], [8035, 8037], [7976, 8036, 8038], [8037, 8039], [8038, 8040, 8151], [8039, 8041], [7977, 8040, 8042], [8041, 8043], [8042, 8044, 8152], [8043, 8045], [7978, 8044, 8046], [8045, 8047], [8046, 8048, 8153], [8047, 8049], [7979, 8048, 8050], [8049, 8051], [8050, 8052, 8154], [8051, 8053], [7980, 8052, 8054], [8053, 8055], [8054, 8056, 8155], [8055, 8057], [7981, 8056, 8058], [8057, 8059], [8058, 8060, 8156], [8059, 8061], [7982, 8060, 8062], [8061, 8063], [8062, 8064, 8157], [8063, 8065], [7983, 8064, 8066], [8065, 8067], [8066, 8068, 8158], [8067, 8069], [7984, 8068, 8070], [8069, 8071], [8070, 8072, 8159], [8071, 8073], [7985, 8072, 8074], [8073, 8075], [8074, 8076, 8160], [8075, 8077], [7986, 8076, 8078], [8077, 8079], [8078, 8080, 8161], [8079, 8081], [7987, 8080, 8082], [8081, 8083], [8082, 8084, 8162], [8083, 8085], [7988, 8084, 8086], [8085, 8087], [8086, 8088, 8163], [8087, 8089], [7989, 8088, 8090], [8089, 8091], [8090, 8092, 8164], [8091, 8093], [7990, 8092, 8094], [8093, 8095], [8094, 8096, 8165], [8095, 8097], [7991, 8096, 8098], [8097, 8099], [8098, 8100, 8166], [8099, 8101], [7992, 8100, 8102], [8101, 8103], [8102, 8104, 8167], [8103, 8105], [7993, 8104, 8106], [8105, 8107], [8106, 8108, 8168], [8107, 8109], [7994, 8108, 8110], [8109, 8111], [8110, 8112, 8169], [8111, 8113], [7995, 8112, 8114], [8113, 8115], [8114, 8116, 8170], [8115, 8117], [7996, 8116, 8118], [8117, 8119], [8118, 8120, 8171], [8119, 8121], [7997, 8120, 8122], [8121, 8123], [8122, 8124, 8172], [8123, 8125], [7998, 8124, 8126], [8125, 8127], [8126, 8128, 8173], [8127, 8129], [7999, 8128, 8130], [8129, 8131], [8130, 8132, 8174], [8131, 8133], [8000, 8132, 8134], [8133, 8135], [8134, 8136, 8175], [8135, 8137], [8001, 8136, 8138], [8137, 8139], [8138, 8140, 8176], [8139, 8141], [8002, 8140], [8003, 8177], [8007, 8181], [8011, 8185], [8015, 8189], [8019, 8193], [8023, 8197], [8027, 8201], [8031, 8205], [8035, 8209], [8039, 8213], [8043, 8217], [8047, 8221], [8051, 8225], [8055, 8229], [8059, 8233], [8063, 8237], [8067, 8241], [8071, 8245], [8075, 8249], [8079, 8253], [8083, 8257], [8087, 8261], [8091, 8265], [8095, 8269], [8099, 8273], [8103, 8277], [8107, 8281], [8111, 8285], [8115, 8289], [8119, 8293], [8123, 8297], [8127, 8301], [8131, 8305], [8135, 8309], [8139, 8313], [8142, 8178], [8177, 8179], [8178, 8180, 8316], [8179, 8181], [8143, 8180, 8182], [8181, 8183], [8182, 8184, 8317], [8183, 8185], [8144, 8184, 8186], [8185, 8187], [8186, 8188, 8318], [8187, 8189], [8145, 8188, 8190], [8189, 8191], [8190, 8192, 8319], [8191, 8193], [8146, 8192, 8194], [8193, 8195], [8194, 8196, 8320], [8195, 8197], [8147, 8196, 8198], [8197, 8199], [8198, 8200, 8321], [8199, 8201], [8148, 8200, 8202], [8201, 8203], [8202, 8204, 8322], [8203, 8205], [8149, 8204, 8206], [8205, 8207], [8206, 8208, 8323], [8207, 8209], [8150, 8208, 8210], [8209, 8211], [8210, 8212, 8324], [8211, 8213], [8151, 8212, 8214], [8213, 8215], [8214, 8216, 8325], [8215, 8217], [8152, 8216, 8218], [8217, 8219], [8218, 8220, 8326], [8219, 8221], [8153, 8220, 8222], [8221, 8223], [8222, 8224, 8327], [8223, 8225], [8154, 8224, 8226], [8225, 8227], [8226, 8228, 8328], [8227, 8229], [8155, 8228, 8230], [8229, 8231], [8230, 8232, 8329], [8231, 8233], [8156, 8232, 8234], [8233, 8235], [8234, 8236, 8330], [8235, 8237], [8157, 8236, 8238], [8237, 8239], [8238, 8240, 8331], [8239, 8241], [8158, 8240, 8242], [8241, 8243], [8242, 8244, 8332], [8243, 8245], [8159, 8244, 8246], [8245, 8247], [8246, 8248, 8333], [8247, 8249], [8160, 8248, 8250], [8249, 8251], [8250, 8252, 8334], [8251, 8253], [8161, 8252, 8254], [8253, 8255], [8254, 8256, 8335], [8255, 8257], [8162, 8256, 8258], [8257, 8259], [8258, 8260, 8336], [8259, 8261], [8163, 8260, 8262], [8261, 8263], [8262, 8264, 8337], [8263, 8265], [8164, 8264, 8266], [8265, 8267], [8266, 8268, 8338], [8267, 8269], [8165, 8268, 8270], [8269, 8271], [8270, 8272, 8339], [8271, 8273], [8166, 8272, 8274], [8273, 8275], [8274, 8276, 8340], [8275, 8277], [8167, 8276, 8278], [8277, 8279], [8278, 8280, 8341], [8279, 8281], [8168, 8280, 8282], [8281, 8283], [8282, 8284, 8342], [8283, 8285], [8169, 8284, 8286], [8285, 8287], [8286, 8288, 8343], [8287, 8289], [8170, 8288, 8290], [8289, 8291], [8290, 8292, 8344], [8291, 8293], [8171, 8292, 8294], [8293, 8295], [8294, 8296, 8345], [8295, 8297], [8172, 8296, 8298], [8297, 8299], [8298, 8300, 8346], [8299, 8301], [8173, 8300, 8302], [8301, 8303], [8302, 8304, 8347], [8303, 8305], [8174, 8304, 8306], [8305, 8307], [8306, 8308, 8348], [8307, 8309], [8175, 8308, 8310], [8309, 8311], [8310, 8312, 8349], [8311, 8313], [8176, 8312, 8314], [8313, 8315], [8314, 8350], [8179, 8353], [8183, 8357], [8187, 8361], [8191, 8365], [8195, 8369], [8199, 8373], [8203, 8377], [8207, 8381], [8211, 8385], [8215, 8389], [8219, 8393], [8223, 8397], [8227, 8401], [8231, 8405], [8235, 8409], [8239, 8413], [8243, 8417], [8247, 8421], [8251, 8425], [8255, 8429], [8259, 8433], [8263, 8437], [8267, 8441], [8271, 8445], [8275, 8449], [8279, 8453], [8283, 8457], [8287, 8461], [8291, 8465], [8295, 8469], [8299, 8473], [8303, 8477], [8307, 8481], [8311, 8485], [8315, 8489], [8352, 8490], [8351, 8353], [8316, 8352, 8354], [8353, 8355], [8354, 8356, 8491], [8355, 8357], [8317, 8356, 8358], [8357, 8359], [8358, 8360, 8492], [8359, 8361], [8318, 8360, 8362], [8361, 8363], [8362, 8364, 8493], [8363, 8365], [8319, 8364, 8366], [8365, 8367], [8366, 8368, 8494], [8367, 8369], [8320, 8368, 8370], [8369, 8371], [8370, 8372, 8495], [8371, 8373], [8321, 8372, 8374], [8373, 8375], [8374, 8376, 8496], [8375, 8377], [8322, 8376, 8378], [8377, 8379], [8378, 8380, 8497], [8379, 8381], [8323, 8380, 8382], [8381, 8383], [8382, 8384, 8498], [8383, 8385], [8324, 8384, 8386], [8385, 8387], [8386, 8388, 8499], [8387, 8389], [8325, 8388, 8390], [8389, 8391], [8390, 8392, 8500], [8391, 8393], [8326, 8392, 8394], [8393, 8395], [8394, 8396, 8501], [8395, 8397], [8327, 8396, 8398], [8397, 8399], [8398, 8400, 8502], [8399, 8401], [8328, 8400, 8402], [8401, 8403], [8402, 8404, 8503], [8403, 8405], [8329, 8404, 8406], [8405, 8407], [8406, 8408, 8504], [8407, 8409], [8330, 8408, 8410], [8409, 8411], [8410, 8412, 8505], [8411, 8413], [8331, 8412, 8414], [8413, 8415], [8414, 8416, 8506], [8415, 8417], [8332, 8416, 8418], [8417, 8419], [8418, 8420, 8507], [8419, 8421], [8333, 8420, 8422], [8421, 8423], [8422, 8424, 8508], [8423, 8425], [8334, 8424, 8426], [8425, 8427], [8426, 8428, 8509], [8427, 8429], [8335, 8428, 8430], [8429, 8431], [8430, 8432, 8510], [8431, 8433], [8336, 8432, 8434], [8433, 8435], [8434, 8436, 8511], [8435, 8437], [8337, 8436, 8438], [8437, 8439], [8438, 8440, 8512], [8439, 8441], [8338, 8440, 8442], [8441, 8443], [8442, 8444, 8513], [8443, 8445], [8339, 8444, 8446], [8445, 8447], [8446, 8448, 8514], [8447, 8449], [8340, 8448, 8450], [8449, 8451], [8450, 8452, 8515], [8451, 8453], [8341, 8452, 8454], [8453, 8455], [8454, 8456, 8516], [8455, 8457], [8342, 8456, 8458], [8457, 8459], [8458, 8460, 8517], [8459, 8461], [8343, 8460, 8462], [8461, 8463], [8462, 8464, 8518], [8463, 8465], [8344, 8464, 8466], [8465, 8467], [8466, 8468, 8519], [8467, 8469], [8345, 8468, 8470], [8469, 8471], [8470, 8472, 8520], [8471, 8473], [8346, 8472, 8474], [8473, 8475], [8474, 8476, 8521], [8475, 8477], [8347, 8476, 8478], [8477, 8479], [8478, 8480, 8522], [8479, 8481], [8348, 8480, 8482], [8481, 8483], [8482, 8484, 8523], [8483, 8485], [8349, 8484, 8486], [8485, 8487], [8486, 8488, 8524], [8487, 8489], [8350, 8488], [8351, 8525], [8355, 8529], [8359, 8533], [8363, 8537], [8367, 8541], [8371, 8545], [8375, 8549], [8379, 8553], [8383, 8557], [8387, 8561], [8391, 8565], [8395, 8569], [8399, 8573], [8403, 8577], [8407, 8581], [8411, 8585], [8415, 8589], [8419, 8593], [8423, 8597], [8427, 8601], [8431, 8605], [8435, 8609], [8439, 8613], [8443, 8617], [8447, 8621], [8451, 8625], [8455, 8629], [8459, 8633], [8463, 8637], [8467, 8641], [8471, 8645], [8475, 8649], [8479, 8653], [8483, 8657], [8487, 8661], [8490, 8526], [8525, 8527], [8526, 8528, 8664], [8527, 8529], [8491, 8528, 8530], [8529, 8531], [8530, 8532, 8665], [8531, 8533], [8492, 8532, 8534], [8533, 8535], [8534, 8536, 8666], [8535, 8537], [8493, 8536, 8538], [8537, 8539], [8538, 8540, 8667], [8539, 8541], [8494, 8540, 8542], [8541, 8543], [8542, 8544, 8668], [8543, 8545], [8495, 8544, 8546], [8545, 8547], [8546, 8548, 8669], [8547, 8549], [8496, 8548, 8550], [8549, 8551], [8550, 8552, 8670], [8551, 8553], [8497, 8552, 8554], [8553, 8555], [8554, 8556, 8671], [8555, 8557], [8498, 8556, 8558], [8557, 8559], [8558, 8560, 8672], [8559, 8561], [8499, 8560, 8562], [8561, 8563], [8562, 8564, 8673], [8563, 8565], [8500, 8564, 8566], [8565, 8567], [8566, 8568, 8674], [8567, 8569], [8501, 8568, 8570], [8569, 8571], [8570, 8572, 8675], [8571, 8573], [8502, 8572, 8574], [8573, 8575], [8574, 8576, 8676], [8575, 8577], [8503, 8576, 8578], [8577, 8579], [8578, 8580, 8677], [8579, 8581], [8504, 8580, 8582], [8581, 8583], [8582, 8584, 8678], [8583, 8585], [8505, 8584, 8586], [8585, 8587], [8586, 8588, 8679], [8587, 8589], [8506, 8588, 8590], [8589, 8591], [8590, 8592, 8680], [8591, 8593], [8507, 8592, 8594], [8593, 8595], [8594, 8596, 8681], [8595, 8597], [8508, 8596, 8598], [8597, 8599], [8598, 8600, 8682], [8599, 8601], [8509, 8600, 8602], [8601, 8603], [8602, 8604, 8683], [8603, 8605], [8510, 8604, 8606], [8605, 8607], [8606, 8608, 8684], [8607, 8609], [8511, 8608, 8610], [8609, 8611], [8610, 8612, 8685], [8611, 8613], [8512, 8612, 8614], [8613, 8615], [8614, 8616, 8686], [8615, 8617], [8513, 8616, 8618], [8617, 8619], [8618, 8620, 8687], [8619, 8621], [8514, 8620, 8622], [8621, 8623], [8622, 8624, 8688], [8623, 8625], [8515, 8624, 8626], [8625, 8627], [8626, 8628, 8689], [8627, 8629], [8516, 8628, 8630], [8629, 8631], [8630, 8632, 8690], [8631, 8633], [8517, 8632, 8634], [8633, 8635], [8634, 8636, 8691], [8635, 8637], [8518, 8636, 8638], [8637, 8639], [8638, 8640, 8692], [8639, 8641], [8519, 8640, 8642], [8641, 8643], [8642, 8644, 8693], [8643, 8645], [8520, 8644, 8646], [8645, 8647], [8646, 8648, 8694], [8647, 8649], [8521, 8648, 8650], [8649, 8651], [8650, 8652, 8695], [8651, 8653], [8522, 8652, 8654], [8653, 8655], [8654, 8656, 8696], [8655, 8657], [8523, 8656, 8658], [8657, 8659], [8658, 8660, 8697], [8659, 8661], [8524, 8660, 8662], [8661, 8663], [8662, 8698], [8527, 8701], [8531, 8705], [8535, 8709], [8539, 8713], [8543, 8717], [8547, 8721], [8551, 8725], [8555, 8729], [8559, 8733], [8563, 8737], [8567, 8741], [8571, 8745], [8575, 8749], [8579, 8753], [8583, 8757], [8587, 8761], [8591, 8765], [8595, 8769], [8599, 8773], [8603, 8777], [8607, 8781], [8611, 8785], [8615, 8789], [8619, 8793], [8623, 8797], [8627, 8801], [8631, 8805], [8635, 8809], [8639, 8813], [8643, 8817], [8647, 8821], [8651, 8825], [8655, 8829], [8659, 8833], [8663, 8837], [8700, 8838], [8699, 8701], [8664, 8700, 8702], [8701, 8703], [8702, 8704, 8839], [8703, 8705], [8665, 8704, 8706], [8705, 8707], [8706, 8708, 8840], [8707, 8709], [8666, 8708, 8710], [8709, 8711], [8710, 8712, 8841], [8711, 8713], [8667, 8712, 8714], [8713, 8715], [8714, 8716, 8842], [8715, 8717], [8668, 8716, 8718], [8717, 8719], [8718, 8720, 8843], [8719, 8721], [8669, 8720, 8722], [8721, 8723], [8722, 8724, 8844], [8723, 8725], [8670, 8724, 8726], [8725, 8727], [8726, 8728, 8845], [8727, 8729], [8671, 8728, 8730], [8729, 8731], [8730, 8732, 8846], [8731, 8733], [8672, 8732, 8734], [8733, 8735], [8734, 8736, 8847], [8735, 8737], [8673, 8736, 8738], [8737, 8739], [8738, 8740, 8848], [8739, 8741], [8674, 8740, 8742], [8741, 8743], [8742, 8744, 8849], [8743, 8745], [8675, 8744, 8746], [8745, 8747], [8746, 8748, 8850], [8747, 8749], [8676, 8748, 8750], [8749, 8751], [8750, 8752, 8851], [8751, 8753], [8677, 8752, 8754], [8753, 8755], [8754, 8756, 8852], [8755, 8757], [8678, 8756, 8758], [8757, 8759], [8758, 8760, 8853], [8759, 8761], [8679, 8760, 8762], [8761, 8763], [8762, 8764, 8854], [8763, 8765], [8680, 8764, 8766], [8765, 8767], [8766, 8768, 8855], [8767, 8769], [8681, 8768, 8770], [8769, 8771], [8770, 8772, 8856], [8771, 8773], [8682, 8772, 8774], [8773, 8775], [8774, 8776, 8857], [8775, 8777], [8683, 8776, 8778], [8777, 8779], [8778, 8780, 8858], [8779, 8781], [8684, 8780, 8782], [8781, 8783], [8782, 8784, 8859], [8783, 8785], [8685, 8784, 8786], [8785, 8787], [8786, 8788, 8860], [8787, 8789], [8686, 8788, 8790], [8789, 8791], [8790, 8792, 8861], [8791, 8793], [8687, 8792, 8794], [8793, 8795], [8794, 8796, 8862], [8795, 8797], [8688, 8796, 8798], [8797, 8799], [8798, 8800, 8863], [8799, 8801], [8689, 8800, 8802], [8801, 8803], [8802, 8804, 8864], [8803, 8805], [8690, 8804, 8806], [8805, 8807], [8806, 8808, 8865], [8807, 8809], [8691, 8808, 8810], [8809, 8811], [8810, 8812, 8866], [8811, 8813], [8692, 8812, 8814], [8813, 8815], [8814, 8816, 8867], [8815, 8817], [8693, 8816, 8818], [8817, 8819], [8818, 8820, 8868], [8819, 8821], [8694, 8820, 8822], [8821, 8823], [8822, 8824, 8869], [8823, 8825], [8695, 8824, 8826], [8825, 8827], [8826, 8828, 8870], [8827, 8829], [8696, 8828, 8830], [8829, 8831], [8830, 8832, 8871], [8831, 8833], [8697, 8832, 8834], [8833, 8835], [8834, 8836, 8872], [8835, 8837], [8698, 8836], [8699, 8873], [8703, 8877], [8707, 8881], [8711, 8885], [8715, 8889], [8719, 8893], [8723, 8897], [8727, 8901], [8731, 8905], [8735, 8909], [8739, 8913], [8743, 8917], [8747, 8921], [8751, 8925], [8755, 8929], [8759, 8933], [8763, 8937], [8767, 8941], [8771, 8945], [8775, 8949], [8779, 8953], [8783, 8957], [8787, 8961], [8791, 8965], [8795, 8969], [8799, 8973], [8803, 8977], [8807, 8981], [8811, 8985], [8815, 8989], [8819, 8993], [8823, 8997], [8827, 9001], [8831, 9005], [8835, 9009], [8838, 8874], [8873, 8875], [8874, 8876, 9012], [8875, 8877], [8839, 8876, 8878], [8877, 8879], [8878, 8880, 9013], [8879, 8881], [8840, 8880, 8882], [8881, 8883], [8882, 8884, 9014], [8883, 8885], [8841, 8884, 8886], [8885, 8887], [8886, 8888, 9015], [8887, 8889], [8842, 8888, 8890], [8889, 8891], [8890, 8892, 9016], [8891, 8893], [8843, 8892, 8894], [8893, 8895], [8894, 8896, 9017], [8895, 8897], [8844, 8896, 8898], [8897, 8899], [8898, 8900, 9018], [8899, 8901], [8845, 8900, 8902], [8901, 8903], [8902, 8904, 9019], [8903, 8905], [8846, 8904, 8906], [8905, 8907], [8906, 8908, 9020], [8907, 8909], [8847, 8908, 8910], [8909, 8911], [8910, 8912, 9021], [8911, 8913], [8848, 8912, 8914], [8913, 8915], [8914, 8916, 9022], [8915, 8917], [8849, 8916, 8918], [8917, 8919], [8918, 8920, 9023], [8919, 8921], [8850, 8920, 8922], [8921, 8923], [8922, 8924, 9024], [8923, 8925], [8851, 8924, 8926], [8925, 8927], [8926, 8928, 9025], [8927, 8929], [8852, 8928, 8930], [8929, 8931], [8930, 8932, 9026], [8931, 8933], [8853, 8932, 8934], [8933, 8935], [8934, 8936, 9027], [8935, 8937], [8854, 8936, 8938], [8937, 8939], [8938, 8940, 9028], [8939, 8941], [8855, 8940, 8942], [8941, 8943], [8942, 8944, 9029], [8943, 8945], [8856, 8944, 8946], [8945, 8947], [8946, 8948, 9030], [8947, 8949], [8857, 8948, 8950], [8949, 8951], [8950, 8952, 9031], [8951, 8953], [8858, 8952, 8954], [8953, 8955], [8954, 8956, 9032], [8955, 8957], [8859, 8956, 8958], [8957, 8959], [8958, 8960, 9033], [8959, 8961], [8860, 8960, 8962], [8961, 8963], [8962, 8964, 9034], [8963, 8965], [8861, 8964, 8966], [8965, 8967], [8966, 8968, 9035], [8967, 8969], [8862, 8968, 8970], [8969, 8971], [8970, 8972, 9036], [8971, 8973], [8863, 8972, 8974], [8973, 8975], [8974, 8976, 9037], [8975, 8977], [8864, 8976, 8978], [8977, 8979], [8978, 8980, 9038], [8979, 8981], [8865, 8980, 8982], [8981, 8983], [8982, 8984, 9039], [8983, 8985], [8866, 8984, 8986], [8985, 8987], [8986, 8988, 9040], [8987, 8989], [8867, 8988, 8990], [8989, 8991], [8990, 8992, 9041], [8991, 8993], [8868, 8992, 8994], [8993, 8995], [8994, 8996, 9042], [8995, 8997], [8869, 8996, 8998], [8997, 8999], [8998, 9000, 9043], [8999, 9001], [8870, 9000, 9002], [9001, 9003], [9002, 9004, 9044], [9003, 9005], [8871, 9004, 9006], [9005, 9007], [9006, 9008, 9045], [9007, 9009], [8872, 9008, 9010], [9009, 9011], [9010, 9046], [8875, 9049], [8879, 9053], [8883, 9057], [8887, 9061], [8891, 9065], [8895, 9069], [8899, 9073], [8903, 9077], [8907, 9081], [8911, 9085], [8915, 9089], [8919, 9093], [8923, 9097], [8927, 9101], [8931, 9105], [8935, 9109], [8939, 9113], [8943, 9117], [8947, 9121], [8951, 9125], [8955, 9129], [8959, 9133], [8963, 9137], [8967, 9141], [8971, 9145], [8975, 9149], [8979, 9153], [8983, 9157], [8987, 9161], [8991, 9165], [8995, 9169], [8999, 9173], [9003, 9177], [9007, 9181], [9011, 9185], [9048, 9186], [9047, 9049], [9012, 9048, 9050], [9049, 9051], [9050, 9052, 9187], [9051, 9053], [9013, 9052, 9054], [9053, 9055], [9054, 9056, 9188], [9055, 9057], [9014, 9056, 9058], [9057, 9059], [9058, 9060, 9189], [9059, 9061], [9015, 9060, 9062], [9061, 9063], [9062, 9064, 9190], [9063, 9065], [9016, 9064, 9066], [9065, 9067], [9066, 9068, 9191], [9067, 9069], [9017, 9068, 9070], [9069, 9071], [9070, 9072, 9192], [9071, 9073], [9018, 9072, 9074], [9073, 9075], [9074, 9076, 9193], [9075, 9077], [9019, 9076, 9078], [9077, 9079], [9078, 9080, 9194], [9079, 9081], [9020, 9080, 9082], [9081, 9083], [9082, 9084, 9195], [9083, 9085], [9021, 9084, 9086], [9085, 9087], [9086, 9088, 9196], [9087, 9089], [9022, 9088, 9090], [9089, 9091], [9090, 9092, 9197], [9091, 9093], [9023, 9092, 9094], [9093, 9095], [9094, 9096, 9198], [9095, 9097], [9024, 9096, 9098], [9097, 9099], [9098, 9100, 9199], [9099, 9101], [9025, 9100, 9102], [9101, 9103], [9102, 9104, 9200], [9103, 9105], [9026, 9104, 9106], [9105, 9107], [9106, 9108, 9201], [9107, 9109], [9027, 9108, 9110], [9109, 9111], [9110, 9112, 9202], [9111, 9113], [9028, 9112, 9114], [9113, 9115], [9114, 9116, 9203], [9115, 9117], [9029, 9116, 9118], [9117, 9119], [9118, 9120, 9204], [9119, 9121], [9030, 9120, 9122], [9121, 9123], [9122, 9124, 9205], [9123, 9125], [9031, 9124, 9126], [9125, 9127], [9126, 9128, 9206], [9127, 9129], [9032, 9128, 9130], [9129, 9131], [9130, 9132, 9207], [9131, 9133], [9033, 9132, 9134], [9133, 9135], [9134, 9136, 9208], [9135, 9137], [9034, 9136, 9138], [9137, 9139], [9138, 9140, 9209], [9139, 9141], [9035, 9140, 9142], [9141, 9143], [9142, 9144, 9210], [9143, 9145], [9036, 9144, 9146], [9145, 9147], [9146, 9148, 9211], [9147, 9149], [9037, 9148, 9150], [9149, 9151], [9150, 9152, 9212], [9151, 9153], [9038, 9152, 9154], [9153, 9155], [9154, 9156, 9213], [9155, 9157], [9039, 9156, 9158], [9157, 9159], [9158, 9160, 9214], [9159, 9161], [9040, 9160, 9162], [9161, 9163], [9162, 9164, 9215], [9163, 9165], [9041, 9164, 9166], [9165, 9167], [9166, 9168, 9216], [9167, 9169], [9042, 9168, 9170], [9169, 9171], [9170, 9172, 9217], [9171, 9173], [9043, 9172, 9174], [9173, 9175], [9174, 9176, 9218], [9175, 9177], [9044, 9176, 9178], [9177, 9179], [9178, 9180, 9219], [9179, 9181], [9045, 9180, 9182], [9181, 9183], [9182, 9184, 9220], [9183, 9185], [9046, 9184], [9047, 9221], [9051, 9225], [9055, 9229], [9059, 9233], [9063, 9237], [9067, 9241], [9071, 9245], [9075, 9249], [9079, 9253], [9083, 9257], [9087, 9261], [9091, 9265], [9095, 9269], [9099, 9273], [9103, 9277], [9107, 9281], [9111, 9285], [9115, 9289], [9119, 9293], [9123, 9297], [9127, 9301], [9131, 9305], [9135, 9309], [9139, 9313], [9143, 9317], [9147, 9321], [9151, 9325], [9155, 9329], [9159, 9333], [9163, 9337], [9167, 9341], [9171, 9345], [9175, 9349], [9179, 9353], [9183, 9357], [9186, 9222], [9221, 9223], [9222, 9224, 9360], [9223, 9225], [9187, 9224, 9226], [9225, 9227], [9226, 9228, 9361], [9227, 9229], [9188, 9228, 9230], [9229, 9231], [9230, 9232, 9362], [9231, 9233], [9189, 9232, 9234], [9233, 9235], [9234, 9236, 9363], [9235, 9237], [9190, 9236, 9238], [9237, 9239], [9238, 9240, 9364], [9239, 9241], [9191, 9240, 9242], [9241, 9243], [9242, 9244, 9365], [9243, 9245], [9192, 9244, 9246], [9245, 9247], [9246, 9248, 9366], [9247, 9249], [9193, 9248, 9250], [9249, 9251], [9250, 9252, 9367], [9251, 9253], [9194, 9252, 9254], [9253, 9255], [9254, 9256, 9368], [9255, 9257], [9195, 9256, 9258], [9257, 9259], [9258, 9260, 9369], [9259, 9261], [9196, 9260, 9262], [9261, 9263], [9262, 9264, 9370], [9263, 9265], [9197, 9264, 9266], [9265, 9267], [9266, 9268, 9371], [9267, 9269], [9198, 9268, 9270], [9269, 9271], [9270, 9272, 9372], [9271, 9273], [9199, 9272, 9274], [9273, 9275], [9274, 9276, 9373], [9275, 9277], [9200, 9276, 9278], [9277, 9279], [9278, 9280, 9374], [9279, 9281], [9201, 9280, 9282], [9281, 9283], [9282, 9284, 9375], [9283, 9285], [9202, 9284, 9286], [9285, 9287], [9286, 9288, 9376], [9287, 9289], [9203, 9288, 9290], [9289, 9291], [9290, 9292, 9377], [9291, 9293], [9204, 9292, 9294], [9293, 9295], [9294, 9296, 9378], [9295, 9297], [9205, 9296, 9298], [9297, 9299], [9298, 9300, 9379], [9299, 9301], [9206, 9300, 9302], [9301, 9303], [9302, 9304, 9380], [9303, 9305], [9207, 9304, 9306], [9305, 9307], [9306, 9308, 9381], [9307, 9309], [9208, 9308, 9310], [9309, 9311], [9310, 9312, 9382], [9311, 9313], [9209, 9312, 9314], [9313, 9315], [9314, 9316, 9383], [9315, 9317], [9210, 9316, 9318], [9317, 9319], [9318, 9320, 9384], [9319, 9321], [9211, 9320, 9322], [9321, 9323], [9322, 9324, 9385], [9323, 9325], [9212, 9324, 9326], [9325, 9327], [9326, 9328, 9386], [9327, 9329], [9213, 9328, 9330], [9329, 9331], [9330, 9332, 9387], [9331, 9333], [9214, 9332, 9334], [9333, 9335], [9334, 9336, 9388], [9335, 9337], [9215, 9336, 9338], [9337, 9339], [9338, 9340, 9389], [9339, 9341], [9216, 9340, 9342], [9341, 9343], [9342, 9344, 9390], [9343, 9345], [9217, 9344, 9346], [9345, 9347], [9346, 9348, 9391], [9347, 9349], [9218, 9348, 9350], [9349, 9351], [9350, 9352, 9392], [9351, 9353], [9219, 9352, 9354], [9353, 9355], [9354, 9356, 9393], [9355, 9357], [9220, 9356, 9358], [9357, 9359], [9358, 9394], [9223, 9397], [9227, 9401], [9231, 9405], [9235, 9409], [9239, 9413], [9243, 9417], [9247, 9421], [9251, 9425], [9255, 9429], [9259, 9433], [9263, 9437], [9267, 9441], [9271, 9445], [9275, 9449], [9279, 9453], [9283, 9457], [9287, 9461], [9291, 9465], [9295, 9469], [9299, 9473], [9303, 9477], [9307, 9481], [9311, 9485], [9315, 9489], [9319, 9493], [9323, 9497], [9327, 9501], [9331, 9505], [9335, 9509], [9339, 9513], [9343, 9517], [9347, 9521], [9351, 9525], [9355, 9529], [9359, 9533], [9396, 9534], [9395, 9397], [9360, 9396, 9398], [9397, 9399], [9398, 9400, 9535], [9399, 9401], [9361, 9400, 9402], [9401, 9403], [9402, 9404, 9536], [9403, 9405], [9362, 9404, 9406], [9405, 9407], [9406, 9408, 9537], [9407, 9409], [9363, 9408, 9410], [9409, 9411], [9410, 9412, 9538], [9411, 9413], [9364, 9412, 9414], [9413, 9415], [9414, 9416, 9539], [9415, 9417], [9365, 9416, 9418], [9417, 9419], [9418, 9420, 9540], [9419, 9421], [9366, 9420, 9422], [9421, 9423], [9422, 9424, 9541], [9423, 9425], [9367, 9424, 9426], [9425, 9427], [9426, 9428, 9542], [9427, 9429], [9368, 9428, 9430], [9429, 9431], [9430, 9432, 9543], [9431, 9433], [9369, 9432, 9434], [9433, 9435], [9434, 9436, 9544], [9435, 9437], [9370, 9436, 9438], [9437, 9439], [9438, 9440, 9545], [9439, 9441], [9371, 9440, 9442], [9441, 9443], [9442, 9444, 9546], [9443, 9445], [9372, 9444, 9446], [9445, 9447], [9446, 9448, 9547], [9447, 9449], [9373, 9448, 9450], [9449, 9451], [9450, 9452, 9548], [9451, 9453], [9374, 9452, 9454], [9453, 9455], [9454, 9456, 9549], [9455, 9457], [9375, 9456, 9458], [9457, 9459], [9458, 9460, 9550], [9459, 9461], [9376, 9460, 9462], [9461, 9463], [9462, 9464, 9551], [9463, 9465], [9377, 9464, 9466], [9465, 9467], [9466, 9468, 9552], [9467, 9469], [9378, 9468, 9470], [9469, 9471], [9470, 9472, 9553], [9471, 9473], [9379, 9472, 9474], [9473, 9475], [9474, 9476, 9554], [9475, 9477], [9380, 9476, 9478], [9477, 9479], [9478, 9480, 9555], [9479, 9481], [9381, 9480, 9482], [9481, 9483], [9482, 9484, 9556], [9483, 9485], [9382, 9484, 9486], [9485, 9487], [9486, 9488, 9557], [9487, 9489], [9383, 9488, 9490], [9489, 9491], [9490, 9492, 9558], [9491, 9493], [9384, 9492, 9494], [9493, 9495], [9494, 9496, 9559], [9495, 9497], [9385, 9496, 9498], [9497, 9499], [9498, 9500, 9560], [9499, 9501], [9386, 9500, 9502], [9501, 9503], [9502, 9504, 9561], [9503, 9505], [9387, 9504, 9506], [9505, 9507], [9506, 9508, 9562], [9507, 9509], [9388, 9508, 9510], [9509, 9511], [9510, 9512, 9563], [9511, 9513], [9389, 9512, 9514], [9513, 9515], [9514, 9516, 9564], [9515, 9517], [9390, 9516, 9518], [9517, 9519], [9518, 9520, 9565], [9519, 9521], [9391, 9520, 9522], [9521, 9523], [9522, 9524, 9566], [9523, 9525], [9392, 9524, 9526], [9525, 9527], [9526, 9528, 9567], [9527, 9529], [9393, 9528, 9530], [9529, 9531], [9530, 9532, 9568], [9531, 9533], [9394, 9532], [9395, 9569], [9399, 9573], [9403, 9577], [9407, 9581], [9411, 9585], [9415, 9589], [9419, 9593], [9423, 9597], [9427, 9601], [9431, 9605], [9435, 9609], [9439, 9613], [9443, 9617], [9447, 9621], [9451, 9625], [9455, 9629], [9459, 9633], [9463, 9637], [9467, 9641], [9471, 9645], [9475, 9649], [9479, 9653], [9483, 9657], [9487, 9661], [9491, 9665], [9495, 9669], [9499, 9673], [9503, 9677], [9507, 9681], [9511, 9685], [9515, 9689], [9519, 9693], [9523, 9697], [9527, 9701], [9531, 9705], [9534, 9570], [9569, 9571], [9570, 9572, 9708], [9571, 9573], [9535, 9572, 9574], [9573, 9575], [9574, 9576, 9709], [9575, 9577], [9536, 9576, 9578], [9577, 9579], [9578, 9580, 9710], [9579, 9581], [9537, 9580, 9582], [9581, 9583], [9582, 9584, 9711], [9583, 9585], [9538, 9584, 9586], [9585, 9587], [9586, 9588, 9712], [9587, 9589], [9539, 9588, 9590], [9589, 9591], [9590, 9592, 9713], [9591, 9593], [9540, 9592, 9594], [9593, 9595], [9594, 9596, 9714], [9595, 9597], [9541, 9596, 9598], [9597, 9599], [9598, 9600, 9715], [9599, 9601], [9542, 9600, 9602], [9601, 9603], [9602, 9604, 9716], [9603, 9605], [9543, 9604, 9606], [9605, 9607], [9606, 9608, 9717], [9607, 9609], [9544, 9608, 9610], [9609, 9611], [9610, 9612, 9718], [9611, 9613], [9545, 9612, 9614], [9613, 9615], [9614, 9616, 9719], [9615, 9617], [9546, 9616, 9618], [9617, 9619], [9618, 9620, 9720], [9619, 9621], [9547, 9620, 9622], [9621, 9623], [9622, 9624, 9721], [9623, 9625], [9548, 9624, 9626], [9625, 9627], [9626, 9628, 9722], [9627, 9629], [9549, 9628, 9630], [9629, 9631], [9630, 9632, 9723], [9631, 9633], [9550, 9632, 9634], [9633, 9635], [9634, 9636, 9724], [9635, 9637], [9551, 9636, 9638], [9637, 9639], [9638, 9640, 9725], [9639, 9641], [9552, 9640, 9642], [9641, 9643], [9642, 9644, 9726], [9643, 9645], [9553, 9644, 9646], [9645, 9647], [9646, 9648, 9727], [9647, 9649], [9554, 9648, 9650], [9649, 9651], [9650, 9652, 9728], [9651, 9653], [9555, 9652, 9654], [9653, 9655], [9654, 9656, 9729], [9655, 9657], [9556, 9656, 9658], [9657, 9659], [9658, 9660, 9730], [9659, 9661], [9557, 9660, 9662], [9661, 9663], [9662, 9664, 9731], [9663, 9665], [9558, 9664, 9666], [9665, 9667], [9666, 9668, 9732], [9667, 9669], [9559, 9668, 9670], [9669, 9671], [9670, 9672, 9733], [9671, 9673], [9560, 9672, 9674], [9673, 9675], [9674, 9676, 9734], [9675, 9677], [9561, 9676, 9678], [9677, 9679], [9678, 9680, 9735], [9679, 9681], [9562, 9680, 9682], [9681, 9683], [9682, 9684, 9736], [9683, 9685], [9563, 9684, 9686], [9685, 9687], [9686, 9688, 9737], [9687, 9689], [9564, 9688, 9690], [9689, 9691], [9690, 9692, 9738], [9691, 9693], [9565, 9692, 9694], [9693, 9695], [9694, 9696, 9739], [9695, 9697], [9566, 9696, 9698], [9697, 9699], [9698, 9700, 9740], [9699, 9701], [9567, 9700, 9702], [9701, 9703], [9702, 9704, 9741], [9703, 9705], [9568, 9704, 9706], [9705, 9707], [9706, 9742], [9571, 9745], [9575, 9749], [9579, 9753], [9583, 9757], [9587, 9761], [9591, 9765], [9595, 9769], [9599, 9773], [9603, 9777], [9607, 9781], [9611, 9785], [9615, 9789], [9619, 9793], [9623, 9797], [9627, 9801], [9631, 9805], [9635, 9809], [9639, 9813], [9643, 9817], [9647, 9821], [9651, 9825], [9655, 9829], [9659, 9833], [9663, 9837], [9667, 9841], [9671, 9845], [9675, 9849], [9679, 9853], [9683, 9857], [9687, 9861], [9691, 9865], [9695, 9869], [9699, 9873], [9703, 9877], [9707, 9881], [9744, 9882], [9743, 9745], [9708, 9744, 9746], [9745, 9747], [9746, 9748, 9883], [9747, 9749], [9709, 9748, 9750], [9749, 9751], [9750, 9752, 9884], [9751, 9753], [9710, 9752, 9754], [9753, 9755], [9754, 9756, 9885], [9755, 9757], [9711, 9756, 9758], [9757, 9759], [9758, 9760, 9886], [9759, 9761], [9712, 9760, 9762], [9761, 9763], [9762, 9764, 9887], [9763, 9765], [9713, 9764, 9766], [9765, 9767], [9766, 9768, 9888], [9767, 9769], [9714, 9768, 9770], [9769, 9771], [9770, 9772, 9889], [9771, 9773], [9715, 9772, 9774], [9773, 9775], [9774, 9776, 9890], [9775, 9777], [9716, 9776, 9778], [9777, 9779], [9778, 9780, 9891], [9779, 9781], [9717, 9780, 9782], [9781, 9783], [9782, 9784, 9892], [9783, 9785], [9718, 9784, 9786], [9785, 9787], [9786, 9788, 9893], [9787, 9789], [9719, 9788, 9790], [9789, 9791], [9790, 9792, 9894], [9791, 9793], [9720, 9792, 9794], [9793, 9795], [9794, 9796, 9895], [9795, 9797], [9721, 9796, 9798], [9797, 9799], [9798, 9800, 9896], [9799, 9801], [9722, 9800, 9802], [9801, 9803], [9802, 9804, 9897], [9803, 9805], [9723, 9804, 9806], [9805, 9807], [9806, 9808, 9898], [9807, 9809], [9724, 9808, 9810], [9809, 9811], [9810, 9812, 9899], [9811, 9813], [9725, 9812, 9814], [9813, 9815], [9814, 9816, 9900], [9815, 9817], [9726, 9816, 9818], [9817, 9819], [9818, 9820, 9901], [9819, 9821], [9727, 9820, 9822], [9821, 9823], [9822, 9824, 9902], [9823, 9825], [9728, 9824, 9826], [9825, 9827], [9826, 9828, 9903], [9827, 9829], [9729, 9828, 9830], [9829, 9831], [9830, 9832, 9904], [9831, 9833], [9730, 9832, 9834], [9833, 9835], [9834, 9836, 9905], [9835, 9837], [9731, 9836, 9838], [9837, 9839], [9838, 9840, 9906], [9839, 9841], [9732, 9840, 9842], [9841, 9843], [9842, 9844, 9907], [9843, 9845], [9733, 9844, 9846], [9845, 9847], [9846, 9848, 9908], [9847, 9849], [9734, 9848, 9850], [9849, 9851], [9850, 9852, 9909], [9851, 9853], [9735, 9852, 9854], [9853, 9855], [9854, 9856, 9910], [9855, 9857], [9736, 9856, 9858], [9857, 9859], [9858, 9860, 9911], [9859, 9861], [9737, 9860, 9862], [9861, 9863], [9862, 9864, 9912], [9863, 9865], [9738, 9864, 9866], [9865, 9867], [9866, 9868, 9913], [9867, 9869], [9739, 9868, 9870], [9869, 9871], [9870, 9872, 9914], [9871, 9873], [9740, 9872, 9874], [9873, 9875], [9874, 9876, 9915], [9875, 9877], [9741, 9876, 9878], [9877, 9879], [9878, 9880, 9916], [9879, 9881], [9742, 9880], [9743, 9917], [9747, 9921], [9751, 9925], [9755, 9929], [9759, 9933], [9763, 9937], [9767, 9941], [9771, 9945], [9775, 9949], [9779, 9953], [9783, 9957], [9787, 9961], [9791, 9965], [9795, 9969], [9799, 9973], [9803, 9977], [9807, 9981], [9811, 9985], [9815, 9989], [9819, 9993], [9823, 9997], [9827, 10001], [9831, 10005], [9835, 10009], [9839, 10013], [9843, 10017], [9847, 10021], [9851, 10025], [9855, 10029], [9859, 10033], [9863, 10037], [9867, 10041], [9871, 10045], [9875, 10049], [9879, 10053], [9882, 9918], [9917, 9919], [9918, 9920, 10056], [9919, 9921], [9883, 9920, 9922], [9921, 9923], [9922, 9924, 10057], [9923, 9925], [9884, 9924, 9926], [9925, 9927], [9926, 9928, 10058], [9927, 9929], [9885, 9928, 9930], [9929, 9931], [9930, 9932, 10059], [9931, 9933], [9886, 9932, 9934], [9933, 9935], [9934, 9936, 10060], [9935, 9937], [9887, 9936, 9938], [9937, 9939], [9938, 9940, 10061], [9939, 9941], [9888, 9940, 9942], [9941, 9943], [9942, 9944, 10062], [9943, 9945], [9889, 9944, 9946], [9945, 9947], [9946, 9948, 10063], [9947, 9949], [9890, 9948, 9950], [9949, 9951], [9950, 9952, 10064], [9951, 9953], [9891, 9952, 9954], [9953, 9955], [9954, 9956, 10065], [9955, 9957], [9892, 9956, 9958], [9957, 9959], [9958, 9960, 10066], [9959, 9961], [9893, 9960, 9962], [9961, 9963], [9962, 9964, 10067], [9963, 9965], [9894, 9964, 9966], [9965, 9967], [9966, 9968, 10068], [9967, 9969], [9895, 9968, 9970], [9969, 9971], [9970, 9972, 10069], [9971, 9973], [9896, 9972, 9974], [9973, 9975], [9974, 9976, 10070], [9975, 9977], [9897, 9976, 9978], [9977, 9979], [9978, 9980, 10071], [9979, 9981], [9898, 9980, 9982], [9981, 9983], [9982, 9984, 10072], [9983, 9985], [9899, 9984, 9986], [9985, 9987], [9986, 9988, 10073], [9987, 9989], [9900, 9988, 9990], [9989, 9991], [9990, 9992, 10074], [9991, 9993], [9901, 9992, 9994], [9993, 9995], [9994, 9996, 10075], [9995, 9997], [9902, 9996, 9998], [9997, 9999], [9998, 10000, 10076], [9999, 10001], [9903, 10000, 10002], [10001, 10003], [10002, 10004, 10077], [10003, 10005], [9904, 10004, 10006], [10005, 10007], [10006, 10008, 10078], [10007, 10009], [9905, 10008, 10010], [10009, 10011], [10010, 10012, 10079], [10011, 10013], [9906, 10012, 10014], [10013, 10015], [10014, 10016, 10080], [10015, 10017], [9907, 10016, 10018], [10017, 10019], [10018, 10020, 10081], [10019, 10021], [9908, 10020, 10022], [10021, 10023], [10022, 10024, 10082], [10023, 10025], [9909, 10024, 10026], [10025, 10027], [10026, 10028, 10083], [10027, 10029], [9910, 10028, 10030], [10029, 10031], [10030, 10032, 10084], [10031, 10033], [9911, 10032, 10034], [10033, 10035], [10034, 10036, 10085], [10035, 10037], [9912, 10036, 10038], [10037, 10039], [10038, 10040, 10086], [10039, 10041], [9913, 10040, 10042], [10041, 10043], [10042, 10044, 10087], [10043, 10045], [9914, 10044, 10046], [10045, 10047], [10046, 10048, 10088], [10047, 10049], [9915, 10048, 10050], [10049, 10051], [10050, 10052, 10089], [10051, 10053], [9916, 10052, 10054], [10053, 10055], [10054, 10090], [9919, 10093], [9923, 10097], [9927, 10101], [9931, 10105], [9935, 10109], [9939, 10113], [9943, 10117], [9947, 10121], [9951, 10125], [9955, 10129], [9959, 10133], [9963, 10137], [9967, 10141], [9971, 10145], [9975, 10149], [9979, 10153], [9983, 10157], [9987, 10161], [9991, 10165], [9995, 10169], [9999, 10173], [10003, 10177], [10007, 10181], [10011, 10185], [10015, 10189], [10019, 10193], [10023, 10197], [10027, 10201], [10031, 10205], [10035, 10209], [10039, 10213], [10043, 10217], [10047, 10221], [10051, 10225], [10055, 10229], [10092, 10230], [10091, 10093], [10056, 10092, 10094], [10093, 10095], [10094, 10096, 10231], [10095, 10097], [10057, 10096, 10098], [10097, 10099], [10098, 10100, 10232], [10099, 10101], [10058, 10100, 10102], [10101, 10103], [10102, 10104, 10233], [10103, 10105], [10059, 10104, 10106], [10105, 10107], [10106, 10108, 10234], [10107, 10109], [10060, 10108, 10110], [10109, 10111], [10110, 10112, 10235], [10111, 10113], [10061, 10112, 10114], [10113, 10115], [10114, 10116, 10236], [10115, 10117], [10062, 10116, 10118], [10117, 10119], [10118, 10120, 10237], [10119, 10121], [10063, 10120, 10122], [10121, 10123], [10122, 10124, 10238], [10123, 10125], [10064, 10124, 10126], [10125, 10127], [10126, 10128, 10239], [10127, 10129], [10065, 10128, 10130], [10129, 10131], [10130, 10132, 10240], [10131, 10133], [10066, 10132, 10134], [10133, 10135], [10134, 10136, 10241], [10135, 10137], [10067, 10136, 10138], [10137, 10139], [10138, 10140, 10242], [10139, 10141], [10068, 10140, 10142], [10141, 10143], [10142, 10144, 10243], [10143, 10145], [10069, 10144, 10146], [10145, 10147], [10146, 10148, 10244], [10147, 10149], [10070, 10148, 10150], [10149, 10151], [10150, 10152, 10245], [10151, 10153], [10071, 10152, 10154], [10153, 10155], [10154, 10156, 10246], [10155, 10157], [10072, 10156, 10158], [10157, 10159], [10158, 10160, 10247], [10159, 10161], [10073, 10160, 10162], [10161, 10163], [10162, 10164, 10248], [10163, 10165], [10074, 10164, 10166], [10165, 10167], [10166, 10168, 10249], [10167, 10169], [10075, 10168, 10170], [10169, 10171], [10170, 10172, 10250], [10171, 10173], [10076, 10172, 10174], [10173, 10175], [10174, 10176, 10251], [10175, 10177], [10077, 10176, 10178], [10177, 10179], [10178, 10180, 10252], [10179, 10181], [10078, 10180, 10182], [10181, 10183], [10182, 10184, 10253], [10183, 10185], [10079, 10184, 10186], [10185, 10187], [10186, 10188, 10254], [10187, 10189], [10080, 10188, 10190], [10189, 10191], [10190, 10192, 10255], [10191, 10193], [10081, 10192, 10194], [10193, 10195], [10194, 10196, 10256], [10195, 10197], [10082, 10196, 10198], [10197, 10199], [10198, 10200, 10257], [10199, 10201], [10083, 10200, 10202], [10201, 10203], [10202, 10204, 10258], [10203, 10205], [10084, 10204, 10206], [10205, 10207], [10206, 10208, 10259], [10207, 10209], [10085, 10208, 10210], [10209, 10211], [10210, 10212, 10260], [10211, 10213], [10086, 10212, 10214], [10213, 10215], [10214, 10216, 10261], [10215, 10217], [10087, 10216, 10218], [10217, 10219], [10218, 10220, 10262], [10219, 10221], [10088, 10220, 10222], [10221, 10223], [10222, 10224, 10263], [10223, 10225], [10089, 10224, 10226], [10225, 10227], [10226, 10228, 10264], [10227, 10229], [10090, 10228], [10091, 10265], [10095, 10269], [10099, 10273], [10103, 10277], [10107, 10281], [10111, 10285], [10115, 10289], [10119, 10293], [10123, 10297], [10127, 10301], [10131, 10305], [10135, 10309], [10139, 10313], [10143, 10317], [10147, 10321], [10151, 10325], [10155, 10329], [10159, 10333], [10163, 10337], [10167, 10341], [10171, 10345], [10175, 10349], [10179, 10353], [10183, 10357], [10187, 10361], [10191, 10365], [10195, 10369], [10199, 10373], [10203, 10377], [10207, 10381], [10211, 10385], [10215, 10389], [10219, 10393], [10223, 10397], [10227, 10401], [10230, 10266], [10265, 10267], [10266, 10268, 10404], [10267, 10269], [10231, 10268, 10270], [10269, 10271], [10270, 10272, 10405], [10271, 10273], [10232, 10272, 10274], [10273, 10275], [10274, 10276, 10406], [10275, 10277], [10233, 10276, 10278], [10277, 10279], [10278, 10280, 10407], [10279, 10281], [10234, 10280, 10282], [10281, 10283], [10282, 10284, 10408], [10283, 10285], [10235, 10284, 10286], [10285, 10287], [10286, 10288, 10409], [10287, 10289], [10236, 10288, 10290], [10289, 10291], [10290, 10292, 10410], [10291, 10293], [10237, 10292, 10294], [10293, 10295], [10294, 10296, 10411], [10295, 10297], [10238, 10296, 10298], [10297, 10299], [10298, 10300, 10412], [10299, 10301], [10239, 10300, 10302], [10301, 10303], [10302, 10304, 10413], [10303, 10305], [10240, 10304, 10306], [10305, 10307], [10306, 10308, 10414], [10307, 10309], [10241, 10308, 10310], [10309, 10311], [10310, 10312, 10415], [10311, 10313], [10242, 10312, 10314], [10313, 10315], [10314, 10316, 10416], [10315, 10317], [10243, 10316, 10318], [10317, 10319], [10318, 10320, 10417], [10319, 10321], [10244, 10320, 10322], [10321, 10323], [10322, 10324, 10418], [10323, 10325], [10245, 10324, 10326], [10325, 10327], [10326, 10328, 10419], [10327, 10329], [10246, 10328, 10330], [10329, 10331], [10330, 10332, 10420], [10331, 10333], [10247, 10332, 10334], [10333, 10335], [10334, 10336, 10421], [10335, 10337], [10248, 10336, 10338], [10337, 10339], [10338, 10340, 10422], [10339, 10341], [10249, 10340, 10342], [10341, 10343], [10342, 10344, 10423], [10343, 10345], [10250, 10344, 10346], [10345, 10347], [10346, 10348, 10424], [10347, 10349], [10251, 10348, 10350], [10349, 10351], [10350, 10352, 10425], [10351, 10353], [10252, 10352, 10354], [10353, 10355], [10354, 10356, 10426], [10355, 10357], [10253, 10356, 10358], [10357, 10359], [10358, 10360, 10427], [10359, 10361], [10254, 10360, 10362], [10361, 10363], [10362, 10364, 10428], [10363, 10365], [10255, 10364, 10366], [10365, 10367], [10366, 10368, 10429], [10367, 10369], [10256, 10368, 10370], [10369, 10371], [10370, 10372, 10430], [10371, 10373], [10257, 10372, 10374], [10373, 10375], [10374, 10376, 10431], [10375, 10377], [10258, 10376, 10378], [10377, 10379], [10378, 10380, 10432], [10379, 10381], [10259, 10380, 10382], [10381, 10383], [10382, 10384, 10433], [10383, 10385], [10260, 10384, 10386], [10385, 10387], [10386, 10388, 10434], [10387, 10389], [10261, 10388, 10390], [10389, 10391], [10390, 10392, 10435], [10391, 10393], [10262, 10392, 10394], [10393, 10395], [10394, 10396, 10436], [10395, 10397], [10263, 10396, 10398], [10397, 10399], [10398, 10400, 10437], [10399, 10401], [10264, 10400, 10402], [10401, 10403], [10402, 10438], [10267, 10441], [10271, 10445], [10275, 10449], [10279, 10453], [10283, 10457], [10287, 10461], [10291, 10465], [10295, 10469], [10299, 10473], [10303, 10477], [10307, 10481], [10311, 10485], [10315, 10489], [10319, 10493], [10323, 10497], [10327, 10501], [10331, 10505], [10335, 10509], [10339, 10513], [10343, 10517], [10347, 10521], [10351, 10525], [10355, 10529], [10359, 10533], [10363, 10537], [10367, 10541], [10371, 10545], [10375, 10549], [10379, 10553], [10383, 10557], [10387, 10561], [10391, 10565], [10395, 10569], [10399, 10573], [10403, 10577], [10440, 10578], [10439, 10441], [10404, 10440, 10442], [10441, 10443], [10442, 10444, 10579], [10443, 10445], [10405, 10444, 10446], [10445, 10447], [10446, 10448, 10580], [10447, 10449], [10406, 10448, 10450], [10449, 10451], [10450, 10452, 10581], [10451, 10453], [10407, 10452, 10454], [10453, 10455], [10454, 10456, 10582], [10455, 10457], [10408, 10456, 10458], [10457, 10459], [10458, 10460, 10583], [10459, 10461], [10409, 10460, 10462], [10461, 10463], [10462, 10464, 10584], [10463, 10465], [10410, 10464, 10466], [10465, 10467], [10466, 10468, 10585], [10467, 10469], [10411, 10468, 10470], [10469, 10471], [10470, 10472, 10586], [10471, 10473], [10412, 10472, 10474], [10473, 10475], [10474, 10476, 10587], [10475, 10477], [10413, 10476, 10478], [10477, 10479], [10478, 10480, 10588], [10479, 10481], [10414, 10480, 10482], [10481, 10483], [10482, 10484, 10589], [10483, 10485], [10415, 10484, 10486], [10485, 10487], [10486, 10488, 10590], [10487, 10489], [10416, 10488, 10490], [10489, 10491], [10490, 10492, 10591], [10491, 10493], [10417, 10492, 10494], [10493, 10495], [10494, 10496, 10592], [10495, 10497], [10418, 10496, 10498], [10497, 10499], [10498, 10500, 10593], [10499, 10501], [10419, 10500, 10502], [10501, 10503], [10502, 10504, 10594], [10503, 10505], [10420, 10504, 10506], [10505, 10507], [10506, 10508, 10595], [10507, 10509], [10421, 10508, 10510], [10509, 10511], [10510, 10512, 10596], [10511, 10513], [10422, 10512, 10514], [10513, 10515], [10514, 10516, 10597], [10515, 10517], [10423, 10516, 10518], [10517, 10519], [10518, 10520, 10598], [10519, 10521], [10424, 10520, 10522], [10521, 10523], [10522, 10524, 10599], [10523, 10525], [10425, 10524, 10526], [10525, 10527], [10526, 10528, 10600], [10527, 10529], [10426, 10528, 10530], [10529, 10531], [10530, 10532, 10601], [10531, 10533], [10427, 10532, 10534], [10533, 10535], [10534, 10536, 10602], [10535, 10537], [10428, 10536, 10538], [10537, 10539], [10538, 10540, 10603], [10539, 10541], [10429, 10540, 10542], [10541, 10543], [10542, 10544, 10604], [10543, 10545], [10430, 10544, 10546], [10545, 10547], [10546, 10548, 10605], [10547, 10549], [10431, 10548, 10550], [10549, 10551], [10550, 10552, 10606], [10551, 10553], [10432, 10552, 10554], [10553, 10555], [10554, 10556, 10607], [10555, 10557], [10433, 10556, 10558], [10557, 10559], [10558, 10560, 10608], [10559, 10561], [10434, 10560, 10562], [10561, 10563], [10562, 10564, 10609], [10563, 10565], [10435, 10564, 10566], [10565, 10567], [10566, 10568, 10610], [10567, 10569], [10436, 10568, 10570], [10569, 10571], [10570, 10572, 10611], [10571, 10573], [10437, 10572, 10574], [10573, 10575], [10574, 10576, 10612], [10575, 10577], [10438, 10576], [10439, 10613], [10443, 10617], [10447, 10621], [10451, 10625], [10455, 10629], [10459, 10633], [10463, 10637], [10467, 10641], [10471, 10645], [10475, 10649], [10479, 10653], [10483, 10657], [10487, 10661], [10491, 10665], [10495, 10669], [10499, 10673], [10503, 10677], [10507, 10681], [10511, 10685], [10515, 10689], [10519, 10693], [10523, 10697], [10527, 10701], [10531, 10705], [10535, 10709], [10539, 10713], [10543, 10717], [10547, 10721], [10551, 10725], [10555, 10729], [10559, 10733], [10563, 10737], [10567, 10741], [10571, 10745], [10575, 10749], [10578, 10614], [10613, 10615], [10614, 10616, 10752], [10615, 10617], [10579, 10616, 10618], [10617, 10619], [10618, 10620, 10753], [10619, 10621], [10580, 10620, 10622], [10621, 10623], [10622, 10624, 10754], [10623, 10625], [10581, 10624, 10626], [10625, 10627], [10626, 10628, 10755], [10627, 10629], [10582, 10628, 10630], [10629, 10631], [10630, 10632, 10756], [10631, 10633], [10583, 10632, 10634], [10633, 10635], [10634, 10636, 10757], [10635, 10637], [10584, 10636, 10638], [10637, 10639], [10638, 10640, 10758], [10639, 10641], [10585, 10640, 10642], [10641, 10643], [10642, 10644, 10759], [10643, 10645], [10586, 10644, 10646], [10645, 10647], [10646, 10648, 10760], [10647, 10649], [10587, 10648, 10650], [10649, 10651], [10650, 10652, 10761], [10651, 10653], [10588, 10652, 10654], [10653, 10655], [10654, 10656, 10762], [10655, 10657], [10589, 10656, 10658], [10657, 10659], [10658, 10660, 10763], [10659, 10661], [10590, 10660, 10662], [10661, 10663], [10662, 10664, 10764], [10663, 10665], [10591, 10664, 10666], [10665, 10667], [10666, 10668, 10765], [10667, 10669], [10592, 10668, 10670], [10669, 10671], [10670, 10672, 10766], [10671, 10673], [10593, 10672, 10674], [10673, 10675], [10674, 10676, 10767], [10675, 10677], [10594, 10676, 10678], [10677, 10679], [10678, 10680, 10768], [10679, 10681], [10595, 10680, 10682], [10681, 10683], [10682, 10684, 10769], [10683, 10685], [10596, 10684, 10686], [10685, 10687], [10686, 10688, 10770], [10687, 10689], [10597, 10688, 10690], [10689, 10691], [10690, 10692, 10771], [10691, 10693], [10598, 10692, 10694], [10693, 10695], [10694, 10696, 10772], [10695, 10697], [10599, 10696, 10698], [10697, 10699], [10698, 10700, 10773], [10699, 10701], [10600, 10700, 10702], [10701, 10703], [10702, 10704, 10774], [10703, 10705], [10601, 10704, 10706], [10705, 10707], [10706, 10708, 10775], [10707, 10709], [10602, 10708, 10710], [10709, 10711], [10710, 10712, 10776], [10711, 10713], [10603, 10712, 10714], [10713, 10715], [10714, 10716, 10777], [10715, 10717], [10604, 10716, 10718], [10717, 10719], [10718, 10720, 10778], [10719, 10721], [10605, 10720, 10722], [10721, 10723], [10722, 10724, 10779], [10723, 10725], [10606, 10724, 10726], [10725, 10727], [10726, 10728, 10780], [10727, 10729], [10607, 10728, 10730], [10729, 10731], [10730, 10732, 10781], [10731, 10733], [10608, 10732, 10734], [10733, 10735], [10734, 10736, 10782], [10735, 10737], [10609, 10736, 10738], [10737, 10739], [10738, 10740, 10783], [10739, 10741], [10610, 10740, 10742], [10741, 10743], [10742, 10744, 10784], [10743, 10745], [10611, 10744, 10746], [10745, 10747], [10746, 10748, 10785], [10747, 10749], [10612, 10748, 10750], [10749, 10751], [10750, 10786], [10615, 10789], [10619, 10793], [10623, 10797], [10627, 10801], [10631, 10805], [10635, 10809], [10639, 10813], [10643, 10817], [10647, 10821], [10651, 10825], [10655, 10829], [10659, 10833], [10663, 10837], [10667, 10841], [10671, 10845], [10675, 10849], [10679, 10853], [10683, 10857], [10687, 10861], [10691, 10865], [10695, 10869], [10699, 10873], [10703, 10877], [10707, 10881], [10711, 10885], [10715, 10889], [10719, 10893], [10723, 10897], [10727, 10901], [10731, 10905], [10735, 10909], [10739, 10913], [10743, 10917], [10747, 10921], [10751, 10925], [10788, 10926], [10787, 10789], [10752, 10788, 10790], [10789, 10791], [10790, 10792, 10927], [10791, 10793], [10753, 10792, 10794], [10793, 10795], [10794, 10796, 10928], [10795, 10797], [10754, 10796, 10798], [10797, 10799], [10798, 10800, 10929], [10799, 10801], [10755, 10800, 10802], [10801, 10803], [10802, 10804, 10930], [10803, 10805], [10756, 10804, 10806], [10805, 10807], [10806, 10808, 10931], [10807, 10809], [10757, 10808, 10810], [10809, 10811], [10810, 10812, 10932], [10811, 10813], [10758, 10812, 10814], [10813, 10815], [10814, 10816, 10933], [10815, 10817], [10759, 10816, 10818], [10817, 10819], [10818, 10820, 10934], [10819, 10821], [10760, 10820, 10822], [10821, 10823], [10822, 10824, 10935], [10823, 10825], [10761, 10824, 10826], [10825, 10827], [10826, 10828, 10936], [10827, 10829], [10762, 10828, 10830], [10829, 10831], [10830, 10832, 10937], [10831, 10833], [10763, 10832, 10834], [10833, 10835], [10834, 10836, 10938], [10835, 10837], [10764, 10836, 10838], [10837, 10839], [10838, 10840, 10939], [10839, 10841], [10765, 10840, 10842], [10841, 10843], [10842, 10844, 10940], [10843, 10845], [10766, 10844, 10846], [10845, 10847], [10846, 10848, 10941], [10847, 10849], [10767, 10848, 10850], [10849, 10851], [10850, 10852, 10942], [10851, 10853], [10768, 10852, 10854], [10853, 10855], [10854, 10856, 10943], [10855, 10857], [10769, 10856, 10858], [10857, 10859], [10858, 10860, 10944], [10859, 10861], [10770, 10860, 10862], [10861, 10863], [10862, 10864, 10945], [10863, 10865], [10771, 10864, 10866], [10865, 10867], [10866, 10868, 10946], [10867, 10869], [10772, 10868, 10870], [10869, 10871], [10870, 10872, 10947], [10871, 10873], [10773, 10872, 10874], [10873, 10875], [10874, 10876, 10948], [10875, 10877], [10774, 10876, 10878], [10877, 10879], [10878, 10880, 10949], [10879, 10881], [10775, 10880, 10882], [10881, 10883], [10882, 10884, 10950], [10883, 10885], [10776, 10884, 10886], [10885, 10887], [10886, 10888, 10951], [10887, 10889], [10777, 10888, 10890], [10889, 10891], [10890, 10892, 10952], [10891, 10893], [10778, 10892, 10894], [10893, 10895], [10894, 10896, 10953], [10895, 10897], [10779, 10896, 10898], [10897, 10899], [10898, 10900, 10954], [10899, 10901], [10780, 10900, 10902], [10901, 10903], [10902, 10904, 10955], [10903, 10905], [10781, 10904, 10906], [10905, 10907], [10906, 10908, 10956], [10907, 10909], [10782, 10908, 10910], [10909, 10911], [10910, 10912, 10957], [10911, 10913], [10783, 10912, 10914], [10913, 10915], [10914, 10916, 10958], [10915, 10917], [10784, 10916, 10918], [10917, 10919], [10918, 10920, 10959], [10919, 10921], [10785, 10920, 10922], [10921, 10923], [10922, 10924, 10960], [10923, 10925], [10786, 10924], [10787, 10961], [10791, 10965], [10795, 10969], [10799, 10973], [10803, 10977], [10807, 10981], [10811, 10985], [10815, 10989], [10819, 10993], [10823, 10997], [10827, 11001], [10831, 11005], [10835, 11009], [10839, 11013], [10843, 11017], [10847, 11021], [10851, 11025], [10855, 11029], [10859, 11033], [10863, 11037], [10867, 11041], [10871, 11045], [10875, 11049], [10879, 11053], [10883, 11057], [10887, 11061], [10891, 11065], [10895, 11069], [10899, 11073], [10903, 11077], [10907, 11081], [10911, 11085], [10915, 11089], [10919, 11093], [10923, 11097], [10926, 10962], [10961, 10963], [10962, 10964, 11100], [10963, 10965], [10927, 10964, 10966], [10965, 10967], [10966, 10968, 11101], [10967, 10969], [10928, 10968, 10970], [10969, 10971], [10970, 10972, 11102], [10971, 10973], [10929, 10972, 10974], [10973, 10975], [10974, 10976, 11103], [10975, 10977], [10930, 10976, 10978], [10977, 10979], [10978, 10980, 11104], [10979, 10981], [10931, 10980, 10982], [10981, 10983], [10982, 10984, 11105], [10983, 10985], [10932, 10984, 10986], [10985, 10987], [10986, 10988, 11106], [10987, 10989], [10933, 10988, 10990], [10989, 10991], [10990, 10992, 11107], [10991, 10993], [10934, 10992, 10994], [10993, 10995], [10994, 10996, 11108], [10995, 10997], [10935, 10996, 10998], [10997, 10999], [10998, 11000, 11109], [10999, 11001], [10936, 11000, 11002], [11001, 11003], [11002, 11004, 11110], [11003, 11005], [10937, 11004, 11006], [11005, 11007], [11006, 11008, 11111], [11007, 11009], [10938, 11008, 11010], [11009, 11011], [11010, 11012, 11112], [11011, 11013], [10939, 11012, 11014], [11013, 11015], [11014, 11016, 11113], [11015, 11017], [10940, 11016, 11018], [11017, 11019], [11018, 11020, 11114], [11019, 11021], [10941, 11020, 11022], [11021, 11023], [11022, 11024, 11115], [11023, 11025], [10942, 11024, 11026], [11025, 11027], [11026, 11028, 11116], [11027, 11029], [10943, 11028, 11030], [11029, 11031], [11030, 11032, 11117], [11031, 11033], [10944, 11032, 11034], [11033, 11035], [11034, 11036, 11118], [11035, 11037], [10945, 11036, 11038], [11037, 11039], [11038, 11040, 11119], [11039, 11041], [10946, 11040, 11042], [11041, 11043], [11042, 11044, 11120], [11043, 11045], [10947, 11044, 11046], [11045, 11047], [11046, 11048, 11121], [11047, 11049], [10948, 11048, 11050], [11049, 11051], [11050, 11052, 11122], [11051, 11053], [10949, 11052, 11054], [11053, 11055], [11054, 11056, 11123], [11055, 11057], [10950, 11056, 11058], [11057, 11059], [11058, 11060, 11124], [11059, 11061], [10951, 11060, 11062], [11061, 11063], [11062, 11064, 11125], [11063, 11065], [10952, 11064, 11066], [11065, 11067], [11066, 11068, 11126], [11067, 11069], [10953, 11068, 11070], [11069, 11071], [11070, 11072, 11127], [11071, 11073], [10954, 11072, 11074], [11073, 11075], [11074, 11076, 11128], [11075, 11077], [10955, 11076, 11078], [11077, 11079], [11078, 11080, 11129], [11079, 11081], [10956, 11080, 11082], [11081, 11083], [11082, 11084, 11130], [11083, 11085], [10957, 11084, 11086], [11085, 11087], [11086, 11088, 11131], [11087, 11089], [10958, 11088, 11090], [11089, 11091], [11090, 11092, 11132], [11091, 11093], [10959, 11092, 11094], [11093, 11095], [11094, 11096, 11133], [11095, 11097], [10960, 11096, 11098], [11097, 11099], [11098, 11134], [10963, 11137], [10967, 11141], [10971, 11145], [10975, 11149], [10979, 11153], [10983, 11157], [10987, 11161], [10991, 11165], [10995, 11169], [10999, 11173], [11003, 11177], [11007, 11181], [11011, 11185], [11015, 11189], [11019, 11193], [11023, 11197], [11027, 11201], [11031, 11205], [11035, 11209], [11039, 11213], [11043, 11217], [11047, 11221], [11051, 11225], [11055, 11229], [11059, 11233], [11063, 11237], [11067, 11241], [11071, 11245], [11075, 11249], [11079, 11253], [11083, 11257], [11087, 11261], [11091, 11265], [11095, 11269], [11099, 11273], [11136, 11274], [11135, 11137], [11100, 11136, 11138], [11137, 11139], [11138, 11140, 11275], [11139, 11141], [11101, 11140, 11142], [11141, 11143], [11142, 11144, 11276], [11143, 11145], [11102, 11144, 11146], [11145, 11147], [11146, 11148, 11277], [11147, 11149], [11103, 11148, 11150], [11149, 11151], [11150, 11152, 11278], [11151, 11153], [11104, 11152, 11154], [11153, 11155], [11154, 11156, 11279], [11155, 11157], [11105, 11156, 11158], [11157, 11159], [11158, 11160, 11280], [11159, 11161], [11106, 11160, 11162], [11161, 11163], [11162, 11164, 11281], [11163, 11165], [11107, 11164, 11166], [11165, 11167], [11166, 11168, 11282], [11167, 11169], [11108, 11168, 11170], [11169, 11171], [11170, 11172, 11283], [11171, 11173], [11109, 11172, 11174], [11173, 11175], [11174, 11176, 11284], [11175, 11177], [11110, 11176, 11178], [11177, 11179], [11178, 11180, 11285], [11179, 11181], [11111, 11180, 11182], [11181, 11183], [11182, 11184, 11286], [11183, 11185], [11112, 11184, 11186], [11185, 11187], [11186, 11188, 11287], [11187, 11189], [11113, 11188, 11190], [11189, 11191], [11190, 11192, 11288], [11191, 11193], [11114, 11192, 11194], [11193, 11195], [11194, 11196, 11289], [11195, 11197], [11115, 11196, 11198], [11197, 11199], [11198, 11200, 11290], [11199, 11201], [11116, 11200, 11202], [11201, 11203], [11202, 11204, 11291], [11203, 11205], [11117, 11204, 11206], [11205, 11207], [11206, 11208, 11292], [11207, 11209], [11118, 11208, 11210], [11209, 11211], [11210, 11212, 11293], [11211, 11213], [11119, 11212, 11214], [11213, 11215], [11214, 11216, 11294], [11215, 11217], [11120, 11216, 11218], [11217, 11219], [11218, 11220, 11295], [11219, 11221], [11121, 11220, 11222], [11221, 11223], [11222, 11224, 11296], [11223, 11225], [11122, 11224, 11226], [11225, 11227], [11226, 11228, 11297], [11227, 11229], [11123, 11228, 11230], [11229, 11231], [11230, 11232, 11298], [11231, 11233], [11124, 11232, 11234], [11233, 11235], [11234, 11236, 11299], [11235, 11237], [11125, 11236, 11238], [11237, 11239], [11238, 11240, 11300], [11239, 11241], [11126, 11240, 11242], [11241, 11243], [11242, 11244, 11301], [11243, 11245], [11127, 11244, 11246], [11245, 11247], [11246, 11248, 11302], [11247, 11249], [11128, 11248, 11250], [11249, 11251], [11250, 11252, 11303], [11251, 11253], [11129, 11252, 11254], [11253, 11255], [11254, 11256, 11304], [11255, 11257], [11130, 11256, 11258], [11257, 11259], [11258, 11260, 11305], [11259, 11261], [11131, 11260, 11262], [11261, 11263], [11262, 11264, 11306], [11263, 11265], [11132, 11264, 11266], [11265, 11267], [11266, 11268, 11307], [11267, 11269], [11133, 11268, 11270], [11269, 11271], [11270, 11272, 11308], [11271, 11273], [11134, 11272], [11135, 11309], [11139, 11313], [11143, 11317], [11147, 11321], [11151, 11325], [11155, 11329], [11159, 11333], [11163, 11337], [11167, 11341], [11171, 11345], [11175, 11349], [11179, 11353], [11183, 11357], [11187, 11361], [11191, 11365], [11195, 11369], [11199, 11373], [11203, 11377], [11207, 11381], [11211, 11385], [11215, 11389], [11219, 11393], [11223, 11397], [11227, 11401], [11231, 11405], [11235, 11409], [11239, 11413], [11243, 11417], [11247, 11421], [11251, 11425], [11255, 11429], [11259, 11433], [11263, 11437], [11267, 11441], [11271, 11445], [11274, 11310], [11309, 11311], [11310, 11312, 11448], [11311, 11313], [11275, 11312, 11314], [11313, 11315], [11314, 11316, 11449], [11315, 11317], [11276, 11316, 11318], [11317, 11319], [11318, 11320, 11450], [11319, 11321], [11277, 11320, 11322], [11321, 11323], [11322, 11324, 11451], [11323, 11325], [11278, 11324, 11326], [11325, 11327], [11326, 11328, 11452], [11327, 11329], [11279, 11328, 11330], [11329, 11331], [11330, 11332, 11453], [11331, 11333], [11280, 11332, 11334], [11333, 11335], [11334, 11336, 11454], [11335, 11337], [11281, 11336, 11338], [11337, 11339], [11338, 11340, 11455], [11339, 11341], [11282, 11340, 11342], [11341, 11343], [11342, 11344, 11456], [11343, 11345], [11283, 11344, 11346], [11345, 11347], [11346, 11348, 11457], [11347, 11349], [11284, 11348, 11350], [11349, 11351], [11350, 11352, 11458], [11351, 11353], [11285, 11352, 11354], [11353, 11355], [11354, 11356, 11459], [11355, 11357], [11286, 11356, 11358], [11357, 11359], [11358, 11360, 11460], [11359, 11361], [11287, 11360, 11362], [11361, 11363], [11362, 11364, 11461], [11363, 11365], [11288, 11364, 11366], [11365, 11367], [11366, 11368, 11462], [11367, 11369], [11289, 11368, 11370], [11369, 11371], [11370, 11372, 11463], [11371, 11373], [11290, 11372, 11374], [11373, 11375], [11374, 11376, 11464], [11375, 11377], [11291, 11376, 11378], [11377, 11379], [11378, 11380, 11465], [11379, 11381], [11292, 11380, 11382], [11381, 11383], [11382, 11384, 11466], [11383, 11385], [11293, 11384, 11386], [11385, 11387], [11386, 11388, 11467], [11387, 11389], [11294, 11388, 11390], [11389, 11391], [11390, 11392, 11468], [11391, 11393], [11295, 11392, 11394], [11393, 11395], [11394, 11396, 11469], [11395, 11397], [11296, 11396, 11398], [11397, 11399], [11398, 11400, 11470], [11399, 11401], [11297, 11400, 11402], [11401, 11403], [11402, 11404, 11471], [11403, 11405], [11298, 11404, 11406], [11405, 11407], [11406, 11408, 11472], [11407, 11409], [11299, 11408, 11410], [11409, 11411], [11410, 11412, 11473], [11411, 11413], [11300, 11412, 11414], [11413, 11415], [11414, 11416, 11474], [11415, 11417], [11301, 11416, 11418], [11417, 11419], [11418, 11420, 11475], [11419, 11421], [11302, 11420, 11422], [11421, 11423], [11422, 11424, 11476], [11423, 11425], [11303, 11424, 11426], [11425, 11427], [11426, 11428, 11477], [11427, 11429], [11304, 11428, 11430], [11429, 11431], [11430, 11432, 11478], [11431, 11433], [11305, 11432, 11434], [11433, 11435], [11434, 11436, 11479], [11435, 11437], [11306, 11436, 11438], [11437, 11439], [11438, 11440, 11480], [11439, 11441], [11307, 11440, 11442], [11441, 11443], [11442, 11444, 11481], [11443, 11445], [11308, 11444, 11446], [11445, 11447], [11446, 11482], [11311, 11485], [11315, 11489], [11319, 11493], [11323, 11497], [11327, 11501], [11331, 11505], [11335, 11509], [11339, 11513], [11343, 11517], [11347, 11521], [11351, 11525], [11355, 11529], [11359, 11533], [11363, 11537], [11367, 11541], [11371, 11545], [11375, 11549], [11379, 11553], [11383, 11557], [11387, 11561], [11391, 11565], [11395, 11569], [11399, 11573], [11403, 11577], [11407, 11581], [11411, 11585], [11415, 11589], [11419, 11593], [11423, 11597], [11427, 11601], [11431, 11605], [11435, 11609], [11439, 11613], [11443, 11617], [11447, 11621], [11484, 11622], [11483, 11485], [11448, 11484, 11486], [11485, 11487], [11486, 11488, 11623], [11487, 11489], [11449, 11488, 11490], [11489, 11491], [11490, 11492, 11624], [11491, 11493], [11450, 11492, 11494], [11493, 11495], [11494, 11496, 11625], [11495, 11497], [11451, 11496, 11498], [11497, 11499], [11498, 11500, 11626], [11499, 11501], [11452, 11500, 11502], [11501, 11503], [11502, 11504, 11627], [11503, 11505], [11453, 11504, 11506], [11505, 11507], [11506, 11508, 11628], [11507, 11509], [11454, 11508, 11510], [11509, 11511], [11510, 11512, 11629], [11511, 11513], [11455, 11512, 11514], [11513, 11515], [11514, 11516, 11630], [11515, 11517], [11456, 11516, 11518], [11517, 11519], [11518, 11520, 11631], [11519, 11521], [11457, 11520, 11522], [11521, 11523], [11522, 11524, 11632], [11523, 11525], [11458, 11524, 11526], [11525, 11527], [11526, 11528, 11633], [11527, 11529], [11459, 11528, 11530], [11529, 11531], [11530, 11532, 11634], [11531, 11533], [11460, 11532, 11534], [11533, 11535], [11534, 11536, 11635], [11535, 11537], [11461, 11536, 11538], [11537, 11539], [11538, 11540, 11636], [11539, 11541], [11462, 11540, 11542], [11541, 11543], [11542, 11544, 11637], [11543, 11545], [11463, 11544, 11546], [11545, 11547], [11546, 11548, 11638], [11547, 11549], [11464, 11548, 11550], [11549, 11551], [11550, 11552, 11639], [11551, 11553], [11465, 11552, 11554], [11553, 11555], [11554, 11556, 11640], [11555, 11557], [11466, 11556, 11558], [11557, 11559], [11558, 11560, 11641], [11559, 11561], [11467, 11560, 11562], [11561, 11563], [11562, 11564, 11642], [11563, 11565], [11468, 11564, 11566], [11565, 11567], [11566, 11568, 11643], [11567, 11569], [11469, 11568, 11570], [11569, 11571], [11570, 11572, 11644], [11571, 11573], [11470, 11572, 11574], [11573, 11575], [11574, 11576, 11645], [11575, 11577], [11471, 11576, 11578], [11577, 11579], [11578, 11580, 11646], [11579, 11581], [11472, 11580, 11582], [11581, 11583], [11582, 11584, 11647], [11583, 11585], [11473, 11584, 11586], [11585, 11587], [11586, 11588, 11648], [11587, 11589], [11474, 11588, 11590], [11589, 11591], [11590, 11592, 11649], [11591, 11593], [11475, 11592, 11594], [11593, 11595], [11594, 11596, 11650], [11595, 11597], [11476, 11596, 11598], [11597, 11599], [11598, 11600, 11651], [11599, 11601], [11477, 11600, 11602], [11601, 11603], [11602, 11604, 11652], [11603, 11605], [11478, 11604, 11606], [11605, 11607], [11606, 11608, 11653], [11607, 11609], [11479, 11608, 11610], [11609, 11611], [11610, 11612, 11654], [11611, 11613], [11480, 11612, 11614], [11613, 11615], [11614, 11616, 11655], [11615, 11617], [11481, 11616, 11618], [11617, 11619], [11618, 11620, 11656], [11619, 11621], [11482, 11620], [11483, 11657], [11487, 11661], [11491, 11665], [11495, 11669], [11499, 11673], [11503, 11677], [11507, 11681], [11511, 11685], [11515, 11689], [11519, 11693], [11523, 11697], [11527, 11701], [11531, 11705], [11535, 11709], [11539, 11713], [11543, 11717], [11547, 11721], [11551, 11725], [11555, 11729], [11559, 11733], [11563, 11737], [11567, 11741], [11571, 11745], [11575, 11749], [11579, 11753], [11583, 11757], [11587, 11761], [11591, 11765], [11595, 11769], [11599, 11773], [11603, 11777], [11607, 11781], [11611, 11785], [11615, 11789], [11619, 11793], [11622, 11658], [11657, 11659], [11658, 11660, 11796], [11659, 11661], [11623, 11660, 11662], [11661, 11663], [11662, 11664, 11797], [11663, 11665], [11624, 11664, 11666], [11665, 11667], [11666, 11668, 11798], [11667, 11669], [11625, 11668, 11670], [11669, 11671], [11670, 11672, 11799], [11671, 11673], [11626, 11672, 11674], [11673, 11675], [11674, 11676, 11800], [11675, 11677], [11627, 11676, 11678], [11677, 11679], [11678, 11680, 11801], [11679, 11681], [11628, 11680, 11682], [11681, 11683], [11682, 11684, 11802], [11683, 11685], [11629, 11684, 11686], [11685, 11687], [11686, 11688, 11803], [11687, 11689], [11630, 11688, 11690], [11689, 11691], [11690, 11692, 11804], [11691, 11693], [11631, 11692, 11694], [11693, 11695], [11694, 11696, 11805], [11695, 11697], [11632, 11696, 11698], [11697, 11699], [11698, 11700, 11806], [11699, 11701], [11633, 11700, 11702], [11701, 11703], [11702, 11704, 11807], [11703, 11705], [11634, 11704, 11706], [11705, 11707], [11706, 11708, 11808], [11707, 11709], [11635, 11708, 11710], [11709, 11711], [11710, 11712, 11809], [11711, 11713], [11636, 11712, 11714], [11713, 11715], [11714, 11716, 11810], [11715, 11717], [11637, 11716, 11718], [11717, 11719], [11718, 11720, 11811], [11719, 11721], [11638, 11720, 11722], [11721, 11723], [11722, 11724, 11812], [11723, 11725], [11639, 11724, 11726], [11725, 11727], [11726, 11728, 11813], [11727, 11729], [11640, 11728, 11730], [11729, 11731], [11730, 11732, 11814], [11731, 11733], [11641, 11732, 11734], [11733, 11735], [11734, 11736, 11815], [11735, 11737], [11642, 11736, 11738], [11737, 11739], [11738, 11740, 11816], [11739, 11741], [11643, 11740, 11742], [11741, 11743], [11742, 11744, 11817], [11743, 11745], [11644, 11744, 11746], [11745, 11747], [11746, 11748, 11818], [11747, 11749], [11645, 11748, 11750], [11749, 11751], [11750, 11752, 11819], [11751, 11753], [11646, 11752, 11754], [11753, 11755], [11754, 11756, 11820], [11755, 11757], [11647, 11756, 11758], [11757, 11759], [11758, 11760, 11821], [11759, 11761], [11648, 11760, 11762], [11761, 11763], [11762, 11764, 11822], [11763, 11765], [11649, 11764, 11766], [11765, 11767], [11766, 11768, 11823], [11767, 11769], [11650, 11768, 11770], [11769, 11771], [11770, 11772, 11824], [11771, 11773], [11651, 11772, 11774], [11773, 11775], [11774, 11776, 11825], [11775, 11777], [11652, 11776, 11778], [11777, 11779], [11778, 11780, 11826], [11779, 11781], [11653, 11780, 11782], [11781, 11783], [11782, 11784, 11827], [11783, 11785], [11654, 11784, 11786], [11785, 11787], [11786, 11788, 11828], [11787, 11789], [11655, 11788, 11790], [11789, 11791], [11790, 11792, 11829], [11791, 11793], [11656, 11792, 11794], [11793, 11795], [11794, 11830], [11659, 11832], [11663, 11836], [11667, 11840], [11671, 11844], [11675, 11848], [11679, 11852], [11683, 11856], [11687, 11860], [11691, 11864], [11695, 11868], [11699, 11872], [11703, 11876], [11707, 11880], [11711, 11884], [11715, 11888], [11719, 11892], [11723, 11896], [11727, 11900], [11731, 11904], [11735, 11908], [11739, 11912], [11743, 11916], [11747, 11920], [11751, 11924], [11755, 11928], [11759, 11932], [11763, 11936], [11767, 11940], [11771, 11944], [11775, 11948], [11779, 11952], [11783, 11956], [11787, 11960], [11791, 11964], [11795, 11968], [11832], [11796, 11831, 11833], [11832, 11834], [11833, 11835], [11834, 11836], [11797, 11835, 11837], [11836, 11838], [11837, 11839], [11838, 11840], [11798, 11839, 11841], [11840, 11842], [11841, 11843], [11842, 11844], [11799, 11843, 11845], [11844, 11846], [11845, 11847], [11846, 11848], [11800, 11847, 11849], [11848, 11850], [11849, 11851], [11850, 11852], [11801, 11851, 11853], [11852, 11854], [11853, 11855], [11854, 11856], [11802, 11855, 11857], [11856, 11858], [11857, 11859], [11858, 11860], [11803, 11859, 11861], [11860, 11862], [11861, 11863], [11862, 11864], [11804, 11863, 11865], [11864, 11866], [11865, 11867], [11866, 11868], [11805, 11867, 11869], [11868, 11870], [11869, 11871], [11870, 11872], [11806, 11871, 11873], [11872, 11874], [11873, 11875], [11874, 11876], [11807, 11875, 11877], [11876, 11878], [11877, 11879], [11878, 11880], [11808, 11879, 11881], [11880, 11882], [11881, 11883], [11882, 11884], [11809, 11883, 11885], [11884, 11886], [11885, 11887], [11886, 11888], [11810, 11887, 11889], [11888, 11890], [11889, 11891], [11890, 11892], [11811, 11891, 11893], [11892, 11894], [11893, 11895], [11894, 11896], [11812, 11895, 11897], [11896, 11898], [11897, 11899], [11898, 11900], [11813, 11899, 11901], [11900, 11902], [11901, 11903], [11902, 11904], [11814, 11903, 11905], [11904, 11906], [11905, 11907], [11906, 11908], [11815, 11907, 11909], [11908, 11910], [11909, 11911], [11910, 11912], [11816, 11911, 11913], [11912, 11914], [11913, 11915], [11914, 11916], [11817, 11915, 11917], [11916, 11918], [11917, 11919], [11918, 11920], [11818, 11919, 11921], [11920, 11922], [11921, 11923], [11922, 11924], [11819, 11923, 11925], [11924, 11926], [11925, 11927], [11926, 11928], [11820, 11927, 11929], [11928, 11930], [11929, 11931], [11930, 11932], [11821, 11931, 11933], [11932, 11934], [11933, 11935], [11934, 11936], [11822, 11935, 11937], [11936, 11938], [11937, 11939], [11938, 11940], [11823, 11939, 11941], [11940, 11942], [11941, 11943], [11942, 11944], [11824, 11943, 11945], [11944, 11946], [11945, 11947], [11946, 11948], [11825, 11947, 11949], [11948, 11950], [11949, 11951], [11950, 11952], [11826, 11951, 11953], [11952, 11954], [11953, 11955], [11954, 11956], [11827, 11955, 11957], [11956, 11958], [11957, 11959], [11958, 11960], [11828, 11959, 11961], [11960, 11962], [11961, 11963], [11962, 11964], [11829, 11963, 11965], [11964, 11966], [11965, 11967], [11966, 11968], [11830, 11967]] -CNOTTIME: [[1, 138], [0, 2], [1, 3], [2, 4], [3, 5, 139], [4, 6], [5, 7], [6, 8], [7, 9, 140], [8, 10], [9, 11], [10, 12], [11, 13, 141], [12, 14], [13, 15], [14, 16], [15, 17, 142], [16, 18], [17, 19], [18, 20], [19, 21, 143], [20, 22], [21, 23], [22, 24], [23, 25, 144], [24, 26], [25, 27], [26, 28], [27, 29, 145], [28, 30], [29, 31], [30, 32], [31, 33, 146], [32, 34], [33, 35], [34, 36], [35, 37, 147], [36, 38], [37, 39], [38, 40], [39, 41, 148], [40, 42], [41, 43], [42, 44], [43, 45, 149], [44, 46], [45, 47], [46, 48], [47, 49, 150], [48, 50], [49, 51], [50, 52], [51, 53, 151], [52, 54], [53, 55], [54, 56], [55, 57, 152], [56, 58], [57, 59], [58, 60], [59, 61, 153], [60, 62], [61, 63], [62, 64], [63, 65, 154], [64, 66], [65, 67], [66, 68], [67, 69, 155], [68, 70], [69, 71], [70, 72], [71, 73, 156], [72, 74], [73, 75], [74, 76], [75, 77, 157], [76, 78], [77, 79], [78, 80], [79, 81, 158], [80, 82], [81, 83], [82, 84], [83, 85, 159], [84, 86], [85, 87], [86, 88], [87, 89, 160], [88, 90], [89, 91], [90, 92], [91, 93, 161], [92, 94], [93, 95], [94, 96], [95, 97, 162], [96, 98], [97, 99], [98, 100], [99, 101, 163], [100, 102], [101, 103], [102, 104], [103, 105, 164], [104, 106], [105, 107], [106, 108], [107, 109, 165], [108, 110], [109, 111], [110, 112], [111, 113, 166], [112, 114], [113, 115], [114, 116], [115, 117, 167], [116, 118], [117, 119], [118, 120], [119, 121, 168], [120, 122], [121, 123], [122, 124], [123, 125, 169], [124, 126], [125, 127], [126, 128], [127, 129, 170], [128, 130], [129, 131], [130, 132], [131, 133, 171], [132, 134], [133, 135], [134, 136], [135, 137, 172], [136], [0, 173], [4, 177], [8, 181], [12, 185], [16, 189], [20, 193], [24, 197], [28, 201], [32, 205], [36, 209], [40, 213], [44, 217], [48, 221], [52, 225], [56, 229], [60, 233], [64, 237], [68, 241], [72, 245], [76, 249], [80, 253], [84, 257], [88, 261], [92, 265], [96, 269], [100, 273], [104, 277], [108, 281], [112, 285], [116, 289], [120, 293], [124, 297], [128, 301], [132, 305], [136, 309], [138, 174], [173, 175], [174, 176, 312], [175, 177], [139, 176, 178], [177, 179], [178, 180, 313], [179, 181], [140, 180, 182], [181, 183], [182, 184, 314], [183, 185], [141, 184, 186], [185, 187], [186, 188, 315], [187, 189], [142, 188, 190], [189, 191], [190, 192, 316], [191, 193], [143, 192, 194], [193, 195], [194, 196, 317], [195, 197], [144, 196, 198], [197, 199], [198, 200, 318], [199, 201], [145, 200, 202], [201, 203], [202, 204, 319], [203, 205], [146, 204, 206], [205, 207], [206, 208, 320], [207, 209], [147, 208, 210], [209, 211], [210, 212, 321], [211, 213], [148, 212, 214], [213, 215], [214, 216, 322], [215, 217], [149, 216, 218], [217, 219], [218, 220, 323], [219, 221], [150, 220, 222], [221, 223], [222, 224, 324], [223, 225], [151, 224, 226], [225, 227], [226, 228, 325], [227, 229], [152, 228, 230], [229, 231], [230, 232, 326], [231, 233], [153, 232, 234], [233, 235], [234, 236, 327], [235, 237], [154, 236, 238], [237, 239], [238, 240, 328], [239, 241], [155, 240, 242], [241, 243], [242, 244, 329], [243, 245], [156, 244, 246], [245, 247], [246, 248, 330], [247, 249], [157, 248, 250], [249, 251], [250, 252, 331], [251, 253], [158, 252, 254], [253, 255], [254, 256, 332], [255, 257], [159, 256, 258], [257, 259], [258, 260, 333], [259, 261], [160, 260, 262], [261, 263], [262, 264, 334], [263, 265], [161, 264, 266], [265, 267], [266, 268, 335], [267, 269], [162, 268, 270], [269, 271], [270, 272, 336], [271, 273], [163, 272, 274], [273, 275], [274, 276, 337], [275, 277], [164, 276, 278], [277, 279], [278, 280, 338], [279, 281], [165, 280, 282], [281, 283], [282, 284, 339], [283, 285], [166, 284, 286], [285, 287], [286, 288, 340], [287, 289], [167, 288, 290], [289, 291], [290, 292, 341], [291, 293], [168, 292, 294], [293, 295], [294, 296, 342], [295, 297], [169, 296, 298], [297, 299], [298, 300, 343], [299, 301], [170, 300, 302], [301, 303], [302, 304, 344], [303, 305], [171, 304, 306], [305, 307], [306, 308, 345], [307, 309], [172, 308, 310], [309, 311], [310, 346], [175, 349], [179, 353], [183, 357], [187, 361], [191, 365], [195, 369], [199, 373], [203, 377], [207, 381], [211, 385], [215, 389], [219, 393], [223, 397], [227, 401], [231, 405], [235, 409], [239, 413], [243, 417], [247, 421], [251, 425], [255, 429], [259, 433], [263, 437], [267, 441], [271, 445], [275, 449], [279, 453], [283, 457], [287, 461], [291, 465], [295, 469], [299, 473], [303, 477], [307, 481], [311, 485], [348, 486], [347, 349], [312, 348, 350], [349, 351], [350, 352, 487], [351, 353], [313, 352, 354], [353, 355], [354, 356, 488], [355, 357], [314, 356, 358], [357, 359], [358, 360, 489], [359, 361], [315, 360, 362], [361, 363], [362, 364, 490], [363, 365], [316, 364, 366], [365, 367], [366, 368, 491], [367, 369], [317, 368, 370], [369, 371], [370, 372, 492], [371, 373], [318, 372, 374], [373, 375], [374, 376, 493], [375, 377], [319, 376, 378], [377, 379], [378, 380, 494], [379, 381], [320, 380, 382], [381, 383], [382, 384, 495], [383, 385], [321, 384, 386], [385, 387], [386, 388, 496], [387, 389], [322, 388, 390], [389, 391], [390, 392, 497], [391, 393], [323, 392, 394], [393, 395], [394, 396, 498], [395, 397], [324, 396, 398], [397, 399], [398, 400, 499], [399, 401], [325, 400, 402], [401, 403], [402, 404, 500], [403, 405], [326, 404, 406], [405, 407], [406, 408, 501], [407, 409], [327, 408, 410], [409, 411], [410, 412, 502], [411, 413], [328, 412, 414], [413, 415], [414, 416, 503], [415, 417], [329, 416, 418], [417, 419], [418, 420, 504], [419, 421], [330, 420, 422], [421, 423], [422, 424, 505], [423, 425], [331, 424, 426], [425, 427], [426, 428, 506], [427, 429], [332, 428, 430], [429, 431], [430, 432, 507], [431, 433], [333, 432, 434], [433, 435], [434, 436, 508], [435, 437], [334, 436, 438], [437, 439], [438, 440, 509], [439, 441], [335, 440, 442], [441, 443], [442, 444, 510], [443, 445], [336, 444, 446], [445, 447], [446, 448, 511], [447, 449], [337, 448, 450], [449, 451], [450, 452, 512], [451, 453], [338, 452, 454], [453, 455], [454, 456, 513], [455, 457], [339, 456, 458], [457, 459], [458, 460, 514], [459, 461], [340, 460, 462], [461, 463], [462, 464, 515], [463, 465], [341, 464, 466], [465, 467], [466, 468, 516], [467, 469], [342, 468, 470], [469, 471], [470, 472, 517], [471, 473], [343, 472, 474], [473, 475], [474, 476, 518], [475, 477], [344, 476, 478], [477, 479], [478, 480, 519], [479, 481], [345, 480, 482], [481, 483], [482, 484, 520], [483, 485], [346, 484], [347, 521], [351, 525], [355, 529], [359, 533], [363, 537], [367, 541], [371, 545], [375, 549], [379, 553], [383, 557], [387, 561], [391, 565], [395, 569], [399, 573], [403, 577], [407, 581], [411, 585], [415, 589], [419, 593], [423, 597], [427, 601], [431, 605], [435, 609], [439, 613], [443, 617], [447, 621], [451, 625], [455, 629], [459, 633], [463, 637], [467, 641], [471, 645], [475, 649], [479, 653], [483, 657], [486, 522], [521, 523], [522, 524, 660], [523, 525], [487, 524, 526], [525, 527], [526, 528, 661], [527, 529], [488, 528, 530], [529, 531], [530, 532, 662], [531, 533], [489, 532, 534], [533, 535], [534, 536, 663], [535, 537], [490, 536, 538], [537, 539], [538, 540, 664], [539, 541], [491, 540, 542], [541, 543], [542, 544, 665], [543, 545], [492, 544, 546], [545, 547], [546, 548, 666], [547, 549], [493, 548, 550], [549, 551], [550, 552, 667], [551, 553], [494, 552, 554], [553, 555], [554, 556, 668], [555, 557], [495, 556, 558], [557, 559], [558, 560, 669], [559, 561], [496, 560, 562], [561, 563], [562, 564, 670], [563, 565], [497, 564, 566], [565, 567], [566, 568, 671], [567, 569], [498, 568, 570], [569, 571], [570, 572, 672], [571, 573], [499, 572, 574], [573, 575], [574, 576, 673], [575, 577], [500, 576, 578], [577, 579], [578, 580, 674], [579, 581], [501, 580, 582], [581, 583], [582, 584, 675], [583, 585], [502, 584, 586], [585, 587], [586, 588, 676], [587, 589], [503, 588, 590], [589, 591], [590, 592, 677], [591, 593], [504, 592, 594], [593, 595], [594, 596, 678], [595, 597], [505, 596, 598], [597, 599], [598, 600, 679], [599, 601], [506, 600, 602], [601, 603], [602, 604, 680], [603, 605], [507, 604, 606], [605, 607], [606, 608, 681], [607, 609], [508, 608, 610], [609, 611], [610, 612, 682], [611, 613], [509, 612, 614], [613, 615], [614, 616, 683], [615, 617], [510, 616, 618], [617, 619], [618, 620, 684], [619, 621], [511, 620, 622], [621, 623], [622, 624, 685], [623, 625], [512, 624, 626], [625, 627], [626, 628, 686], [627, 629], [513, 628, 630], [629, 631], [630, 632, 687], [631, 633], [514, 632, 634], [633, 635], [634, 636, 688], [635, 637], [515, 636, 638], [637, 639], [638, 640, 689], [639, 641], [516, 640, 642], [641, 643], [642, 644, 690], [643, 645], [517, 644, 646], [645, 647], [646, 648, 691], [647, 649], [518, 648, 650], [649, 651], [650, 652, 692], [651, 653], [519, 652, 654], [653, 655], [654, 656, 693], [655, 657], [520, 656, 658], [657, 659], [658, 694], [523, 697], [527, 701], [531, 705], [535, 709], [539, 713], [543, 717], [547, 721], [551, 725], [555, 729], [559, 733], [563, 737], [567, 741], [571, 745], [575, 749], [579, 753], [583, 757], [587, 761], [591, 765], [595, 769], [599, 773], [603, 777], [607, 781], [611, 785], [615, 789], [619, 793], [623, 797], [627, 801], [631, 805], [635, 809], [639, 813], [643, 817], [647, 821], [651, 825], [655, 829], [659, 833], [696, 834], [695, 697], [660, 696, 698], [697, 699], [698, 700, 835], [699, 701], [661, 700, 702], [701, 703], [702, 704, 836], [703, 705], [662, 704, 706], [705, 707], [706, 708, 837], [707, 709], [663, 708, 710], [709, 711], [710, 712, 838], [711, 713], [664, 712, 714], [713, 715], [714, 716, 839], [715, 717], [665, 716, 718], [717, 719], [718, 720, 840], [719, 721], [666, 720, 722], [721, 723], [722, 724, 841], [723, 725], [667, 724, 726], [725, 727], [726, 728, 842], [727, 729], [668, 728, 730], [729, 731], [730, 732, 843], [731, 733], [669, 732, 734], [733, 735], [734, 736, 844], [735, 737], [670, 736, 738], [737, 739], [738, 740, 845], [739, 741], [671, 740, 742], [741, 743], [742, 744, 846], [743, 745], [672, 744, 746], [745, 747], [746, 748, 847], [747, 749], [673, 748, 750], [749, 751], [750, 752, 848], [751, 753], [674, 752, 754], [753, 755], [754, 756, 849], [755, 757], [675, 756, 758], [757, 759], [758, 760, 850], [759, 761], [676, 760, 762], [761, 763], [762, 764, 851], [763, 765], [677, 764, 766], [765, 767], [766, 768, 852], [767, 769], [678, 768, 770], [769, 771], [770, 772, 853], [771, 773], [679, 772, 774], [773, 775], [774, 776, 854], [775, 777], [680, 776, 778], [777, 779], [778, 780, 855], [779, 781], [681, 780, 782], [781, 783], [782, 784, 856], [783, 785], [682, 784, 786], [785, 787], [786, 788, 857], [787, 789], [683, 788, 790], [789, 791], [790, 792, 858], [791, 793], [684, 792, 794], [793, 795], [794, 796, 859], [795, 797], [685, 796, 798], [797, 799], [798, 800, 860], [799, 801], [686, 800, 802], [801, 803], [802, 804, 861], [803, 805], [687, 804, 806], [805, 807], [806, 808, 862], [807, 809], [688, 808, 810], [809, 811], [810, 812, 863], [811, 813], [689, 812, 814], [813, 815], [814, 816, 864], [815, 817], [690, 816, 818], [817, 819], [818, 820, 865], [819, 821], [691, 820, 822], [821, 823], [822, 824, 866], [823, 825], [692, 824, 826], [825, 827], [826, 828, 867], [827, 829], [693, 828, 830], [829, 831], [830, 832, 868], [831, 833], [694, 832], [695, 869], [699, 873], [703, 877], [707, 881], [711, 885], [715, 889], [719, 893], [723, 897], [727, 901], [731, 905], [735, 909], [739, 913], [743, 917], [747, 921], [751, 925], [755, 929], [759, 933], [763, 937], [767, 941], [771, 945], [775, 949], [779, 953], [783, 957], [787, 961], [791, 965], [795, 969], [799, 973], [803, 977], [807, 981], [811, 985], [815, 989], [819, 993], [823, 997], [827, 1001], [831, 1005], [834, 870], [869, 871], [870, 872, 1008], [871, 873], [835, 872, 874], [873, 875], [874, 876, 1009], [875, 877], [836, 876, 878], [877, 879], [878, 880, 1010], [879, 881], [837, 880, 882], [881, 883], [882, 884, 1011], [883, 885], [838, 884, 886], [885, 887], [886, 888, 1012], [887, 889], [839, 888, 890], [889, 891], [890, 892, 1013], [891, 893], [840, 892, 894], [893, 895], [894, 896, 1014], [895, 897], [841, 896, 898], [897, 899], [898, 900, 1015], [899, 901], [842, 900, 902], [901, 903], [902, 904, 1016], [903, 905], [843, 904, 906], [905, 907], [906, 908, 1017], [907, 909], [844, 908, 910], [909, 911], [910, 912, 1018], [911, 913], [845, 912, 914], [913, 915], [914, 916, 1019], [915, 917], [846, 916, 918], [917, 919], [918, 920, 1020], [919, 921], [847, 920, 922], [921, 923], [922, 924, 1021], [923, 925], [848, 924, 926], [925, 927], [926, 928, 1022], [927, 929], [849, 928, 930], [929, 931], [930, 932, 1023], [931, 933], [850, 932, 934], [933, 935], [934, 936, 1024], [935, 937], [851, 936, 938], [937, 939], [938, 940, 1025], [939, 941], [852, 940, 942], [941, 943], [942, 944, 1026], [943, 945], [853, 944, 946], [945, 947], [946, 948, 1027], [947, 949], [854, 948, 950], [949, 951], [950, 952, 1028], [951, 953], [855, 952, 954], [953, 955], [954, 956, 1029], [955, 957], [856, 956, 958], [957, 959], [958, 960, 1030], [959, 961], [857, 960, 962], [961, 963], [962, 964, 1031], [963, 965], [858, 964, 966], [965, 967], [966, 968, 1032], [967, 969], [859, 968, 970], [969, 971], [970, 972, 1033], [971, 973], [860, 972, 974], [973, 975], [974, 976, 1034], [975, 977], [861, 976, 978], [977, 979], [978, 980, 1035], [979, 981], [862, 980, 982], [981, 983], [982, 984, 1036], [983, 985], [863, 984, 986], [985, 987], [986, 988, 1037], [987, 989], [864, 988, 990], [989, 991], [990, 992, 1038], [991, 993], [865, 992, 994], [993, 995], [994, 996, 1039], [995, 997], [866, 996, 998], [997, 999], [998, 1000, 1040], [999, 1001], [867, 1000, 1002], [1001, 1003], [1002, 1004, 1041], [1003, 1005], [868, 1004, 1006], [1005, 1007], [1006, 1042], [871, 1045], [875, 1049], [879, 1053], [883, 1057], [887, 1061], [891, 1065], [895, 1069], [899, 1073], [903, 1077], [907, 1081], [911, 1085], [915, 1089], [919, 1093], [923, 1097], [927, 1101], [931, 1105], [935, 1109], [939, 1113], [943, 1117], [947, 1121], [951, 1125], [955, 1129], [959, 1133], [963, 1137], [967, 1141], [971, 1145], [975, 1149], [979, 1153], [983, 1157], [987, 1161], [991, 1165], [995, 1169], [999, 1173], [1003, 1177], [1007, 1181], [1044, 1182], [1043, 1045], [1008, 1044, 1046], [1045, 1047], [1046, 1048, 1183], [1047, 1049], [1009, 1048, 1050], [1049, 1051], [1050, 1052, 1184], [1051, 1053], [1010, 1052, 1054], [1053, 1055], [1054, 1056, 1185], [1055, 1057], [1011, 1056, 1058], [1057, 1059], [1058, 1060, 1186], [1059, 1061], [1012, 1060, 1062], [1061, 1063], [1062, 1064, 1187], [1063, 1065], [1013, 1064, 1066], [1065, 1067], [1066, 1068, 1188], [1067, 1069], [1014, 1068, 1070], [1069, 1071], [1070, 1072, 1189], [1071, 1073], [1015, 1072, 1074], [1073, 1075], [1074, 1076, 1190], [1075, 1077], [1016, 1076, 1078], [1077, 1079], [1078, 1080, 1191], [1079, 1081], [1017, 1080, 1082], [1081, 1083], [1082, 1084, 1192], [1083, 1085], [1018, 1084, 1086], [1085, 1087], [1086, 1088, 1193], [1087, 1089], [1019, 1088, 1090], [1089, 1091], [1090, 1092, 1194], [1091, 1093], [1020, 1092, 1094], [1093, 1095], [1094, 1096, 1195], [1095, 1097], [1021, 1096, 1098], [1097, 1099], [1098, 1100, 1196], [1099, 1101], [1022, 1100, 1102], [1101, 1103], [1102, 1104, 1197], [1103, 1105], [1023, 1104, 1106], [1105, 1107], [1106, 1108, 1198], [1107, 1109], [1024, 1108, 1110], [1109, 1111], [1110, 1112, 1199], [1111, 1113], [1025, 1112, 1114], [1113, 1115], [1114, 1116, 1200], [1115, 1117], [1026, 1116, 1118], [1117, 1119], [1118, 1120, 1201], [1119, 1121], [1027, 1120, 1122], [1121, 1123], [1122, 1124, 1202], [1123, 1125], [1028, 1124, 1126], [1125, 1127], [1126, 1128, 1203], [1127, 1129], [1029, 1128, 1130], [1129, 1131], [1130, 1132, 1204], [1131, 1133], [1030, 1132, 1134], [1133, 1135], [1134, 1136, 1205], [1135, 1137], [1031, 1136, 1138], [1137, 1139], [1138, 1140, 1206], [1139, 1141], [1032, 1140, 1142], [1141, 1143], [1142, 1144, 1207], [1143, 1145], [1033, 1144, 1146], [1145, 1147], [1146, 1148, 1208], [1147, 1149], [1034, 1148, 1150], [1149, 1151], [1150, 1152, 1209], [1151, 1153], [1035, 1152, 1154], [1153, 1155], [1154, 1156, 1210], [1155, 1157], [1036, 1156, 1158], [1157, 1159], [1158, 1160, 1211], [1159, 1161], [1037, 1160, 1162], [1161, 1163], [1162, 1164, 1212], [1163, 1165], [1038, 1164, 1166], [1165, 1167], [1166, 1168, 1213], [1167, 1169], [1039, 1168, 1170], [1169, 1171], [1170, 1172, 1214], [1171, 1173], [1040, 1172, 1174], [1173, 1175], [1174, 1176, 1215], [1175, 1177], [1041, 1176, 1178], [1177, 1179], [1178, 1180, 1216], [1179, 1181], [1042, 1180], [1043, 1217], [1047, 1221], [1051, 1225], [1055, 1229], [1059, 1233], [1063, 1237], [1067, 1241], [1071, 1245], [1075, 1249], [1079, 1253], [1083, 1257], [1087, 1261], [1091, 1265], [1095, 1269], [1099, 1273], [1103, 1277], [1107, 1281], [1111, 1285], [1115, 1289], [1119, 1293], [1123, 1297], [1127, 1301], [1131, 1305], [1135, 1309], [1139, 1313], [1143, 1317], [1147, 1321], [1151, 1325], [1155, 1329], [1159, 1333], [1163, 1337], [1167, 1341], [1171, 1345], [1175, 1349], [1179, 1353], [1182, 1218], [1217, 1219], [1218, 1220, 1356], [1219, 1221], [1183, 1220, 1222], [1221, 1223], [1222, 1224, 1357], [1223, 1225], [1184, 1224, 1226], [1225, 1227], [1226, 1228, 1358], [1227, 1229], [1185, 1228, 1230], [1229, 1231], [1230, 1232, 1359], [1231, 1233], [1186, 1232, 1234], [1233, 1235], [1234, 1236, 1360], [1235, 1237], [1187, 1236, 1238], [1237, 1239], [1238, 1240, 1361], [1239, 1241], [1188, 1240, 1242], [1241, 1243], [1242, 1244, 1362], [1243, 1245], [1189, 1244, 1246], [1245, 1247], [1246, 1248, 1363], [1247, 1249], [1190, 1248, 1250], [1249, 1251], [1250, 1252, 1364], [1251, 1253], [1191, 1252, 1254], [1253, 1255], [1254, 1256, 1365], [1255, 1257], [1192, 1256, 1258], [1257, 1259], [1258, 1260, 1366], [1259, 1261], [1193, 1260, 1262], [1261, 1263], [1262, 1264, 1367], [1263, 1265], [1194, 1264, 1266], [1265, 1267], [1266, 1268, 1368], [1267, 1269], [1195, 1268, 1270], [1269, 1271], [1270, 1272, 1369], [1271, 1273], [1196, 1272, 1274], [1273, 1275], [1274, 1276, 1370], [1275, 1277], [1197, 1276, 1278], [1277, 1279], [1278, 1280, 1371], [1279, 1281], [1198, 1280, 1282], [1281, 1283], [1282, 1284, 1372], [1283, 1285], [1199, 1284, 1286], [1285, 1287], [1286, 1288, 1373], [1287, 1289], [1200, 1288, 1290], [1289, 1291], [1290, 1292, 1374], [1291, 1293], [1201, 1292, 1294], [1293, 1295], [1294, 1296, 1375], [1295, 1297], [1202, 1296, 1298], [1297, 1299], [1298, 1300, 1376], [1299, 1301], [1203, 1300, 1302], [1301, 1303], [1302, 1304, 1377], [1303, 1305], [1204, 1304, 1306], [1305, 1307], [1306, 1308, 1378], [1307, 1309], [1205, 1308, 1310], [1309, 1311], [1310, 1312, 1379], [1311, 1313], [1206, 1312, 1314], [1313, 1315], [1314, 1316, 1380], [1315, 1317], [1207, 1316, 1318], [1317, 1319], [1318, 1320, 1381], [1319, 1321], [1208, 1320, 1322], [1321, 1323], [1322, 1324, 1382], [1323, 1325], [1209, 1324, 1326], [1325, 1327], [1326, 1328, 1383], [1327, 1329], [1210, 1328, 1330], [1329, 1331], [1330, 1332, 1384], [1331, 1333], [1211, 1332, 1334], [1333, 1335], [1334, 1336, 1385], [1335, 1337], [1212, 1336, 1338], [1337, 1339], [1338, 1340, 1386], [1339, 1341], [1213, 1340, 1342], [1341, 1343], [1342, 1344, 1387], [1343, 1345], [1214, 1344, 1346], [1345, 1347], [1346, 1348, 1388], [1347, 1349], [1215, 1348, 1350], [1349, 1351], [1350, 1352, 1389], [1351, 1353], [1216, 1352, 1354], [1353, 1355], [1354, 1390], [1219, 1393], [1223, 1397], [1227, 1401], [1231, 1405], [1235, 1409], [1239, 1413], [1243, 1417], [1247, 1421], [1251, 1425], [1255, 1429], [1259, 1433], [1263, 1437], [1267, 1441], [1271, 1445], [1275, 1449], [1279, 1453], [1283, 1457], [1287, 1461], [1291, 1465], [1295, 1469], [1299, 1473], [1303, 1477], [1307, 1481], [1311, 1485], [1315, 1489], [1319, 1493], [1323, 1497], [1327, 1501], [1331, 1505], [1335, 1509], [1339, 1513], [1343, 1517], [1347, 1521], [1351, 1525], [1355, 1529], [1392, 1530], [1391, 1393], [1356, 1392, 1394], [1393, 1395], [1394, 1396, 1531], [1395, 1397], [1357, 1396, 1398], [1397, 1399], [1398, 1400, 1532], [1399, 1401], [1358, 1400, 1402], [1401, 1403], [1402, 1404, 1533], [1403, 1405], [1359, 1404, 1406], [1405, 1407], [1406, 1408, 1534], [1407, 1409], [1360, 1408, 1410], [1409, 1411], [1410, 1412, 1535], [1411, 1413], [1361, 1412, 1414], [1413, 1415], [1414, 1416, 1536], [1415, 1417], [1362, 1416, 1418], [1417, 1419], [1418, 1420, 1537], [1419, 1421], [1363, 1420, 1422], [1421, 1423], [1422, 1424, 1538], [1423, 1425], [1364, 1424, 1426], [1425, 1427], [1426, 1428, 1539], [1427, 1429], [1365, 1428, 1430], [1429, 1431], [1430, 1432, 1540], [1431, 1433], [1366, 1432, 1434], [1433, 1435], [1434, 1436, 1541], [1435, 1437], [1367, 1436, 1438], [1437, 1439], [1438, 1440, 1542], [1439, 1441], [1368, 1440, 1442], [1441, 1443], [1442, 1444, 1543], [1443, 1445], [1369, 1444, 1446], [1445, 1447], [1446, 1448, 1544], [1447, 1449], [1370, 1448, 1450], [1449, 1451], [1450, 1452, 1545], [1451, 1453], [1371, 1452, 1454], [1453, 1455], [1454, 1456, 1546], [1455, 1457], [1372, 1456, 1458], [1457, 1459], [1458, 1460, 1547], [1459, 1461], [1373, 1460, 1462], [1461, 1463], [1462, 1464, 1548], [1463, 1465], [1374, 1464, 1466], [1465, 1467], [1466, 1468, 1549], [1467, 1469], [1375, 1468, 1470], [1469, 1471], [1470, 1472, 1550], [1471, 1473], [1376, 1472, 1474], [1473, 1475], [1474, 1476, 1551], [1475, 1477], [1377, 1476, 1478], [1477, 1479], [1478, 1480, 1552], [1479, 1481], [1378, 1480, 1482], [1481, 1483], [1482, 1484, 1553], [1483, 1485], [1379, 1484, 1486], [1485, 1487], [1486, 1488, 1554], [1487, 1489], [1380, 1488, 1490], [1489, 1491], [1490, 1492, 1555], [1491, 1493], [1381, 1492, 1494], [1493, 1495], [1494, 1496, 1556], [1495, 1497], [1382, 1496, 1498], [1497, 1499], [1498, 1500, 1557], [1499, 1501], [1383, 1500, 1502], [1501, 1503], [1502, 1504, 1558], [1503, 1505], [1384, 1504, 1506], [1505, 1507], [1506, 1508, 1559], [1507, 1509], [1385, 1508, 1510], [1509, 1511], [1510, 1512, 1560], [1511, 1513], [1386, 1512, 1514], [1513, 1515], [1514, 1516, 1561], [1515, 1517], [1387, 1516, 1518], [1517, 1519], [1518, 1520, 1562], [1519, 1521], [1388, 1520, 1522], [1521, 1523], [1522, 1524, 1563], [1523, 1525], [1389, 1524, 1526], [1525, 1527], [1526, 1528, 1564], [1527, 1529], [1390, 1528], [1391, 1565], [1395, 1569], [1399, 1573], [1403, 1577], [1407, 1581], [1411, 1585], [1415, 1589], [1419, 1593], [1423, 1597], [1427, 1601], [1431, 1605], [1435, 1609], [1439, 1613], [1443, 1617], [1447, 1621], [1451, 1625], [1455, 1629], [1459, 1633], [1463, 1637], [1467, 1641], [1471, 1645], [1475, 1649], [1479, 1653], [1483, 1657], [1487, 1661], [1491, 1665], [1495, 1669], [1499, 1673], [1503, 1677], [1507, 1681], [1511, 1685], [1515, 1689], [1519, 1693], [1523, 1697], [1527, 1701], [1530, 1566], [1565, 1567], [1566, 1568, 1704], [1567, 1569], [1531, 1568, 1570], [1569, 1571], [1570, 1572, 1705], [1571, 1573], [1532, 1572, 1574], [1573, 1575], [1574, 1576, 1706], [1575, 1577], [1533, 1576, 1578], [1577, 1579], [1578, 1580, 1707], [1579, 1581], [1534, 1580, 1582], [1581, 1583], [1582, 1584, 1708], [1583, 1585], [1535, 1584, 1586], [1585, 1587], [1586, 1588, 1709], [1587, 1589], [1536, 1588, 1590], [1589, 1591], [1590, 1592, 1710], [1591, 1593], [1537, 1592, 1594], [1593, 1595], [1594, 1596, 1711], [1595, 1597], [1538, 1596, 1598], [1597, 1599], [1598, 1600, 1712], [1599, 1601], [1539, 1600, 1602], [1601, 1603], [1602, 1604, 1713], [1603, 1605], [1540, 1604, 1606], [1605, 1607], [1606, 1608, 1714], [1607, 1609], [1541, 1608, 1610], [1609, 1611], [1610, 1612, 1715], [1611, 1613], [1542, 1612, 1614], [1613, 1615], [1614, 1616, 1716], [1615, 1617], [1543, 1616, 1618], [1617, 1619], [1618, 1620, 1717], [1619, 1621], [1544, 1620, 1622], [1621, 1623], [1622, 1624, 1718], [1623, 1625], [1545, 1624, 1626], [1625, 1627], [1626, 1628, 1719], [1627, 1629], [1546, 1628, 1630], [1629, 1631], [1630, 1632, 1720], [1631, 1633], [1547, 1632, 1634], [1633, 1635], [1634, 1636, 1721], [1635, 1637], [1548, 1636, 1638], [1637, 1639], [1638, 1640, 1722], [1639, 1641], [1549, 1640, 1642], [1641, 1643], [1642, 1644, 1723], [1643, 1645], [1550, 1644, 1646], [1645, 1647], [1646, 1648, 1724], [1647, 1649], [1551, 1648, 1650], [1649, 1651], [1650, 1652, 1725], [1651, 1653], [1552, 1652, 1654], [1653, 1655], [1654, 1656, 1726], [1655, 1657], [1553, 1656, 1658], [1657, 1659], [1658, 1660, 1727], [1659, 1661], [1554, 1660, 1662], [1661, 1663], [1662, 1664, 1728], [1663, 1665], [1555, 1664, 1666], [1665, 1667], [1666, 1668, 1729], [1667, 1669], [1556, 1668, 1670], [1669, 1671], [1670, 1672, 1730], [1671, 1673], [1557, 1672, 1674], [1673, 1675], [1674, 1676, 1731], [1675, 1677], [1558, 1676, 1678], [1677, 1679], [1678, 1680, 1732], [1679, 1681], [1559, 1680, 1682], [1681, 1683], [1682, 1684, 1733], [1683, 1685], [1560, 1684, 1686], [1685, 1687], [1686, 1688, 1734], [1687, 1689], [1561, 1688, 1690], [1689, 1691], [1690, 1692, 1735], [1691, 1693], [1562, 1692, 1694], [1693, 1695], [1694, 1696, 1736], [1695, 1697], [1563, 1696, 1698], [1697, 1699], [1698, 1700, 1737], [1699, 1701], [1564, 1700, 1702], [1701, 1703], [1702, 1738], [1567, 1741], [1571, 1745], [1575, 1749], [1579, 1753], [1583, 1757], [1587, 1761], [1591, 1765], [1595, 1769], [1599, 1773], [1603, 1777], [1607, 1781], [1611, 1785], [1615, 1789], [1619, 1793], [1623, 1797], [1627, 1801], [1631, 1805], [1635, 1809], [1639, 1813], [1643, 1817], [1647, 1821], [1651, 1825], [1655, 1829], [1659, 1833], [1663, 1837], [1667, 1841], [1671, 1845], [1675, 1849], [1679, 1853], [1683, 1857], [1687, 1861], [1691, 1865], [1695, 1869], [1699, 1873], [1703, 1877], [1740, 1878], [1739, 1741], [1704, 1740, 1742], [1741, 1743], [1742, 1744, 1879], [1743, 1745], [1705, 1744, 1746], [1745, 1747], [1746, 1748, 1880], [1747, 1749], [1706, 1748, 1750], [1749, 1751], [1750, 1752, 1881], [1751, 1753], [1707, 1752, 1754], [1753, 1755], [1754, 1756, 1882], [1755, 1757], [1708, 1756, 1758], [1757, 1759], [1758, 1760, 1883], [1759, 1761], [1709, 1760, 1762], [1761, 1763], [1762, 1764, 1884], [1763, 1765], [1710, 1764, 1766], [1765, 1767], [1766, 1768, 1885], [1767, 1769], [1711, 1768, 1770], [1769, 1771], [1770, 1772, 1886], [1771, 1773], [1712, 1772, 1774], [1773, 1775], [1774, 1776, 1887], [1775, 1777], [1713, 1776, 1778], [1777, 1779], [1778, 1780, 1888], [1779, 1781], [1714, 1780, 1782], [1781, 1783], [1782, 1784, 1889], [1783, 1785], [1715, 1784, 1786], [1785, 1787], [1786, 1788, 1890], [1787, 1789], [1716, 1788, 1790], [1789, 1791], [1790, 1792, 1891], [1791, 1793], [1717, 1792, 1794], [1793, 1795], [1794, 1796, 1892], [1795, 1797], [1718, 1796, 1798], [1797, 1799], [1798, 1800, 1893], [1799, 1801], [1719, 1800, 1802], [1801, 1803], [1802, 1804, 1894], [1803, 1805], [1720, 1804, 1806], [1805, 1807], [1806, 1808, 1895], [1807, 1809], [1721, 1808, 1810], [1809, 1811], [1810, 1812, 1896], [1811, 1813], [1722, 1812, 1814], [1813, 1815], [1814, 1816, 1897], [1815, 1817], [1723, 1816, 1818], [1817, 1819], [1818, 1820, 1898], [1819, 1821], [1724, 1820, 1822], [1821, 1823], [1822, 1824, 1899], [1823, 1825], [1725, 1824, 1826], [1825, 1827], [1826, 1828, 1900], [1827, 1829], [1726, 1828, 1830], [1829, 1831], [1830, 1832, 1901], [1831, 1833], [1727, 1832, 1834], [1833, 1835], [1834, 1836, 1902], [1835, 1837], [1728, 1836, 1838], [1837, 1839], [1838, 1840, 1903], [1839, 1841], [1729, 1840, 1842], [1841, 1843], [1842, 1844, 1904], [1843, 1845], [1730, 1844, 1846], [1845, 1847], [1846, 1848, 1905], [1847, 1849], [1731, 1848, 1850], [1849, 1851], [1850, 1852, 1906], [1851, 1853], [1732, 1852, 1854], [1853, 1855], [1854, 1856, 1907], [1855, 1857], [1733, 1856, 1858], [1857, 1859], [1858, 1860, 1908], [1859, 1861], [1734, 1860, 1862], [1861, 1863], [1862, 1864, 1909], [1863, 1865], [1735, 1864, 1866], [1865, 1867], [1866, 1868, 1910], [1867, 1869], [1736, 1868, 1870], [1869, 1871], [1870, 1872, 1911], [1871, 1873], [1737, 1872, 1874], [1873, 1875], [1874, 1876, 1912], [1875, 1877], [1738, 1876], [1739, 1913], [1743, 1917], [1747, 1921], [1751, 1925], [1755, 1929], [1759, 1933], [1763, 1937], [1767, 1941], [1771, 1945], [1775, 1949], [1779, 1953], [1783, 1957], [1787, 1961], [1791, 1965], [1795, 1969], [1799, 1973], [1803, 1977], [1807, 1981], [1811, 1985], [1815, 1989], [1819, 1993], [1823, 1997], [1827, 2001], [1831, 2005], [1835, 2009], [1839, 2013], [1843, 2017], [1847, 2021], [1851, 2025], [1855, 2029], [1859, 2033], [1863, 2037], [1867, 2041], [1871, 2045], [1875, 2049], [1878, 1914], [1913, 1915], [1914, 1916, 2052], [1915, 1917], [1879, 1916, 1918], [1917, 1919], [1918, 1920, 2053], [1919, 1921], [1880, 1920, 1922], [1921, 1923], [1922, 1924, 2054], [1923, 1925], [1881, 1924, 1926], [1925, 1927], [1926, 1928, 2055], [1927, 1929], [1882, 1928, 1930], [1929, 1931], [1930, 1932, 2056], [1931, 1933], [1883, 1932, 1934], [1933, 1935], [1934, 1936, 2057], [1935, 1937], [1884, 1936, 1938], [1937, 1939], [1938, 1940, 2058], [1939, 1941], [1885, 1940, 1942], [1941, 1943], [1942, 1944, 2059], [1943, 1945], [1886, 1944, 1946], [1945, 1947], [1946, 1948, 2060], [1947, 1949], [1887, 1948, 1950], [1949, 1951], [1950, 1952, 2061], [1951, 1953], [1888, 1952, 1954], [1953, 1955], [1954, 1956, 2062], [1955, 1957], [1889, 1956, 1958], [1957, 1959], [1958, 1960, 2063], [1959, 1961], [1890, 1960, 1962], [1961, 1963], [1962, 1964, 2064], [1963, 1965], [1891, 1964, 1966], [1965, 1967], [1966, 1968, 2065], [1967, 1969], [1892, 1968, 1970], [1969, 1971], [1970, 1972, 2066], [1971, 1973], [1893, 1972, 1974], [1973, 1975], [1974, 1976, 2067], [1975, 1977], [1894, 1976, 1978], [1977, 1979], [1978, 1980, 2068], [1979, 1981], [1895, 1980, 1982], [1981, 1983], [1982, 1984, 2069], [1983, 1985], [1896, 1984, 1986], [1985, 1987], [1986, 1988, 2070], [1987, 1989], [1897, 1988, 1990], [1989, 1991], [1990, 1992, 2071], [1991, 1993], [1898, 1992, 1994], [1993, 1995], [1994, 1996, 2072], [1995, 1997], [1899, 1996, 1998], [1997, 1999], [1998, 2000, 2073], [1999, 2001], [1900, 2000, 2002], [2001, 2003], [2002, 2004, 2074], [2003, 2005], [1901, 2004, 2006], [2005, 2007], [2006, 2008, 2075], [2007, 2009], [1902, 2008, 2010], [2009, 2011], [2010, 2012, 2076], [2011, 2013], [1903, 2012, 2014], [2013, 2015], [2014, 2016, 2077], [2015, 2017], [1904, 2016, 2018], [2017, 2019], [2018, 2020, 2078], [2019, 2021], [1905, 2020, 2022], [2021, 2023], [2022, 2024, 2079], [2023, 2025], [1906, 2024, 2026], [2025, 2027], [2026, 2028, 2080], [2027, 2029], [1907, 2028, 2030], [2029, 2031], [2030, 2032, 2081], [2031, 2033], [1908, 2032, 2034], [2033, 2035], [2034, 2036, 2082], [2035, 2037], [1909, 2036, 2038], [2037, 2039], [2038, 2040, 2083], [2039, 2041], [1910, 2040, 2042], [2041, 2043], [2042, 2044, 2084], [2043, 2045], [1911, 2044, 2046], [2045, 2047], [2046, 2048, 2085], [2047, 2049], [1912, 2048, 2050], [2049, 2051], [2050, 2086], [1915, 2089], [1919, 2093], [1923, 2097], [1927, 2101], [1931, 2105], [1935, 2109], [1939, 2113], [1943, 2117], [1947, 2121], [1951, 2125], [1955, 2129], [1959, 2133], [1963, 2137], [1967, 2141], [1971, 2145], [1975, 2149], [1979, 2153], [1983, 2157], [1987, 2161], [1991, 2165], [1995, 2169], [1999, 2173], [2003, 2177], [2007, 2181], [2011, 2185], [2015, 2189], [2019, 2193], [2023, 2197], [2027, 2201], [2031, 2205], [2035, 2209], [2039, 2213], [2043, 2217], [2047, 2221], [2051, 2225], [2088, 2226], [2087, 2089], [2052, 2088, 2090], [2089, 2091], [2090, 2092, 2227], [2091, 2093], [2053, 2092, 2094], [2093, 2095], [2094, 2096, 2228], [2095, 2097], [2054, 2096, 2098], [2097, 2099], [2098, 2100, 2229], [2099, 2101], [2055, 2100, 2102], [2101, 2103], [2102, 2104, 2230], [2103, 2105], [2056, 2104, 2106], [2105, 2107], [2106, 2108, 2231], [2107, 2109], [2057, 2108, 2110], [2109, 2111], [2110, 2112, 2232], [2111, 2113], [2058, 2112, 2114], [2113, 2115], [2114, 2116, 2233], [2115, 2117], [2059, 2116, 2118], [2117, 2119], [2118, 2120, 2234], [2119, 2121], [2060, 2120, 2122], [2121, 2123], [2122, 2124, 2235], [2123, 2125], [2061, 2124, 2126], [2125, 2127], [2126, 2128, 2236], [2127, 2129], [2062, 2128, 2130], [2129, 2131], [2130, 2132, 2237], [2131, 2133], [2063, 2132, 2134], [2133, 2135], [2134, 2136, 2238], [2135, 2137], [2064, 2136, 2138], [2137, 2139], [2138, 2140, 2239], [2139, 2141], [2065, 2140, 2142], [2141, 2143], [2142, 2144, 2240], [2143, 2145], [2066, 2144, 2146], [2145, 2147], [2146, 2148, 2241], [2147, 2149], [2067, 2148, 2150], [2149, 2151], [2150, 2152, 2242], [2151, 2153], [2068, 2152, 2154], [2153, 2155], [2154, 2156, 2243], [2155, 2157], [2069, 2156, 2158], [2157, 2159], [2158, 2160, 2244], [2159, 2161], [2070, 2160, 2162], [2161, 2163], [2162, 2164, 2245], [2163, 2165], [2071, 2164, 2166], [2165, 2167], [2166, 2168, 2246], [2167, 2169], [2072, 2168, 2170], [2169, 2171], [2170, 2172, 2247], [2171, 2173], [2073, 2172, 2174], [2173, 2175], [2174, 2176, 2248], [2175, 2177], [2074, 2176, 2178], [2177, 2179], [2178, 2180, 2249], [2179, 2181], [2075, 2180, 2182], [2181, 2183], [2182, 2184, 2250], [2183, 2185], [2076, 2184, 2186], [2185, 2187], [2186, 2188, 2251], [2187, 2189], [2077, 2188, 2190], [2189, 2191], [2190, 2192, 2252], [2191, 2193], [2078, 2192, 2194], [2193, 2195], [2194, 2196, 2253], [2195, 2197], [2079, 2196, 2198], [2197, 2199], [2198, 2200, 2254], [2199, 2201], [2080, 2200, 2202], [2201, 2203], [2202, 2204, 2255], [2203, 2205], [2081, 2204, 2206], [2205, 2207], [2206, 2208, 2256], [2207, 2209], [2082, 2208, 2210], [2209, 2211], [2210, 2212, 2257], [2211, 2213], [2083, 2212, 2214], [2213, 2215], [2214, 2216, 2258], [2215, 2217], [2084, 2216, 2218], [2217, 2219], [2218, 2220, 2259], [2219, 2221], [2085, 2220, 2222], [2221, 2223], [2222, 2224, 2260], [2223, 2225], [2086, 2224], [2087, 2261], [2091, 2265], [2095, 2269], [2099, 2273], [2103, 2277], [2107, 2281], [2111, 2285], [2115, 2289], [2119, 2293], [2123, 2297], [2127, 2301], [2131, 2305], [2135, 2309], [2139, 2313], [2143, 2317], [2147, 2321], [2151, 2325], [2155, 2329], [2159, 2333], [2163, 2337], [2167, 2341], [2171, 2345], [2175, 2349], [2179, 2353], [2183, 2357], [2187, 2361], [2191, 2365], [2195, 2369], [2199, 2373], [2203, 2377], [2207, 2381], [2211, 2385], [2215, 2389], [2219, 2393], [2223, 2397], [2226, 2262], [2261, 2263], [2262, 2264, 2400], [2263, 2265], [2227, 2264, 2266], [2265, 2267], [2266, 2268, 2401], [2267, 2269], [2228, 2268, 2270], [2269, 2271], [2270, 2272, 2402], [2271, 2273], [2229, 2272, 2274], [2273, 2275], [2274, 2276, 2403], [2275, 2277], [2230, 2276, 2278], [2277, 2279], [2278, 2280, 2404], [2279, 2281], [2231, 2280, 2282], [2281, 2283], [2282, 2284, 2405], [2283, 2285], [2232, 2284, 2286], [2285, 2287], [2286, 2288, 2406], [2287, 2289], [2233, 2288, 2290], [2289, 2291], [2290, 2292, 2407], [2291, 2293], [2234, 2292, 2294], [2293, 2295], [2294, 2296, 2408], [2295, 2297], [2235, 2296, 2298], [2297, 2299], [2298, 2300, 2409], [2299, 2301], [2236, 2300, 2302], [2301, 2303], [2302, 2304, 2410], [2303, 2305], [2237, 2304, 2306], [2305, 2307], [2306, 2308, 2411], [2307, 2309], [2238, 2308, 2310], [2309, 2311], [2310, 2312, 2412], [2311, 2313], [2239, 2312, 2314], [2313, 2315], [2314, 2316, 2413], [2315, 2317], [2240, 2316, 2318], [2317, 2319], [2318, 2320, 2414], [2319, 2321], [2241, 2320, 2322], [2321, 2323], [2322, 2324, 2415], [2323, 2325], [2242, 2324, 2326], [2325, 2327], [2326, 2328, 2416], [2327, 2329], [2243, 2328, 2330], [2329, 2331], [2330, 2332, 2417], [2331, 2333], [2244, 2332, 2334], [2333, 2335], [2334, 2336, 2418], [2335, 2337], [2245, 2336, 2338], [2337, 2339], [2338, 2340, 2419], [2339, 2341], [2246, 2340, 2342], [2341, 2343], [2342, 2344, 2420], [2343, 2345], [2247, 2344, 2346], [2345, 2347], [2346, 2348, 2421], [2347, 2349], [2248, 2348, 2350], [2349, 2351], [2350, 2352, 2422], [2351, 2353], [2249, 2352, 2354], [2353, 2355], [2354, 2356, 2423], [2355, 2357], [2250, 2356, 2358], [2357, 2359], [2358, 2360, 2424], [2359, 2361], [2251, 2360, 2362], [2361, 2363], [2362, 2364, 2425], [2363, 2365], [2252, 2364, 2366], [2365, 2367], [2366, 2368, 2426], [2367, 2369], [2253, 2368, 2370], [2369, 2371], [2370, 2372, 2427], [2371, 2373], [2254, 2372, 2374], [2373, 2375], [2374, 2376, 2428], [2375, 2377], [2255, 2376, 2378], [2377, 2379], [2378, 2380, 2429], [2379, 2381], [2256, 2380, 2382], [2381, 2383], [2382, 2384, 2430], [2383, 2385], [2257, 2384, 2386], [2385, 2387], [2386, 2388, 2431], [2387, 2389], [2258, 2388, 2390], [2389, 2391], [2390, 2392, 2432], [2391, 2393], [2259, 2392, 2394], [2393, 2395], [2394, 2396, 2433], [2395, 2397], [2260, 2396, 2398], [2397, 2399], [2398, 2434], [2263, 2437], [2267, 2441], [2271, 2445], [2275, 2449], [2279, 2453], [2283, 2457], [2287, 2461], [2291, 2465], [2295, 2469], [2299, 2473], [2303, 2477], [2307, 2481], [2311, 2485], [2315, 2489], [2319, 2493], [2323, 2497], [2327, 2501], [2331, 2505], [2335, 2509], [2339, 2513], [2343, 2517], [2347, 2521], [2351, 2525], [2355, 2529], [2359, 2533], [2363, 2537], [2367, 2541], [2371, 2545], [2375, 2549], [2379, 2553], [2383, 2557], [2387, 2561], [2391, 2565], [2395, 2569], [2399, 2573], [2436, 2574], [2435, 2437], [2400, 2436, 2438], [2437, 2439], [2438, 2440, 2575], [2439, 2441], [2401, 2440, 2442], [2441, 2443], [2442, 2444, 2576], [2443, 2445], [2402, 2444, 2446], [2445, 2447], [2446, 2448, 2577], [2447, 2449], [2403, 2448, 2450], [2449, 2451], [2450, 2452, 2578], [2451, 2453], [2404, 2452, 2454], [2453, 2455], [2454, 2456, 2579], [2455, 2457], [2405, 2456, 2458], [2457, 2459], [2458, 2460, 2580], [2459, 2461], [2406, 2460, 2462], [2461, 2463], [2462, 2464, 2581], [2463, 2465], [2407, 2464, 2466], [2465, 2467], [2466, 2468, 2582], [2467, 2469], [2408, 2468, 2470], [2469, 2471], [2470, 2472, 2583], [2471, 2473], [2409, 2472, 2474], [2473, 2475], [2474, 2476, 2584], [2475, 2477], [2410, 2476, 2478], [2477, 2479], [2478, 2480, 2585], [2479, 2481], [2411, 2480, 2482], [2481, 2483], [2482, 2484, 2586], [2483, 2485], [2412, 2484, 2486], [2485, 2487], [2486, 2488, 2587], [2487, 2489], [2413, 2488, 2490], [2489, 2491], [2490, 2492, 2588], [2491, 2493], [2414, 2492, 2494], [2493, 2495], [2494, 2496, 2589], [2495, 2497], [2415, 2496, 2498], [2497, 2499], [2498, 2500, 2590], [2499, 2501], [2416, 2500, 2502], [2501, 2503], [2502, 2504, 2591], [2503, 2505], [2417, 2504, 2506], [2505, 2507], [2506, 2508, 2592], [2507, 2509], [2418, 2508, 2510], [2509, 2511], [2510, 2512, 2593], [2511, 2513], [2419, 2512, 2514], [2513, 2515], [2514, 2516, 2594], [2515, 2517], [2420, 2516, 2518], [2517, 2519], [2518, 2520, 2595], [2519, 2521], [2421, 2520, 2522], [2521, 2523], [2522, 2524, 2596], [2523, 2525], [2422, 2524, 2526], [2525, 2527], [2526, 2528, 2597], [2527, 2529], [2423, 2528, 2530], [2529, 2531], [2530, 2532, 2598], [2531, 2533], [2424, 2532, 2534], [2533, 2535], [2534, 2536, 2599], [2535, 2537], [2425, 2536, 2538], [2537, 2539], [2538, 2540, 2600], [2539, 2541], [2426, 2540, 2542], [2541, 2543], [2542, 2544, 2601], [2543, 2545], [2427, 2544, 2546], [2545, 2547], [2546, 2548, 2602], [2547, 2549], [2428, 2548, 2550], [2549, 2551], [2550, 2552, 2603], [2551, 2553], [2429, 2552, 2554], [2553, 2555], [2554, 2556, 2604], [2555, 2557], [2430, 2556, 2558], [2557, 2559], [2558, 2560, 2605], [2559, 2561], [2431, 2560, 2562], [2561, 2563], [2562, 2564, 2606], [2563, 2565], [2432, 2564, 2566], [2565, 2567], [2566, 2568, 2607], [2567, 2569], [2433, 2568, 2570], [2569, 2571], [2570, 2572, 2608], [2571, 2573], [2434, 2572], [2435, 2609], [2439, 2613], [2443, 2617], [2447, 2621], [2451, 2625], [2455, 2629], [2459, 2633], [2463, 2637], [2467, 2641], [2471, 2645], [2475, 2649], [2479, 2653], [2483, 2657], [2487, 2661], [2491, 2665], [2495, 2669], [2499, 2673], [2503, 2677], [2507, 2681], [2511, 2685], [2515, 2689], [2519, 2693], [2523, 2697], [2527, 2701], [2531, 2705], [2535, 2709], [2539, 2713], [2543, 2717], [2547, 2721], [2551, 2725], [2555, 2729], [2559, 2733], [2563, 2737], [2567, 2741], [2571, 2745], [2574, 2610], [2609, 2611], [2610, 2612, 2748], [2611, 2613], [2575, 2612, 2614], [2613, 2615], [2614, 2616, 2749], [2615, 2617], [2576, 2616, 2618], [2617, 2619], [2618, 2620, 2750], [2619, 2621], [2577, 2620, 2622], [2621, 2623], [2622, 2624, 2751], [2623, 2625], [2578, 2624, 2626], [2625, 2627], [2626, 2628, 2752], [2627, 2629], [2579, 2628, 2630], [2629, 2631], [2630, 2632, 2753], [2631, 2633], [2580, 2632, 2634], [2633, 2635], [2634, 2636, 2754], [2635, 2637], [2581, 2636, 2638], [2637, 2639], [2638, 2640, 2755], [2639, 2641], [2582, 2640, 2642], [2641, 2643], [2642, 2644, 2756], [2643, 2645], [2583, 2644, 2646], [2645, 2647], [2646, 2648, 2757], [2647, 2649], [2584, 2648, 2650], [2649, 2651], [2650, 2652, 2758], [2651, 2653], [2585, 2652, 2654], [2653, 2655], [2654, 2656, 2759], [2655, 2657], [2586, 2656, 2658], [2657, 2659], [2658, 2660, 2760], [2659, 2661], [2587, 2660, 2662], [2661, 2663], [2662, 2664, 2761], [2663, 2665], [2588, 2664, 2666], [2665, 2667], [2666, 2668, 2762], [2667, 2669], [2589, 2668, 2670], [2669, 2671], [2670, 2672, 2763], [2671, 2673], [2590, 2672, 2674], [2673, 2675], [2674, 2676, 2764], [2675, 2677], [2591, 2676, 2678], [2677, 2679], [2678, 2680, 2765], [2679, 2681], [2592, 2680, 2682], [2681, 2683], [2682, 2684, 2766], [2683, 2685], [2593, 2684, 2686], [2685, 2687], [2686, 2688, 2767], [2687, 2689], [2594, 2688, 2690], [2689, 2691], [2690, 2692, 2768], [2691, 2693], [2595, 2692, 2694], [2693, 2695], [2694, 2696, 2769], [2695, 2697], [2596, 2696, 2698], [2697, 2699], [2698, 2700, 2770], [2699, 2701], [2597, 2700, 2702], [2701, 2703], [2702, 2704, 2771], [2703, 2705], [2598, 2704, 2706], [2705, 2707], [2706, 2708, 2772], [2707, 2709], [2599, 2708, 2710], [2709, 2711], [2710, 2712, 2773], [2711, 2713], [2600, 2712, 2714], [2713, 2715], [2714, 2716, 2774], [2715, 2717], [2601, 2716, 2718], [2717, 2719], [2718, 2720, 2775], [2719, 2721], [2602, 2720, 2722], [2721, 2723], [2722, 2724, 2776], [2723, 2725], [2603, 2724, 2726], [2725, 2727], [2726, 2728, 2777], [2727, 2729], [2604, 2728, 2730], [2729, 2731], [2730, 2732, 2778], [2731, 2733], [2605, 2732, 2734], [2733, 2735], [2734, 2736, 2779], [2735, 2737], [2606, 2736, 2738], [2737, 2739], [2738, 2740, 2780], [2739, 2741], [2607, 2740, 2742], [2741, 2743], [2742, 2744, 2781], [2743, 2745], [2608, 2744, 2746], [2745, 2747], [2746, 2782], [2611, 2785], [2615, 2789], [2619, 2793], [2623, 2797], [2627, 2801], [2631, 2805], [2635, 2809], [2639, 2813], [2643, 2817], [2647, 2821], [2651, 2825], [2655, 2829], [2659, 2833], [2663, 2837], [2667, 2841], [2671, 2845], [2675, 2849], [2679, 2853], [2683, 2857], [2687, 2861], [2691, 2865], [2695, 2869], [2699, 2873], [2703, 2877], [2707, 2881], [2711, 2885], [2715, 2889], [2719, 2893], [2723, 2897], [2727, 2901], [2731, 2905], [2735, 2909], [2739, 2913], [2743, 2917], [2747, 2921], [2784, 2922], [2783, 2785], [2748, 2784, 2786], [2785, 2787], [2786, 2788, 2923], [2787, 2789], [2749, 2788, 2790], [2789, 2791], [2790, 2792, 2924], [2791, 2793], [2750, 2792, 2794], [2793, 2795], [2794, 2796, 2925], [2795, 2797], [2751, 2796, 2798], [2797, 2799], [2798, 2800, 2926], [2799, 2801], [2752, 2800, 2802], [2801, 2803], [2802, 2804, 2927], [2803, 2805], [2753, 2804, 2806], [2805, 2807], [2806, 2808, 2928], [2807, 2809], [2754, 2808, 2810], [2809, 2811], [2810, 2812, 2929], [2811, 2813], [2755, 2812, 2814], [2813, 2815], [2814, 2816, 2930], [2815, 2817], [2756, 2816, 2818], [2817, 2819], [2818, 2820, 2931], [2819, 2821], [2757, 2820, 2822], [2821, 2823], [2822, 2824, 2932], [2823, 2825], [2758, 2824, 2826], [2825, 2827], [2826, 2828, 2933], [2827, 2829], [2759, 2828, 2830], [2829, 2831], [2830, 2832, 2934], [2831, 2833], [2760, 2832, 2834], [2833, 2835], [2834, 2836, 2935], [2835, 2837], [2761, 2836, 2838], [2837, 2839], [2838, 2840, 2936], [2839, 2841], [2762, 2840, 2842], [2841, 2843], [2842, 2844, 2937], [2843, 2845], [2763, 2844, 2846], [2845, 2847], [2846, 2848, 2938], [2847, 2849], [2764, 2848, 2850], [2849, 2851], [2850, 2852, 2939], [2851, 2853], [2765, 2852, 2854], [2853, 2855], [2854, 2856, 2940], [2855, 2857], [2766, 2856, 2858], [2857, 2859], [2858, 2860, 2941], [2859, 2861], [2767, 2860, 2862], [2861, 2863], [2862, 2864, 2942], [2863, 2865], [2768, 2864, 2866], [2865, 2867], [2866, 2868, 2943], [2867, 2869], [2769, 2868, 2870], [2869, 2871], [2870, 2872, 2944], [2871, 2873], [2770, 2872, 2874], [2873, 2875], [2874, 2876, 2945], [2875, 2877], [2771, 2876, 2878], [2877, 2879], [2878, 2880, 2946], [2879, 2881], [2772, 2880, 2882], [2881, 2883], [2882, 2884, 2947], [2883, 2885], [2773, 2884, 2886], [2885, 2887], [2886, 2888, 2948], [2887, 2889], [2774, 2888, 2890], [2889, 2891], [2890, 2892, 2949], [2891, 2893], [2775, 2892, 2894], [2893, 2895], [2894, 2896, 2950], [2895, 2897], [2776, 2896, 2898], [2897, 2899], [2898, 2900, 2951], [2899, 2901], [2777, 2900, 2902], [2901, 2903], [2902, 2904, 2952], [2903, 2905], [2778, 2904, 2906], [2905, 2907], [2906, 2908, 2953], [2907, 2909], [2779, 2908, 2910], [2909, 2911], [2910, 2912, 2954], [2911, 2913], [2780, 2912, 2914], [2913, 2915], [2914, 2916, 2955], [2915, 2917], [2781, 2916, 2918], [2917, 2919], [2918, 2920, 2956], [2919, 2921], [2782, 2920], [2783, 2957], [2787, 2961], [2791, 2965], [2795, 2969], [2799, 2973], [2803, 2977], [2807, 2981], [2811, 2985], [2815, 2989], [2819, 2993], [2823, 2997], [2827, 3001], [2831, 3005], [2835, 3009], [2839, 3013], [2843, 3017], [2847, 3021], [2851, 3025], [2855, 3029], [2859, 3033], [2863, 3037], [2867, 3041], [2871, 3045], [2875, 3049], [2879, 3053], [2883, 3057], [2887, 3061], [2891, 3065], [2895, 3069], [2899, 3073], [2903, 3077], [2907, 3081], [2911, 3085], [2915, 3089], [2919, 3093], [2922, 2958], [2957, 2959], [2958, 2960, 3096], [2959, 2961], [2923, 2960, 2962], [2961, 2963], [2962, 2964, 3097], [2963, 2965], [2924, 2964, 2966], [2965, 2967], [2966, 2968, 3098], [2967, 2969], [2925, 2968, 2970], [2969, 2971], [2970, 2972, 3099], [2971, 2973], [2926, 2972, 2974], [2973, 2975], [2974, 2976, 3100], [2975, 2977], [2927, 2976, 2978], [2977, 2979], [2978, 2980, 3101], [2979, 2981], [2928, 2980, 2982], [2981, 2983], [2982, 2984, 3102], [2983, 2985], [2929, 2984, 2986], [2985, 2987], [2986, 2988, 3103], [2987, 2989], [2930, 2988, 2990], [2989, 2991], [2990, 2992, 3104], [2991, 2993], [2931, 2992, 2994], [2993, 2995], [2994, 2996, 3105], [2995, 2997], [2932, 2996, 2998], [2997, 2999], [2998, 3000, 3106], [2999, 3001], [2933, 3000, 3002], [3001, 3003], [3002, 3004, 3107], [3003, 3005], [2934, 3004, 3006], [3005, 3007], [3006, 3008, 3108], [3007, 3009], [2935, 3008, 3010], [3009, 3011], [3010, 3012, 3109], [3011, 3013], [2936, 3012, 3014], [3013, 3015], [3014, 3016, 3110], [3015, 3017], [2937, 3016, 3018], [3017, 3019], [3018, 3020, 3111], [3019, 3021], [2938, 3020, 3022], [3021, 3023], [3022, 3024, 3112], [3023, 3025], [2939, 3024, 3026], [3025, 3027], [3026, 3028, 3113], [3027, 3029], [2940, 3028, 3030], [3029, 3031], [3030, 3032, 3114], [3031, 3033], [2941, 3032, 3034], [3033, 3035], [3034, 3036, 3115], [3035, 3037], [2942, 3036, 3038], [3037, 3039], [3038, 3040, 3116], [3039, 3041], [2943, 3040, 3042], [3041, 3043], [3042, 3044, 3117], [3043, 3045], [2944, 3044, 3046], [3045, 3047], [3046, 3048, 3118], [3047, 3049], [2945, 3048, 3050], [3049, 3051], [3050, 3052, 3119], [3051, 3053], [2946, 3052, 3054], [3053, 3055], [3054, 3056, 3120], [3055, 3057], [2947, 3056, 3058], [3057, 3059], [3058, 3060, 3121], [3059, 3061], [2948, 3060, 3062], [3061, 3063], [3062, 3064, 3122], [3063, 3065], [2949, 3064, 3066], [3065, 3067], [3066, 3068, 3123], [3067, 3069], [2950, 3068, 3070], [3069, 3071], [3070, 3072, 3124], [3071, 3073], [2951, 3072, 3074], [3073, 3075], [3074, 3076, 3125], [3075, 3077], [2952, 3076, 3078], [3077, 3079], [3078, 3080, 3126], [3079, 3081], [2953, 3080, 3082], [3081, 3083], [3082, 3084, 3127], [3083, 3085], [2954, 3084, 3086], [3085, 3087], [3086, 3088, 3128], [3087, 3089], [2955, 3088, 3090], [3089, 3091], [3090, 3092, 3129], [3091, 3093], [2956, 3092, 3094], [3093, 3095], [3094, 3130], [2959, 3133], [2963, 3137], [2967, 3141], [2971, 3145], [2975, 3149], [2979, 3153], [2983, 3157], [2987, 3161], [2991, 3165], [2995, 3169], [2999, 3173], [3003, 3177], [3007, 3181], [3011, 3185], [3015, 3189], [3019, 3193], [3023, 3197], [3027, 3201], [3031, 3205], [3035, 3209], [3039, 3213], [3043, 3217], [3047, 3221], [3051, 3225], [3055, 3229], [3059, 3233], [3063, 3237], [3067, 3241], [3071, 3245], [3075, 3249], [3079, 3253], [3083, 3257], [3087, 3261], [3091, 3265], [3095, 3269], [3132, 3270], [3131, 3133], [3096, 3132, 3134], [3133, 3135], [3134, 3136, 3271], [3135, 3137], [3097, 3136, 3138], [3137, 3139], [3138, 3140, 3272], [3139, 3141], [3098, 3140, 3142], [3141, 3143], [3142, 3144, 3273], [3143, 3145], [3099, 3144, 3146], [3145, 3147], [3146, 3148, 3274], [3147, 3149], [3100, 3148, 3150], [3149, 3151], [3150, 3152, 3275], [3151, 3153], [3101, 3152, 3154], [3153, 3155], [3154, 3156, 3276], [3155, 3157], [3102, 3156, 3158], [3157, 3159], [3158, 3160, 3277], [3159, 3161], [3103, 3160, 3162], [3161, 3163], [3162, 3164, 3278], [3163, 3165], [3104, 3164, 3166], [3165, 3167], [3166, 3168, 3279], [3167, 3169], [3105, 3168, 3170], [3169, 3171], [3170, 3172, 3280], [3171, 3173], [3106, 3172, 3174], [3173, 3175], [3174, 3176, 3281], [3175, 3177], [3107, 3176, 3178], [3177, 3179], [3178, 3180, 3282], [3179, 3181], [3108, 3180, 3182], [3181, 3183], [3182, 3184, 3283], [3183, 3185], [3109, 3184, 3186], [3185, 3187], [3186, 3188, 3284], [3187, 3189], [3110, 3188, 3190], [3189, 3191], [3190, 3192, 3285], [3191, 3193], [3111, 3192, 3194], [3193, 3195], [3194, 3196, 3286], [3195, 3197], [3112, 3196, 3198], [3197, 3199], [3198, 3200, 3287], [3199, 3201], [3113, 3200, 3202], [3201, 3203], [3202, 3204, 3288], [3203, 3205], [3114, 3204, 3206], [3205, 3207], [3206, 3208, 3289], [3207, 3209], [3115, 3208, 3210], [3209, 3211], [3210, 3212, 3290], [3211, 3213], [3116, 3212, 3214], [3213, 3215], [3214, 3216, 3291], [3215, 3217], [3117, 3216, 3218], [3217, 3219], [3218, 3220, 3292], [3219, 3221], [3118, 3220, 3222], [3221, 3223], [3222, 3224, 3293], [3223, 3225], [3119, 3224, 3226], [3225, 3227], [3226, 3228, 3294], [3227, 3229], [3120, 3228, 3230], [3229, 3231], [3230, 3232, 3295], [3231, 3233], [3121, 3232, 3234], [3233, 3235], [3234, 3236, 3296], [3235, 3237], [3122, 3236, 3238], [3237, 3239], [3238, 3240, 3297], [3239, 3241], [3123, 3240, 3242], [3241, 3243], [3242, 3244, 3298], [3243, 3245], [3124, 3244, 3246], [3245, 3247], [3246, 3248, 3299], [3247, 3249], [3125, 3248, 3250], [3249, 3251], [3250, 3252, 3300], [3251, 3253], [3126, 3252, 3254], [3253, 3255], [3254, 3256, 3301], [3255, 3257], [3127, 3256, 3258], [3257, 3259], [3258, 3260, 3302], [3259, 3261], [3128, 3260, 3262], [3261, 3263], [3262, 3264, 3303], [3263, 3265], [3129, 3264, 3266], [3265, 3267], [3266, 3268, 3304], [3267, 3269], [3130, 3268], [3131, 3305], [3135, 3309], [3139, 3313], [3143, 3317], [3147, 3321], [3151, 3325], [3155, 3329], [3159, 3333], [3163, 3337], [3167, 3341], [3171, 3345], [3175, 3349], [3179, 3353], [3183, 3357], [3187, 3361], [3191, 3365], [3195, 3369], [3199, 3373], [3203, 3377], [3207, 3381], [3211, 3385], [3215, 3389], [3219, 3393], [3223, 3397], [3227, 3401], [3231, 3405], [3235, 3409], [3239, 3413], [3243, 3417], [3247, 3421], [3251, 3425], [3255, 3429], [3259, 3433], [3263, 3437], [3267, 3441], [3270, 3306], [3305, 3307], [3306, 3308, 3444], [3307, 3309], [3271, 3308, 3310], [3309, 3311], [3310, 3312, 3445], [3311, 3313], [3272, 3312, 3314], [3313, 3315], [3314, 3316, 3446], [3315, 3317], [3273, 3316, 3318], [3317, 3319], [3318, 3320, 3447], [3319, 3321], [3274, 3320, 3322], [3321, 3323], [3322, 3324, 3448], [3323, 3325], [3275, 3324, 3326], [3325, 3327], [3326, 3328, 3449], [3327, 3329], [3276, 3328, 3330], [3329, 3331], [3330, 3332, 3450], [3331, 3333], [3277, 3332, 3334], [3333, 3335], [3334, 3336, 3451], [3335, 3337], [3278, 3336, 3338], [3337, 3339], [3338, 3340, 3452], [3339, 3341], [3279, 3340, 3342], [3341, 3343], [3342, 3344, 3453], [3343, 3345], [3280, 3344, 3346], [3345, 3347], [3346, 3348, 3454], [3347, 3349], [3281, 3348, 3350], [3349, 3351], [3350, 3352, 3455], [3351, 3353], [3282, 3352, 3354], [3353, 3355], [3354, 3356, 3456], [3355, 3357], [3283, 3356, 3358], [3357, 3359], [3358, 3360, 3457], [3359, 3361], [3284, 3360, 3362], [3361, 3363], [3362, 3364, 3458], [3363, 3365], [3285, 3364, 3366], [3365, 3367], [3366, 3368, 3459], [3367, 3369], [3286, 3368, 3370], [3369, 3371], [3370, 3372, 3460], [3371, 3373], [3287, 3372, 3374], [3373, 3375], [3374, 3376, 3461], [3375, 3377], [3288, 3376, 3378], [3377, 3379], [3378, 3380, 3462], [3379, 3381], [3289, 3380, 3382], [3381, 3383], [3382, 3384, 3463], [3383, 3385], [3290, 3384, 3386], [3385, 3387], [3386, 3388, 3464], [3387, 3389], [3291, 3388, 3390], [3389, 3391], [3390, 3392, 3465], [3391, 3393], [3292, 3392, 3394], [3393, 3395], [3394, 3396, 3466], [3395, 3397], [3293, 3396, 3398], [3397, 3399], [3398, 3400, 3467], [3399, 3401], [3294, 3400, 3402], [3401, 3403], [3402, 3404, 3468], [3403, 3405], [3295, 3404, 3406], [3405, 3407], [3406, 3408, 3469], [3407, 3409], [3296, 3408, 3410], [3409, 3411], [3410, 3412, 3470], [3411, 3413], [3297, 3412, 3414], [3413, 3415], [3414, 3416, 3471], [3415, 3417], [3298, 3416, 3418], [3417, 3419], [3418, 3420, 3472], [3419, 3421], [3299, 3420, 3422], [3421, 3423], [3422, 3424, 3473], [3423, 3425], [3300, 3424, 3426], [3425, 3427], [3426, 3428, 3474], [3427, 3429], [3301, 3428, 3430], [3429, 3431], [3430, 3432, 3475], [3431, 3433], [3302, 3432, 3434], [3433, 3435], [3434, 3436, 3476], [3435, 3437], [3303, 3436, 3438], [3437, 3439], [3438, 3440, 3477], [3439, 3441], [3304, 3440, 3442], [3441, 3443], [3442, 3478], [3307, 3481], [3311, 3485], [3315, 3489], [3319, 3493], [3323, 3497], [3327, 3501], [3331, 3505], [3335, 3509], [3339, 3513], [3343, 3517], [3347, 3521], [3351, 3525], [3355, 3529], [3359, 3533], [3363, 3537], [3367, 3541], [3371, 3545], [3375, 3549], [3379, 3553], [3383, 3557], [3387, 3561], [3391, 3565], [3395, 3569], [3399, 3573], [3403, 3577], [3407, 3581], [3411, 3585], [3415, 3589], [3419, 3593], [3423, 3597], [3427, 3601], [3431, 3605], [3435, 3609], [3439, 3613], [3443, 3617], [3480, 3618], [3479, 3481], [3444, 3480, 3482], [3481, 3483], [3482, 3484, 3619], [3483, 3485], [3445, 3484, 3486], [3485, 3487], [3486, 3488, 3620], [3487, 3489], [3446, 3488, 3490], [3489, 3491], [3490, 3492, 3621], [3491, 3493], [3447, 3492, 3494], [3493, 3495], [3494, 3496, 3622], [3495, 3497], [3448, 3496, 3498], [3497, 3499], [3498, 3500, 3623], [3499, 3501], [3449, 3500, 3502], [3501, 3503], [3502, 3504, 3624], [3503, 3505], [3450, 3504, 3506], [3505, 3507], [3506, 3508, 3625], [3507, 3509], [3451, 3508, 3510], [3509, 3511], [3510, 3512, 3626], [3511, 3513], [3452, 3512, 3514], [3513, 3515], [3514, 3516, 3627], [3515, 3517], [3453, 3516, 3518], [3517, 3519], [3518, 3520, 3628], [3519, 3521], [3454, 3520, 3522], [3521, 3523], [3522, 3524, 3629], [3523, 3525], [3455, 3524, 3526], [3525, 3527], [3526, 3528, 3630], [3527, 3529], [3456, 3528, 3530], [3529, 3531], [3530, 3532, 3631], [3531, 3533], [3457, 3532, 3534], [3533, 3535], [3534, 3536, 3632], [3535, 3537], [3458, 3536, 3538], [3537, 3539], [3538, 3540, 3633], [3539, 3541], [3459, 3540, 3542], [3541, 3543], [3542, 3544, 3634], [3543, 3545], [3460, 3544, 3546], [3545, 3547], [3546, 3548, 3635], [3547, 3549], [3461, 3548, 3550], [3549, 3551], [3550, 3552, 3636], [3551, 3553], [3462, 3552, 3554], [3553, 3555], [3554, 3556, 3637], [3555, 3557], [3463, 3556, 3558], [3557, 3559], [3558, 3560, 3638], [3559, 3561], [3464, 3560, 3562], [3561, 3563], [3562, 3564, 3639], [3563, 3565], [3465, 3564, 3566], [3565, 3567], [3566, 3568, 3640], [3567, 3569], [3466, 3568, 3570], [3569, 3571], [3570, 3572, 3641], [3571, 3573], [3467, 3572, 3574], [3573, 3575], [3574, 3576, 3642], [3575, 3577], [3468, 3576, 3578], [3577, 3579], [3578, 3580, 3643], [3579, 3581], [3469, 3580, 3582], [3581, 3583], [3582, 3584, 3644], [3583, 3585], [3470, 3584, 3586], [3585, 3587], [3586, 3588, 3645], [3587, 3589], [3471, 3588, 3590], [3589, 3591], [3590, 3592, 3646], [3591, 3593], [3472, 3592, 3594], [3593, 3595], [3594, 3596, 3647], [3595, 3597], [3473, 3596, 3598], [3597, 3599], [3598, 3600, 3648], [3599, 3601], [3474, 3600, 3602], [3601, 3603], [3602, 3604, 3649], [3603, 3605], [3475, 3604, 3606], [3605, 3607], [3606, 3608, 3650], [3607, 3609], [3476, 3608, 3610], [3609, 3611], [3610, 3612, 3651], [3611, 3613], [3477, 3612, 3614], [3613, 3615], [3614, 3616, 3652], [3615, 3617], [3478, 3616], [3479, 3653], [3483, 3657], [3487, 3661], [3491, 3665], [3495, 3669], [3499, 3673], [3503, 3677], [3507, 3681], [3511, 3685], [3515, 3689], [3519, 3693], [3523, 3697], [3527, 3701], [3531, 3705], [3535, 3709], [3539, 3713], [3543, 3717], [3547, 3721], [3551, 3725], [3555, 3729], [3559, 3733], [3563, 3737], [3567, 3741], [3571, 3745], [3575, 3749], [3579, 3753], [3583, 3757], [3587, 3761], [3591, 3765], [3595, 3769], [3599, 3773], [3603, 3777], [3607, 3781], [3611, 3785], [3615, 3789], [3618, 3654], [3653, 3655], [3654, 3656, 3792], [3655, 3657], [3619, 3656, 3658], [3657, 3659], [3658, 3660, 3793], [3659, 3661], [3620, 3660, 3662], [3661, 3663], [3662, 3664, 3794], [3663, 3665], [3621, 3664, 3666], [3665, 3667], [3666, 3668, 3795], [3667, 3669], [3622, 3668, 3670], [3669, 3671], [3670, 3672, 3796], [3671, 3673], [3623, 3672, 3674], [3673, 3675], [3674, 3676, 3797], [3675, 3677], [3624, 3676, 3678], [3677, 3679], [3678, 3680, 3798], [3679, 3681], [3625, 3680, 3682], [3681, 3683], [3682, 3684, 3799], [3683, 3685], [3626, 3684, 3686], [3685, 3687], [3686, 3688, 3800], [3687, 3689], [3627, 3688, 3690], [3689, 3691], [3690, 3692, 3801], [3691, 3693], [3628, 3692, 3694], [3693, 3695], [3694, 3696, 3802], [3695, 3697], [3629, 3696, 3698], [3697, 3699], [3698, 3700, 3803], [3699, 3701], [3630, 3700, 3702], [3701, 3703], [3702, 3704, 3804], [3703, 3705], [3631, 3704, 3706], [3705, 3707], [3706, 3708, 3805], [3707, 3709], [3632, 3708, 3710], [3709, 3711], [3710, 3712, 3806], [3711, 3713], [3633, 3712, 3714], [3713, 3715], [3714, 3716, 3807], [3715, 3717], [3634, 3716, 3718], [3717, 3719], [3718, 3720, 3808], [3719, 3721], [3635, 3720, 3722], [3721, 3723], [3722, 3724, 3809], [3723, 3725], [3636, 3724, 3726], [3725, 3727], [3726, 3728, 3810], [3727, 3729], [3637, 3728, 3730], [3729, 3731], [3730, 3732, 3811], [3731, 3733], [3638, 3732, 3734], [3733, 3735], [3734, 3736, 3812], [3735, 3737], [3639, 3736, 3738], [3737, 3739], [3738, 3740, 3813], [3739, 3741], [3640, 3740, 3742], [3741, 3743], [3742, 3744, 3814], [3743, 3745], [3641, 3744, 3746], [3745, 3747], [3746, 3748, 3815], [3747, 3749], [3642, 3748, 3750], [3749, 3751], [3750, 3752, 3816], [3751, 3753], [3643, 3752, 3754], [3753, 3755], [3754, 3756, 3817], [3755, 3757], [3644, 3756, 3758], [3757, 3759], [3758, 3760, 3818], [3759, 3761], [3645, 3760, 3762], [3761, 3763], [3762, 3764, 3819], [3763, 3765], [3646, 3764, 3766], [3765, 3767], [3766, 3768, 3820], [3767, 3769], [3647, 3768, 3770], [3769, 3771], [3770, 3772, 3821], [3771, 3773], [3648, 3772, 3774], [3773, 3775], [3774, 3776, 3822], [3775, 3777], [3649, 3776, 3778], [3777, 3779], [3778, 3780, 3823], [3779, 3781], [3650, 3780, 3782], [3781, 3783], [3782, 3784, 3824], [3783, 3785], [3651, 3784, 3786], [3785, 3787], [3786, 3788, 3825], [3787, 3789], [3652, 3788, 3790], [3789, 3791], [3790, 3826], [3655, 3829], [3659, 3833], [3663, 3837], [3667, 3841], [3671, 3845], [3675, 3849], [3679, 3853], [3683, 3857], [3687, 3861], [3691, 3865], [3695, 3869], [3699, 3873], [3703, 3877], [3707, 3881], [3711, 3885], [3715, 3889], [3719, 3893], [3723, 3897], [3727, 3901], [3731, 3905], [3735, 3909], [3739, 3913], [3743, 3917], [3747, 3921], [3751, 3925], [3755, 3929], [3759, 3933], [3763, 3937], [3767, 3941], [3771, 3945], [3775, 3949], [3779, 3953], [3783, 3957], [3787, 3961], [3791, 3965], [3828, 3966], [3827, 3829], [3792, 3828, 3830], [3829, 3831], [3830, 3832, 3967], [3831, 3833], [3793, 3832, 3834], [3833, 3835], [3834, 3836, 3968], [3835, 3837], [3794, 3836, 3838], [3837, 3839], [3838, 3840, 3969], [3839, 3841], [3795, 3840, 3842], [3841, 3843], [3842, 3844, 3970], [3843, 3845], [3796, 3844, 3846], [3845, 3847], [3846, 3848, 3971], [3847, 3849], [3797, 3848, 3850], [3849, 3851], [3850, 3852, 3972], [3851, 3853], [3798, 3852, 3854], [3853, 3855], [3854, 3856, 3973], [3855, 3857], [3799, 3856, 3858], [3857, 3859], [3858, 3860, 3974], [3859, 3861], [3800, 3860, 3862], [3861, 3863], [3862, 3864, 3975], [3863, 3865], [3801, 3864, 3866], [3865, 3867], [3866, 3868, 3976], [3867, 3869], [3802, 3868, 3870], [3869, 3871], [3870, 3872, 3977], [3871, 3873], [3803, 3872, 3874], [3873, 3875], [3874, 3876, 3978], [3875, 3877], [3804, 3876, 3878], [3877, 3879], [3878, 3880, 3979], [3879, 3881], [3805, 3880, 3882], [3881, 3883], [3882, 3884, 3980], [3883, 3885], [3806, 3884, 3886], [3885, 3887], [3886, 3888, 3981], [3887, 3889], [3807, 3888, 3890], [3889, 3891], [3890, 3892, 3982], [3891, 3893], [3808, 3892, 3894], [3893, 3895], [3894, 3896, 3983], [3895, 3897], [3809, 3896, 3898], [3897, 3899], [3898, 3900, 3984], [3899, 3901], [3810, 3900, 3902], [3901, 3903], [3902, 3904, 3985], [3903, 3905], [3811, 3904, 3906], [3905, 3907], [3906, 3908, 3986], [3907, 3909], [3812, 3908, 3910], [3909, 3911], [3910, 3912, 3987], [3911, 3913], [3813, 3912, 3914], [3913, 3915], [3914, 3916, 3988], [3915, 3917], [3814, 3916, 3918], [3917, 3919], [3918, 3920, 3989], [3919, 3921], [3815, 3920, 3922], [3921, 3923], [3922, 3924, 3990], [3923, 3925], [3816, 3924, 3926], [3925, 3927], [3926, 3928, 3991], [3927, 3929], [3817, 3928, 3930], [3929, 3931], [3930, 3932, 3992], [3931, 3933], [3818, 3932, 3934], [3933, 3935], [3934, 3936, 3993], [3935, 3937], [3819, 3936, 3938], [3937, 3939], [3938, 3940, 3994], [3939, 3941], [3820, 3940, 3942], [3941, 3943], [3942, 3944, 3995], [3943, 3945], [3821, 3944, 3946], [3945, 3947], [3946, 3948, 3996], [3947, 3949], [3822, 3948, 3950], [3949, 3951], [3950, 3952, 3997], [3951, 3953], [3823, 3952, 3954], [3953, 3955], [3954, 3956, 3998], [3955, 3957], [3824, 3956, 3958], [3957, 3959], [3958, 3960, 3999], [3959, 3961], [3825, 3960, 3962], [3961, 3963], [3962, 3964, 4000], [3963, 3965], [3826, 3964], [3827, 4001], [3831, 4005], [3835, 4009], [3839, 4013], [3843, 4017], [3847, 4021], [3851, 4025], [3855, 4029], [3859, 4033], [3863, 4037], [3867, 4041], [3871, 4045], [3875, 4049], [3879, 4053], [3883, 4057], [3887, 4061], [3891, 4065], [3895, 4069], [3899, 4073], [3903, 4077], [3907, 4081], [3911, 4085], [3915, 4089], [3919, 4093], [3923, 4097], [3927, 4101], [3931, 4105], [3935, 4109], [3939, 4113], [3943, 4117], [3947, 4121], [3951, 4125], [3955, 4129], [3959, 4133], [3963, 4137], [3966, 4002], [4001, 4003], [4002, 4004, 4140], [4003, 4005], [3967, 4004, 4006], [4005, 4007], [4006, 4008, 4141], [4007, 4009], [3968, 4008, 4010], [4009, 4011], [4010, 4012, 4142], [4011, 4013], [3969, 4012, 4014], [4013, 4015], [4014, 4016, 4143], [4015, 4017], [3970, 4016, 4018], [4017, 4019], [4018, 4020, 4144], [4019, 4021], [3971, 4020, 4022], [4021, 4023], [4022, 4024, 4145], [4023, 4025], [3972, 4024, 4026], [4025, 4027], [4026, 4028, 4146], [4027, 4029], [3973, 4028, 4030], [4029, 4031], [4030, 4032, 4147], [4031, 4033], [3974, 4032, 4034], [4033, 4035], [4034, 4036, 4148], [4035, 4037], [3975, 4036, 4038], [4037, 4039], [4038, 4040, 4149], [4039, 4041], [3976, 4040, 4042], [4041, 4043], [4042, 4044, 4150], [4043, 4045], [3977, 4044, 4046], [4045, 4047], [4046, 4048, 4151], [4047, 4049], [3978, 4048, 4050], [4049, 4051], [4050, 4052, 4152], [4051, 4053], [3979, 4052, 4054], [4053, 4055], [4054, 4056, 4153], [4055, 4057], [3980, 4056, 4058], [4057, 4059], [4058, 4060, 4154], [4059, 4061], [3981, 4060, 4062], [4061, 4063], [4062, 4064, 4155], [4063, 4065], [3982, 4064, 4066], [4065, 4067], [4066, 4068, 4156], [4067, 4069], [3983, 4068, 4070], [4069, 4071], [4070, 4072, 4157], [4071, 4073], [3984, 4072, 4074], [4073, 4075], [4074, 4076, 4158], [4075, 4077], [3985, 4076, 4078], [4077, 4079], [4078, 4080, 4159], [4079, 4081], [3986, 4080, 4082], [4081, 4083], [4082, 4084, 4160], [4083, 4085], [3987, 4084, 4086], [4085, 4087], [4086, 4088, 4161], [4087, 4089], [3988, 4088, 4090], [4089, 4091], [4090, 4092, 4162], [4091, 4093], [3989, 4092, 4094], [4093, 4095], [4094, 4096, 4163], [4095, 4097], [3990, 4096, 4098], [4097, 4099], [4098, 4100, 4164], [4099, 4101], [3991, 4100, 4102], [4101, 4103], [4102, 4104, 4165], [4103, 4105], [3992, 4104, 4106], [4105, 4107], [4106, 4108, 4166], [4107, 4109], [3993, 4108, 4110], [4109, 4111], [4110, 4112, 4167], [4111, 4113], [3994, 4112, 4114], [4113, 4115], [4114, 4116, 4168], [4115, 4117], [3995, 4116, 4118], [4117, 4119], [4118, 4120, 4169], [4119, 4121], [3996, 4120, 4122], [4121, 4123], [4122, 4124, 4170], [4123, 4125], [3997, 4124, 4126], [4125, 4127], [4126, 4128, 4171], [4127, 4129], [3998, 4128, 4130], [4129, 4131], [4130, 4132, 4172], [4131, 4133], [3999, 4132, 4134], [4133, 4135], [4134, 4136, 4173], [4135, 4137], [4000, 4136, 4138], [4137, 4139], [4138, 4174], [4003, 4177], [4007, 4181], [4011, 4185], [4015, 4189], [4019, 4193], [4023, 4197], [4027, 4201], [4031, 4205], [4035, 4209], [4039, 4213], [4043, 4217], [4047, 4221], [4051, 4225], [4055, 4229], [4059, 4233], [4063, 4237], [4067, 4241], [4071, 4245], [4075, 4249], [4079, 4253], [4083, 4257], [4087, 4261], [4091, 4265], [4095, 4269], [4099, 4273], [4103, 4277], [4107, 4281], [4111, 4285], [4115, 4289], [4119, 4293], [4123, 4297], [4127, 4301], [4131, 4305], [4135, 4309], [4139, 4313], [4176, 4314], [4175, 4177], [4140, 4176, 4178], [4177, 4179], [4178, 4180, 4315], [4179, 4181], [4141, 4180, 4182], [4181, 4183], [4182, 4184, 4316], [4183, 4185], [4142, 4184, 4186], [4185, 4187], [4186, 4188, 4317], [4187, 4189], [4143, 4188, 4190], [4189, 4191], [4190, 4192, 4318], [4191, 4193], [4144, 4192, 4194], [4193, 4195], [4194, 4196, 4319], [4195, 4197], [4145, 4196, 4198], [4197, 4199], [4198, 4200, 4320], [4199, 4201], [4146, 4200, 4202], [4201, 4203], [4202, 4204, 4321], [4203, 4205], [4147, 4204, 4206], [4205, 4207], [4206, 4208, 4322], [4207, 4209], [4148, 4208, 4210], [4209, 4211], [4210, 4212, 4323], [4211, 4213], [4149, 4212, 4214], [4213, 4215], [4214, 4216, 4324], [4215, 4217], [4150, 4216, 4218], [4217, 4219], [4218, 4220, 4325], [4219, 4221], [4151, 4220, 4222], [4221, 4223], [4222, 4224, 4326], [4223, 4225], [4152, 4224, 4226], [4225, 4227], [4226, 4228, 4327], [4227, 4229], [4153, 4228, 4230], [4229, 4231], [4230, 4232, 4328], [4231, 4233], [4154, 4232, 4234], [4233, 4235], [4234, 4236, 4329], [4235, 4237], [4155, 4236, 4238], [4237, 4239], [4238, 4240, 4330], [4239, 4241], [4156, 4240, 4242], [4241, 4243], [4242, 4244, 4331], [4243, 4245], [4157, 4244, 4246], [4245, 4247], [4246, 4248, 4332], [4247, 4249], [4158, 4248, 4250], [4249, 4251], [4250, 4252, 4333], [4251, 4253], [4159, 4252, 4254], [4253, 4255], [4254, 4256, 4334], [4255, 4257], [4160, 4256, 4258], [4257, 4259], [4258, 4260, 4335], [4259, 4261], [4161, 4260, 4262], [4261, 4263], [4262, 4264, 4336], [4263, 4265], [4162, 4264, 4266], [4265, 4267], [4266, 4268, 4337], [4267, 4269], [4163, 4268, 4270], [4269, 4271], [4270, 4272, 4338], [4271, 4273], [4164, 4272, 4274], [4273, 4275], [4274, 4276, 4339], [4275, 4277], [4165, 4276, 4278], [4277, 4279], [4278, 4280, 4340], [4279, 4281], [4166, 4280, 4282], [4281, 4283], [4282, 4284, 4341], [4283, 4285], [4167, 4284, 4286], [4285, 4287], [4286, 4288, 4342], [4287, 4289], [4168, 4288, 4290], [4289, 4291], [4290, 4292, 4343], [4291, 4293], [4169, 4292, 4294], [4293, 4295], [4294, 4296, 4344], [4295, 4297], [4170, 4296, 4298], [4297, 4299], [4298, 4300, 4345], [4299, 4301], [4171, 4300, 4302], [4301, 4303], [4302, 4304, 4346], [4303, 4305], [4172, 4304, 4306], [4305, 4307], [4306, 4308, 4347], [4307, 4309], [4173, 4308, 4310], [4309, 4311], [4310, 4312, 4348], [4311, 4313], [4174, 4312], [4175, 4349], [4179, 4353], [4183, 4357], [4187, 4361], [4191, 4365], [4195, 4369], [4199, 4373], [4203, 4377], [4207, 4381], [4211, 4385], [4215, 4389], [4219, 4393], [4223, 4397], [4227, 4401], [4231, 4405], [4235, 4409], [4239, 4413], [4243, 4417], [4247, 4421], [4251, 4425], [4255, 4429], [4259, 4433], [4263, 4437], [4267, 4441], [4271, 4445], [4275, 4449], [4279, 4453], [4283, 4457], [4287, 4461], [4291, 4465], [4295, 4469], [4299, 4473], [4303, 4477], [4307, 4481], [4311, 4485], [4314, 4350], [4349, 4351], [4350, 4352, 4488], [4351, 4353], [4315, 4352, 4354], [4353, 4355], [4354, 4356, 4489], [4355, 4357], [4316, 4356, 4358], [4357, 4359], [4358, 4360, 4490], [4359, 4361], [4317, 4360, 4362], [4361, 4363], [4362, 4364, 4491], [4363, 4365], [4318, 4364, 4366], [4365, 4367], [4366, 4368, 4492], [4367, 4369], [4319, 4368, 4370], [4369, 4371], [4370, 4372, 4493], [4371, 4373], [4320, 4372, 4374], [4373, 4375], [4374, 4376, 4494], [4375, 4377], [4321, 4376, 4378], [4377, 4379], [4378, 4380, 4495], [4379, 4381], [4322, 4380, 4382], [4381, 4383], [4382, 4384, 4496], [4383, 4385], [4323, 4384, 4386], [4385, 4387], [4386, 4388, 4497], [4387, 4389], [4324, 4388, 4390], [4389, 4391], [4390, 4392, 4498], [4391, 4393], [4325, 4392, 4394], [4393, 4395], [4394, 4396, 4499], [4395, 4397], [4326, 4396, 4398], [4397, 4399], [4398, 4400, 4500], [4399, 4401], [4327, 4400, 4402], [4401, 4403], [4402, 4404, 4501], [4403, 4405], [4328, 4404, 4406], [4405, 4407], [4406, 4408, 4502], [4407, 4409], [4329, 4408, 4410], [4409, 4411], [4410, 4412, 4503], [4411, 4413], [4330, 4412, 4414], [4413, 4415], [4414, 4416, 4504], [4415, 4417], [4331, 4416, 4418], [4417, 4419], [4418, 4420, 4505], [4419, 4421], [4332, 4420, 4422], [4421, 4423], [4422, 4424, 4506], [4423, 4425], [4333, 4424, 4426], [4425, 4427], [4426, 4428, 4507], [4427, 4429], [4334, 4428, 4430], [4429, 4431], [4430, 4432, 4508], [4431, 4433], [4335, 4432, 4434], [4433, 4435], [4434, 4436, 4509], [4435, 4437], [4336, 4436, 4438], [4437, 4439], [4438, 4440, 4510], [4439, 4441], [4337, 4440, 4442], [4441, 4443], [4442, 4444, 4511], [4443, 4445], [4338, 4444, 4446], [4445, 4447], [4446, 4448, 4512], [4447, 4449], [4339, 4448, 4450], [4449, 4451], [4450, 4452, 4513], [4451, 4453], [4340, 4452, 4454], [4453, 4455], [4454, 4456, 4514], [4455, 4457], [4341, 4456, 4458], [4457, 4459], [4458, 4460, 4515], [4459, 4461], [4342, 4460, 4462], [4461, 4463], [4462, 4464, 4516], [4463, 4465], [4343, 4464, 4466], [4465, 4467], [4466, 4468, 4517], [4467, 4469], [4344, 4468, 4470], [4469, 4471], [4470, 4472, 4518], [4471, 4473], [4345, 4472, 4474], [4473, 4475], [4474, 4476, 4519], [4475, 4477], [4346, 4476, 4478], [4477, 4479], [4478, 4480, 4520], [4479, 4481], [4347, 4480, 4482], [4481, 4483], [4482, 4484, 4521], [4483, 4485], [4348, 4484, 4486], [4485, 4487], [4486, 4522], [4351, 4525], [4355, 4529], [4359, 4533], [4363, 4537], [4367, 4541], [4371, 4545], [4375, 4549], [4379, 4553], [4383, 4557], [4387, 4561], [4391, 4565], [4395, 4569], [4399, 4573], [4403, 4577], [4407, 4581], [4411, 4585], [4415, 4589], [4419, 4593], [4423, 4597], [4427, 4601], [4431, 4605], [4435, 4609], [4439, 4613], [4443, 4617], [4447, 4621], [4451, 4625], [4455, 4629], [4459, 4633], [4463, 4637], [4467, 4641], [4471, 4645], [4475, 4649], [4479, 4653], [4483, 4657], [4487, 4661], [4524, 4662], [4523, 4525], [4488, 4524, 4526], [4525, 4527], [4526, 4528, 4663], [4527, 4529], [4489, 4528, 4530], [4529, 4531], [4530, 4532, 4664], [4531, 4533], [4490, 4532, 4534], [4533, 4535], [4534, 4536, 4665], [4535, 4537], [4491, 4536, 4538], [4537, 4539], [4538, 4540, 4666], [4539, 4541], [4492, 4540, 4542], [4541, 4543], [4542, 4544, 4667], [4543, 4545], [4493, 4544, 4546], [4545, 4547], [4546, 4548, 4668], [4547, 4549], [4494, 4548, 4550], [4549, 4551], [4550, 4552, 4669], [4551, 4553], [4495, 4552, 4554], [4553, 4555], [4554, 4556, 4670], [4555, 4557], [4496, 4556, 4558], [4557, 4559], [4558, 4560, 4671], [4559, 4561], [4497, 4560, 4562], [4561, 4563], [4562, 4564, 4672], [4563, 4565], [4498, 4564, 4566], [4565, 4567], [4566, 4568, 4673], [4567, 4569], [4499, 4568, 4570], [4569, 4571], [4570, 4572, 4674], [4571, 4573], [4500, 4572, 4574], [4573, 4575], [4574, 4576, 4675], [4575, 4577], [4501, 4576, 4578], [4577, 4579], [4578, 4580, 4676], [4579, 4581], [4502, 4580, 4582], [4581, 4583], [4582, 4584, 4677], [4583, 4585], [4503, 4584, 4586], [4585, 4587], [4586, 4588, 4678], [4587, 4589], [4504, 4588, 4590], [4589, 4591], [4590, 4592, 4679], [4591, 4593], [4505, 4592, 4594], [4593, 4595], [4594, 4596, 4680], [4595, 4597], [4506, 4596, 4598], [4597, 4599], [4598, 4600, 4681], [4599, 4601], [4507, 4600, 4602], [4601, 4603], [4602, 4604, 4682], [4603, 4605], [4508, 4604, 4606], [4605, 4607], [4606, 4608, 4683], [4607, 4609], [4509, 4608, 4610], [4609, 4611], [4610, 4612, 4684], [4611, 4613], [4510, 4612, 4614], [4613, 4615], [4614, 4616, 4685], [4615, 4617], [4511, 4616, 4618], [4617, 4619], [4618, 4620, 4686], [4619, 4621], [4512, 4620, 4622], [4621, 4623], [4622, 4624, 4687], [4623, 4625], [4513, 4624, 4626], [4625, 4627], [4626, 4628, 4688], [4627, 4629], [4514, 4628, 4630], [4629, 4631], [4630, 4632, 4689], [4631, 4633], [4515, 4632, 4634], [4633, 4635], [4634, 4636, 4690], [4635, 4637], [4516, 4636, 4638], [4637, 4639], [4638, 4640, 4691], [4639, 4641], [4517, 4640, 4642], [4641, 4643], [4642, 4644, 4692], [4643, 4645], [4518, 4644, 4646], [4645, 4647], [4646, 4648, 4693], [4647, 4649], [4519, 4648, 4650], [4649, 4651], [4650, 4652, 4694], [4651, 4653], [4520, 4652, 4654], [4653, 4655], [4654, 4656, 4695], [4655, 4657], [4521, 4656, 4658], [4657, 4659], [4658, 4660, 4696], [4659, 4661], [4522, 4660], [4523, 4697], [4527, 4701], [4531, 4705], [4535, 4709], [4539, 4713], [4543, 4717], [4547, 4721], [4551, 4725], [4555, 4729], [4559, 4733], [4563, 4737], [4567, 4741], [4571, 4745], [4575, 4749], [4579, 4753], [4583, 4757], [4587, 4761], [4591, 4765], [4595, 4769], [4599, 4773], [4603, 4777], [4607, 4781], [4611, 4785], [4615, 4789], [4619, 4793], [4623, 4797], [4627, 4801], [4631, 4805], [4635, 4809], [4639, 4813], [4643, 4817], [4647, 4821], [4651, 4825], [4655, 4829], [4659, 4833], [4662, 4698], [4697, 4699], [4698, 4700, 4836], [4699, 4701], [4663, 4700, 4702], [4701, 4703], [4702, 4704, 4837], [4703, 4705], [4664, 4704, 4706], [4705, 4707], [4706, 4708, 4838], [4707, 4709], [4665, 4708, 4710], [4709, 4711], [4710, 4712, 4839], [4711, 4713], [4666, 4712, 4714], [4713, 4715], [4714, 4716, 4840], [4715, 4717], [4667, 4716, 4718], [4717, 4719], [4718, 4720, 4841], [4719, 4721], [4668, 4720, 4722], [4721, 4723], [4722, 4724, 4842], [4723, 4725], [4669, 4724, 4726], [4725, 4727], [4726, 4728, 4843], [4727, 4729], [4670, 4728, 4730], [4729, 4731], [4730, 4732, 4844], [4731, 4733], [4671, 4732, 4734], [4733, 4735], [4734, 4736, 4845], [4735, 4737], [4672, 4736, 4738], [4737, 4739], [4738, 4740, 4846], [4739, 4741], [4673, 4740, 4742], [4741, 4743], [4742, 4744, 4847], [4743, 4745], [4674, 4744, 4746], [4745, 4747], [4746, 4748, 4848], [4747, 4749], [4675, 4748, 4750], [4749, 4751], [4750, 4752, 4849], [4751, 4753], [4676, 4752, 4754], [4753, 4755], [4754, 4756, 4850], [4755, 4757], [4677, 4756, 4758], [4757, 4759], [4758, 4760, 4851], [4759, 4761], [4678, 4760, 4762], [4761, 4763], [4762, 4764, 4852], [4763, 4765], [4679, 4764, 4766], [4765, 4767], [4766, 4768, 4853], [4767, 4769], [4680, 4768, 4770], [4769, 4771], [4770, 4772, 4854], [4771, 4773], [4681, 4772, 4774], [4773, 4775], [4774, 4776, 4855], [4775, 4777], [4682, 4776, 4778], [4777, 4779], [4778, 4780, 4856], [4779, 4781], [4683, 4780, 4782], [4781, 4783], [4782, 4784, 4857], [4783, 4785], [4684, 4784, 4786], [4785, 4787], [4786, 4788, 4858], [4787, 4789], [4685, 4788, 4790], [4789, 4791], [4790, 4792, 4859], [4791, 4793], [4686, 4792, 4794], [4793, 4795], [4794, 4796, 4860], [4795, 4797], [4687, 4796, 4798], [4797, 4799], [4798, 4800, 4861], [4799, 4801], [4688, 4800, 4802], [4801, 4803], [4802, 4804, 4862], [4803, 4805], [4689, 4804, 4806], [4805, 4807], [4806, 4808, 4863], [4807, 4809], [4690, 4808, 4810], [4809, 4811], [4810, 4812, 4864], [4811, 4813], [4691, 4812, 4814], [4813, 4815], [4814, 4816, 4865], [4815, 4817], [4692, 4816, 4818], [4817, 4819], [4818, 4820, 4866], [4819, 4821], [4693, 4820, 4822], [4821, 4823], [4822, 4824, 4867], [4823, 4825], [4694, 4824, 4826], [4825, 4827], [4826, 4828, 4868], [4827, 4829], [4695, 4828, 4830], [4829, 4831], [4830, 4832, 4869], [4831, 4833], [4696, 4832, 4834], [4833, 4835], [4834, 4870], [4699, 4873], [4703, 4877], [4707, 4881], [4711, 4885], [4715, 4889], [4719, 4893], [4723, 4897], [4727, 4901], [4731, 4905], [4735, 4909], [4739, 4913], [4743, 4917], [4747, 4921], [4751, 4925], [4755, 4929], [4759, 4933], [4763, 4937], [4767, 4941], [4771, 4945], [4775, 4949], [4779, 4953], [4783, 4957], [4787, 4961], [4791, 4965], [4795, 4969], [4799, 4973], [4803, 4977], [4807, 4981], [4811, 4985], [4815, 4989], [4819, 4993], [4823, 4997], [4827, 5001], [4831, 5005], [4835, 5009], [4872, 5010], [4871, 4873], [4836, 4872, 4874], [4873, 4875], [4874, 4876, 5011], [4875, 4877], [4837, 4876, 4878], [4877, 4879], [4878, 4880, 5012], [4879, 4881], [4838, 4880, 4882], [4881, 4883], [4882, 4884, 5013], [4883, 4885], [4839, 4884, 4886], [4885, 4887], [4886, 4888, 5014], [4887, 4889], [4840, 4888, 4890], [4889, 4891], [4890, 4892, 5015], [4891, 4893], [4841, 4892, 4894], [4893, 4895], [4894, 4896, 5016], [4895, 4897], [4842, 4896, 4898], [4897, 4899], [4898, 4900, 5017], [4899, 4901], [4843, 4900, 4902], [4901, 4903], [4902, 4904, 5018], [4903, 4905], [4844, 4904, 4906], [4905, 4907], [4906, 4908, 5019], [4907, 4909], [4845, 4908, 4910], [4909, 4911], [4910, 4912, 5020], [4911, 4913], [4846, 4912, 4914], [4913, 4915], [4914, 4916, 5021], [4915, 4917], [4847, 4916, 4918], [4917, 4919], [4918, 4920, 5022], [4919, 4921], [4848, 4920, 4922], [4921, 4923], [4922, 4924, 5023], [4923, 4925], [4849, 4924, 4926], [4925, 4927], [4926, 4928, 5024], [4927, 4929], [4850, 4928, 4930], [4929, 4931], [4930, 4932, 5025], [4931, 4933], [4851, 4932, 4934], [4933, 4935], [4934, 4936, 5026], [4935, 4937], [4852, 4936, 4938], [4937, 4939], [4938, 4940, 5027], [4939, 4941], [4853, 4940, 4942], [4941, 4943], [4942, 4944, 5028], [4943, 4945], [4854, 4944, 4946], [4945, 4947], [4946, 4948, 5029], [4947, 4949], [4855, 4948, 4950], [4949, 4951], [4950, 4952, 5030], [4951, 4953], [4856, 4952, 4954], [4953, 4955], [4954, 4956, 5031], [4955, 4957], [4857, 4956, 4958], [4957, 4959], [4958, 4960, 5032], [4959, 4961], [4858, 4960, 4962], [4961, 4963], [4962, 4964, 5033], [4963, 4965], [4859, 4964, 4966], [4965, 4967], [4966, 4968, 5034], [4967, 4969], [4860, 4968, 4970], [4969, 4971], [4970, 4972, 5035], [4971, 4973], [4861, 4972, 4974], [4973, 4975], [4974, 4976, 5036], [4975, 4977], [4862, 4976, 4978], [4977, 4979], [4978, 4980, 5037], [4979, 4981], [4863, 4980, 4982], [4981, 4983], [4982, 4984, 5038], [4983, 4985], [4864, 4984, 4986], [4985, 4987], [4986, 4988, 5039], [4987, 4989], [4865, 4988, 4990], [4989, 4991], [4990, 4992, 5040], [4991, 4993], [4866, 4992, 4994], [4993, 4995], [4994, 4996, 5041], [4995, 4997], [4867, 4996, 4998], [4997, 4999], [4998, 5000, 5042], [4999, 5001], [4868, 5000, 5002], [5001, 5003], [5002, 5004, 5043], [5003, 5005], [4869, 5004, 5006], [5005, 5007], [5006, 5008, 5044], [5007, 5009], [4870, 5008], [4871, 5045], [4875, 5049], [4879, 5053], [4883, 5057], [4887, 5061], [4891, 5065], [4895, 5069], [4899, 5073], [4903, 5077], [4907, 5081], [4911, 5085], [4915, 5089], [4919, 5093], [4923, 5097], [4927, 5101], [4931, 5105], [4935, 5109], [4939, 5113], [4943, 5117], [4947, 5121], [4951, 5125], [4955, 5129], [4959, 5133], [4963, 5137], [4967, 5141], [4971, 5145], [4975, 5149], [4979, 5153], [4983, 5157], [4987, 5161], [4991, 5165], [4995, 5169], [4999, 5173], [5003, 5177], [5007, 5181], [5010, 5046], [5045, 5047], [5046, 5048, 5184], [5047, 5049], [5011, 5048, 5050], [5049, 5051], [5050, 5052, 5185], [5051, 5053], [5012, 5052, 5054], [5053, 5055], [5054, 5056, 5186], [5055, 5057], [5013, 5056, 5058], [5057, 5059], [5058, 5060, 5187], [5059, 5061], [5014, 5060, 5062], [5061, 5063], [5062, 5064, 5188], [5063, 5065], [5015, 5064, 5066], [5065, 5067], [5066, 5068, 5189], [5067, 5069], [5016, 5068, 5070], [5069, 5071], [5070, 5072, 5190], [5071, 5073], [5017, 5072, 5074], [5073, 5075], [5074, 5076, 5191], [5075, 5077], [5018, 5076, 5078], [5077, 5079], [5078, 5080, 5192], [5079, 5081], [5019, 5080, 5082], [5081, 5083], [5082, 5084, 5193], [5083, 5085], [5020, 5084, 5086], [5085, 5087], [5086, 5088, 5194], [5087, 5089], [5021, 5088, 5090], [5089, 5091], [5090, 5092, 5195], [5091, 5093], [5022, 5092, 5094], [5093, 5095], [5094, 5096, 5196], [5095, 5097], [5023, 5096, 5098], [5097, 5099], [5098, 5100, 5197], [5099, 5101], [5024, 5100, 5102], [5101, 5103], [5102, 5104, 5198], [5103, 5105], [5025, 5104, 5106], [5105, 5107], [5106, 5108, 5199], [5107, 5109], [5026, 5108, 5110], [5109, 5111], [5110, 5112, 5200], [5111, 5113], [5027, 5112, 5114], [5113, 5115], [5114, 5116, 5201], [5115, 5117], [5028, 5116, 5118], [5117, 5119], [5118, 5120, 5202], [5119, 5121], [5029, 5120, 5122], [5121, 5123], [5122, 5124, 5203], [5123, 5125], [5030, 5124, 5126], [5125, 5127], [5126, 5128, 5204], [5127, 5129], [5031, 5128, 5130], [5129, 5131], [5130, 5132, 5205], [5131, 5133], [5032, 5132, 5134], [5133, 5135], [5134, 5136, 5206], [5135, 5137], [5033, 5136, 5138], [5137, 5139], [5138, 5140, 5207], [5139, 5141], [5034, 5140, 5142], [5141, 5143], [5142, 5144, 5208], [5143, 5145], [5035, 5144, 5146], [5145, 5147], [5146, 5148, 5209], [5147, 5149], [5036, 5148, 5150], [5149, 5151], [5150, 5152, 5210], [5151, 5153], [5037, 5152, 5154], [5153, 5155], [5154, 5156, 5211], [5155, 5157], [5038, 5156, 5158], [5157, 5159], [5158, 5160, 5212], [5159, 5161], [5039, 5160, 5162], [5161, 5163], [5162, 5164, 5213], [5163, 5165], [5040, 5164, 5166], [5165, 5167], [5166, 5168, 5214], [5167, 5169], [5041, 5168, 5170], [5169, 5171], [5170, 5172, 5215], [5171, 5173], [5042, 5172, 5174], [5173, 5175], [5174, 5176, 5216], [5175, 5177], [5043, 5176, 5178], [5177, 5179], [5178, 5180, 5217], [5179, 5181], [5044, 5180, 5182], [5181, 5183], [5182, 5218], [5047, 5221], [5051, 5225], [5055, 5229], [5059, 5233], [5063, 5237], [5067, 5241], [5071, 5245], [5075, 5249], [5079, 5253], [5083, 5257], [5087, 5261], [5091, 5265], [5095, 5269], [5099, 5273], [5103, 5277], [5107, 5281], [5111, 5285], [5115, 5289], [5119, 5293], [5123, 5297], [5127, 5301], [5131, 5305], [5135, 5309], [5139, 5313], [5143, 5317], [5147, 5321], [5151, 5325], [5155, 5329], [5159, 5333], [5163, 5337], [5167, 5341], [5171, 5345], [5175, 5349], [5179, 5353], [5183, 5357], [5220, 5358], [5219, 5221], [5184, 5220, 5222], [5221, 5223], [5222, 5224, 5359], [5223, 5225], [5185, 5224, 5226], [5225, 5227], [5226, 5228, 5360], [5227, 5229], [5186, 5228, 5230], [5229, 5231], [5230, 5232, 5361], [5231, 5233], [5187, 5232, 5234], [5233, 5235], [5234, 5236, 5362], [5235, 5237], [5188, 5236, 5238], [5237, 5239], [5238, 5240, 5363], [5239, 5241], [5189, 5240, 5242], [5241, 5243], [5242, 5244, 5364], [5243, 5245], [5190, 5244, 5246], [5245, 5247], [5246, 5248, 5365], [5247, 5249], [5191, 5248, 5250], [5249, 5251], [5250, 5252, 5366], [5251, 5253], [5192, 5252, 5254], [5253, 5255], [5254, 5256, 5367], [5255, 5257], [5193, 5256, 5258], [5257, 5259], [5258, 5260, 5368], [5259, 5261], [5194, 5260, 5262], [5261, 5263], [5262, 5264, 5369], [5263, 5265], [5195, 5264, 5266], [5265, 5267], [5266, 5268, 5370], [5267, 5269], [5196, 5268, 5270], [5269, 5271], [5270, 5272, 5371], [5271, 5273], [5197, 5272, 5274], [5273, 5275], [5274, 5276, 5372], [5275, 5277], [5198, 5276, 5278], [5277, 5279], [5278, 5280, 5373], [5279, 5281], [5199, 5280, 5282], [5281, 5283], [5282, 5284, 5374], [5283, 5285], [5200, 5284, 5286], [5285, 5287], [5286, 5288, 5375], [5287, 5289], [5201, 5288, 5290], [5289, 5291], [5290, 5292, 5376], [5291, 5293], [5202, 5292, 5294], [5293, 5295], [5294, 5296, 5377], [5295, 5297], [5203, 5296, 5298], [5297, 5299], [5298, 5300, 5378], [5299, 5301], [5204, 5300, 5302], [5301, 5303], [5302, 5304, 5379], [5303, 5305], [5205, 5304, 5306], [5305, 5307], [5306, 5308, 5380], [5307, 5309], [5206, 5308, 5310], [5309, 5311], [5310, 5312, 5381], [5311, 5313], [5207, 5312, 5314], [5313, 5315], [5314, 5316, 5382], [5315, 5317], [5208, 5316, 5318], [5317, 5319], [5318, 5320, 5383], [5319, 5321], [5209, 5320, 5322], [5321, 5323], [5322, 5324, 5384], [5323, 5325], [5210, 5324, 5326], [5325, 5327], [5326, 5328, 5385], [5327, 5329], [5211, 5328, 5330], [5329, 5331], [5330, 5332, 5386], [5331, 5333], [5212, 5332, 5334], [5333, 5335], [5334, 5336, 5387], [5335, 5337], [5213, 5336, 5338], [5337, 5339], [5338, 5340, 5388], [5339, 5341], [5214, 5340, 5342], [5341, 5343], [5342, 5344, 5389], [5343, 5345], [5215, 5344, 5346], [5345, 5347], [5346, 5348, 5390], [5347, 5349], [5216, 5348, 5350], [5349, 5351], [5350, 5352, 5391], [5351, 5353], [5217, 5352, 5354], [5353, 5355], [5354, 5356, 5392], [5355, 5357], [5218, 5356], [5219, 5393], [5223, 5397], [5227, 5401], [5231, 5405], [5235, 5409], [5239, 5413], [5243, 5417], [5247, 5421], [5251, 5425], [5255, 5429], [5259, 5433], [5263, 5437], [5267, 5441], [5271, 5445], [5275, 5449], [5279, 5453], [5283, 5457], [5287, 5461], [5291, 5465], [5295, 5469], [5299, 5473], [5303, 5477], [5307, 5481], [5311, 5485], [5315, 5489], [5319, 5493], [5323, 5497], [5327, 5501], [5331, 5505], [5335, 5509], [5339, 5513], [5343, 5517], [5347, 5521], [5351, 5525], [5355, 5529], [5358, 5394], [5393, 5395], [5394, 5396, 5532], [5395, 5397], [5359, 5396, 5398], [5397, 5399], [5398, 5400, 5533], [5399, 5401], [5360, 5400, 5402], [5401, 5403], [5402, 5404, 5534], [5403, 5405], [5361, 5404, 5406], [5405, 5407], [5406, 5408, 5535], [5407, 5409], [5362, 5408, 5410], [5409, 5411], [5410, 5412, 5536], [5411, 5413], [5363, 5412, 5414], [5413, 5415], [5414, 5416, 5537], [5415, 5417], [5364, 5416, 5418], [5417, 5419], [5418, 5420, 5538], [5419, 5421], [5365, 5420, 5422], [5421, 5423], [5422, 5424, 5539], [5423, 5425], [5366, 5424, 5426], [5425, 5427], [5426, 5428, 5540], [5427, 5429], [5367, 5428, 5430], [5429, 5431], [5430, 5432, 5541], [5431, 5433], [5368, 5432, 5434], [5433, 5435], [5434, 5436, 5542], [5435, 5437], [5369, 5436, 5438], [5437, 5439], [5438, 5440, 5543], [5439, 5441], [5370, 5440, 5442], [5441, 5443], [5442, 5444, 5544], [5443, 5445], [5371, 5444, 5446], [5445, 5447], [5446, 5448, 5545], [5447, 5449], [5372, 5448, 5450], [5449, 5451], [5450, 5452, 5546], [5451, 5453], [5373, 5452, 5454], [5453, 5455], [5454, 5456, 5547], [5455, 5457], [5374, 5456, 5458], [5457, 5459], [5458, 5460, 5548], [5459, 5461], [5375, 5460, 5462], [5461, 5463], [5462, 5464, 5549], [5463, 5465], [5376, 5464, 5466], [5465, 5467], [5466, 5468, 5550], [5467, 5469], [5377, 5468, 5470], [5469, 5471], [5470, 5472, 5551], [5471, 5473], [5378, 5472, 5474], [5473, 5475], [5474, 5476, 5552], [5475, 5477], [5379, 5476, 5478], [5477, 5479], [5478, 5480, 5553], [5479, 5481], [5380, 5480, 5482], [5481, 5483], [5482, 5484, 5554], [5483, 5485], [5381, 5484, 5486], [5485, 5487], [5486, 5488, 5555], [5487, 5489], [5382, 5488, 5490], [5489, 5491], [5490, 5492, 5556], [5491, 5493], [5383, 5492, 5494], [5493, 5495], [5494, 5496, 5557], [5495, 5497], [5384, 5496, 5498], [5497, 5499], [5498, 5500, 5558], [5499, 5501], [5385, 5500, 5502], [5501, 5503], [5502, 5504, 5559], [5503, 5505], [5386, 5504, 5506], [5505, 5507], [5506, 5508, 5560], [5507, 5509], [5387, 5508, 5510], [5509, 5511], [5510, 5512, 5561], [5511, 5513], [5388, 5512, 5514], [5513, 5515], [5514, 5516, 5562], [5515, 5517], [5389, 5516, 5518], [5517, 5519], [5518, 5520, 5563], [5519, 5521], [5390, 5520, 5522], [5521, 5523], [5522, 5524, 5564], [5523, 5525], [5391, 5524, 5526], [5525, 5527], [5526, 5528, 5565], [5527, 5529], [5392, 5528, 5530], [5529, 5531], [5530, 5566], [5395, 5569], [5399, 5573], [5403, 5577], [5407, 5581], [5411, 5585], [5415, 5589], [5419, 5593], [5423, 5597], [5427, 5601], [5431, 5605], [5435, 5609], [5439, 5613], [5443, 5617], [5447, 5621], [5451, 5625], [5455, 5629], [5459, 5633], [5463, 5637], [5467, 5641], [5471, 5645], [5475, 5649], [5479, 5653], [5483, 5657], [5487, 5661], [5491, 5665], [5495, 5669], [5499, 5673], [5503, 5677], [5507, 5681], [5511, 5685], [5515, 5689], [5519, 5693], [5523, 5697], [5527, 5701], [5531, 5705], [5568, 5706], [5567, 5569], [5532, 5568, 5570], [5569, 5571], [5570, 5572, 5707], [5571, 5573], [5533, 5572, 5574], [5573, 5575], [5574, 5576, 5708], [5575, 5577], [5534, 5576, 5578], [5577, 5579], [5578, 5580, 5709], [5579, 5581], [5535, 5580, 5582], [5581, 5583], [5582, 5584, 5710], [5583, 5585], [5536, 5584, 5586], [5585, 5587], [5586, 5588, 5711], [5587, 5589], [5537, 5588, 5590], [5589, 5591], [5590, 5592, 5712], [5591, 5593], [5538, 5592, 5594], [5593, 5595], [5594, 5596, 5713], [5595, 5597], [5539, 5596, 5598], [5597, 5599], [5598, 5600, 5714], [5599, 5601], [5540, 5600, 5602], [5601, 5603], [5602, 5604, 5715], [5603, 5605], [5541, 5604, 5606], [5605, 5607], [5606, 5608, 5716], [5607, 5609], [5542, 5608, 5610], [5609, 5611], [5610, 5612, 5717], [5611, 5613], [5543, 5612, 5614], [5613, 5615], [5614, 5616, 5718], [5615, 5617], [5544, 5616, 5618], [5617, 5619], [5618, 5620, 5719], [5619, 5621], [5545, 5620, 5622], [5621, 5623], [5622, 5624, 5720], [5623, 5625], [5546, 5624, 5626], [5625, 5627], [5626, 5628, 5721], [5627, 5629], [5547, 5628, 5630], [5629, 5631], [5630, 5632, 5722], [5631, 5633], [5548, 5632, 5634], [5633, 5635], [5634, 5636, 5723], [5635, 5637], [5549, 5636, 5638], [5637, 5639], [5638, 5640, 5724], [5639, 5641], [5550, 5640, 5642], [5641, 5643], [5642, 5644, 5725], [5643, 5645], [5551, 5644, 5646], [5645, 5647], [5646, 5648, 5726], [5647, 5649], [5552, 5648, 5650], [5649, 5651], [5650, 5652, 5727], [5651, 5653], [5553, 5652, 5654], [5653, 5655], [5654, 5656, 5728], [5655, 5657], [5554, 5656, 5658], [5657, 5659], [5658, 5660, 5729], [5659, 5661], [5555, 5660, 5662], [5661, 5663], [5662, 5664, 5730], [5663, 5665], [5556, 5664, 5666], [5665, 5667], [5666, 5668, 5731], [5667, 5669], [5557, 5668, 5670], [5669, 5671], [5670, 5672, 5732], [5671, 5673], [5558, 5672, 5674], [5673, 5675], [5674, 5676, 5733], [5675, 5677], [5559, 5676, 5678], [5677, 5679], [5678, 5680, 5734], [5679, 5681], [5560, 5680, 5682], [5681, 5683], [5682, 5684, 5735], [5683, 5685], [5561, 5684, 5686], [5685, 5687], [5686, 5688, 5736], [5687, 5689], [5562, 5688, 5690], [5689, 5691], [5690, 5692, 5737], [5691, 5693], [5563, 5692, 5694], [5693, 5695], [5694, 5696, 5738], [5695, 5697], [5564, 5696, 5698], [5697, 5699], [5698, 5700, 5739], [5699, 5701], [5565, 5700, 5702], [5701, 5703], [5702, 5704, 5740], [5703, 5705], [5566, 5704], [5567, 5741], [5571, 5745], [5575, 5749], [5579, 5753], [5583, 5757], [5587, 5761], [5591, 5765], [5595, 5769], [5599, 5773], [5603, 5777], [5607, 5781], [5611, 5785], [5615, 5789], [5619, 5793], [5623, 5797], [5627, 5801], [5631, 5805], [5635, 5809], [5639, 5813], [5643, 5817], [5647, 5821], [5651, 5825], [5655, 5829], [5659, 5833], [5663, 5837], [5667, 5841], [5671, 5845], [5675, 5849], [5679, 5853], [5683, 5857], [5687, 5861], [5691, 5865], [5695, 5869], [5699, 5873], [5703, 5877], [5706, 5742], [5741, 5743], [5742, 5744, 5880], [5743, 5745], [5707, 5744, 5746], [5745, 5747], [5746, 5748, 5881], [5747, 5749], [5708, 5748, 5750], [5749, 5751], [5750, 5752, 5882], [5751, 5753], [5709, 5752, 5754], [5753, 5755], [5754, 5756, 5883], [5755, 5757], [5710, 5756, 5758], [5757, 5759], [5758, 5760, 5884], [5759, 5761], [5711, 5760, 5762], [5761, 5763], [5762, 5764, 5885], [5763, 5765], [5712, 5764, 5766], [5765, 5767], [5766, 5768, 5886], [5767, 5769], [5713, 5768, 5770], [5769, 5771], [5770, 5772, 5887], [5771, 5773], [5714, 5772, 5774], [5773, 5775], [5774, 5776, 5888], [5775, 5777], [5715, 5776, 5778], [5777, 5779], [5778, 5780, 5889], [5779, 5781], [5716, 5780, 5782], [5781, 5783], [5782, 5784, 5890], [5783, 5785], [5717, 5784, 5786], [5785, 5787], [5786, 5788, 5891], [5787, 5789], [5718, 5788, 5790], [5789, 5791], [5790, 5792, 5892], [5791, 5793], [5719, 5792, 5794], [5793, 5795], [5794, 5796, 5893], [5795, 5797], [5720, 5796, 5798], [5797, 5799], [5798, 5800, 5894], [5799, 5801], [5721, 5800, 5802], [5801, 5803], [5802, 5804, 5895], [5803, 5805], [5722, 5804, 5806], [5805, 5807], [5806, 5808, 5896], [5807, 5809], [5723, 5808, 5810], [5809, 5811], [5810, 5812, 5897], [5811, 5813], [5724, 5812, 5814], [5813, 5815], [5814, 5816, 5898], [5815, 5817], [5725, 5816, 5818], [5817, 5819], [5818, 5820, 5899], [5819, 5821], [5726, 5820, 5822], [5821, 5823], [5822, 5824, 5900], [5823, 5825], [5727, 5824, 5826], [5825, 5827], [5826, 5828, 5901], [5827, 5829], [5728, 5828, 5830], [5829, 5831], [5830, 5832, 5902], [5831, 5833], [5729, 5832, 5834], [5833, 5835], [5834, 5836, 5903], [5835, 5837], [5730, 5836, 5838], [5837, 5839], [5838, 5840, 5904], [5839, 5841], [5731, 5840, 5842], [5841, 5843], [5842, 5844, 5905], [5843, 5845], [5732, 5844, 5846], [5845, 5847], [5846, 5848, 5906], [5847, 5849], [5733, 5848, 5850], [5849, 5851], [5850, 5852, 5907], [5851, 5853], [5734, 5852, 5854], [5853, 5855], [5854, 5856, 5908], [5855, 5857], [5735, 5856, 5858], [5857, 5859], [5858, 5860, 5909], [5859, 5861], [5736, 5860, 5862], [5861, 5863], [5862, 5864, 5910], [5863, 5865], [5737, 5864, 5866], [5865, 5867], [5866, 5868, 5911], [5867, 5869], [5738, 5868, 5870], [5869, 5871], [5870, 5872, 5912], [5871, 5873], [5739, 5872, 5874], [5873, 5875], [5874, 5876, 5913], [5875, 5877], [5740, 5876, 5878], [5877, 5879], [5878, 5914], [5743, 5917], [5747, 5921], [5751, 5925], [5755, 5929], [5759, 5933], [5763, 5937], [5767, 5941], [5771, 5945], [5775, 5949], [5779, 5953], [5783, 5957], [5787, 5961], [5791, 5965], [5795, 5969], [5799, 5973], [5803, 5977], [5807, 5981], [5811, 5985], [5815, 5989], [5819, 5993], [5823, 5997], [5827, 6001], [5831, 6005], [5835, 6009], [5839, 6013], [5843, 6017], [5847, 6021], [5851, 6025], [5855, 6029], [5859, 6033], [5863, 6037], [5867, 6041], [5871, 6045], [5875, 6049], [5879, 6053], [5916, 6054], [5915, 5917], [5880, 5916, 5918], [5917, 5919], [5918, 5920, 6055], [5919, 5921], [5881, 5920, 5922], [5921, 5923], [5922, 5924, 6056], [5923, 5925], [5882, 5924, 5926], [5925, 5927], [5926, 5928, 6057], [5927, 5929], [5883, 5928, 5930], [5929, 5931], [5930, 5932, 6058], [5931, 5933], [5884, 5932, 5934], [5933, 5935], [5934, 5936, 6059], [5935, 5937], [5885, 5936, 5938], [5937, 5939], [5938, 5940, 6060], [5939, 5941], [5886, 5940, 5942], [5941, 5943], [5942, 5944, 6061], [5943, 5945], [5887, 5944, 5946], [5945, 5947], [5946, 5948, 6062], [5947, 5949], [5888, 5948, 5950], [5949, 5951], [5950, 5952, 6063], [5951, 5953], [5889, 5952, 5954], [5953, 5955], [5954, 5956, 6064], [5955, 5957], [5890, 5956, 5958], [5957, 5959], [5958, 5960, 6065], [5959, 5961], [5891, 5960, 5962], [5961, 5963], [5962, 5964, 6066], [5963, 5965], [5892, 5964, 5966], [5965, 5967], [5966, 5968, 6067], [5967, 5969], [5893, 5968, 5970], [5969, 5971], [5970, 5972, 6068], [5971, 5973], [5894, 5972, 5974], [5973, 5975], [5974, 5976, 6069], [5975, 5977], [5895, 5976, 5978], [5977, 5979], [5978, 5980, 6070], [5979, 5981], [5896, 5980, 5982], [5981, 5983], [5982, 5984, 6071], [5983, 5985], [5897, 5984, 5986], [5985, 5987], [5986, 5988, 6072], [5987, 5989], [5898, 5988, 5990], [5989, 5991], [5990, 5992, 6073], [5991, 5993], [5899, 5992, 5994], [5993, 5995], [5994, 5996, 6074], [5995, 5997], [5900, 5996, 5998], [5997, 5999], [5998, 6000, 6075], [5999, 6001], [5901, 6000, 6002], [6001, 6003], [6002, 6004, 6076], [6003, 6005], [5902, 6004, 6006], [6005, 6007], [6006, 6008, 6077], [6007, 6009], [5903, 6008, 6010], [6009, 6011], [6010, 6012, 6078], [6011, 6013], [5904, 6012, 6014], [6013, 6015], [6014, 6016, 6079], [6015, 6017], [5905, 6016, 6018], [6017, 6019], [6018, 6020, 6080], [6019, 6021], [5906, 6020, 6022], [6021, 6023], [6022, 6024, 6081], [6023, 6025], [5907, 6024, 6026], [6025, 6027], [6026, 6028, 6082], [6027, 6029], [5908, 6028, 6030], [6029, 6031], [6030, 6032, 6083], [6031, 6033], [5909, 6032, 6034], [6033, 6035], [6034, 6036, 6084], [6035, 6037], [5910, 6036, 6038], [6037, 6039], [6038, 6040, 6085], [6039, 6041], [5911, 6040, 6042], [6041, 6043], [6042, 6044, 6086], [6043, 6045], [5912, 6044, 6046], [6045, 6047], [6046, 6048, 6087], [6047, 6049], [5913, 6048, 6050], [6049, 6051], [6050, 6052, 6088], [6051, 6053], [5914, 6052], [5915, 6089], [5919, 6093], [5923, 6097], [5927, 6101], [5931, 6105], [5935, 6109], [5939, 6113], [5943, 6117], [5947, 6121], [5951, 6125], [5955, 6129], [5959, 6133], [5963, 6137], [5967, 6141], [5971, 6145], [5975, 6149], [5979, 6153], [5983, 6157], [5987, 6161], [5991, 6165], [5995, 6169], [5999, 6173], [6003, 6177], [6007, 6181], [6011, 6185], [6015, 6189], [6019, 6193], [6023, 6197], [6027, 6201], [6031, 6205], [6035, 6209], [6039, 6213], [6043, 6217], [6047, 6221], [6051, 6225], [6054, 6090], [6089, 6091], [6090, 6092, 6228], [6091, 6093], [6055, 6092, 6094], [6093, 6095], [6094, 6096, 6229], [6095, 6097], [6056, 6096, 6098], [6097, 6099], [6098, 6100, 6230], [6099, 6101], [6057, 6100, 6102], [6101, 6103], [6102, 6104, 6231], [6103, 6105], [6058, 6104, 6106], [6105, 6107], [6106, 6108, 6232], [6107, 6109], [6059, 6108, 6110], [6109, 6111], [6110, 6112, 6233], [6111, 6113], [6060, 6112, 6114], [6113, 6115], [6114, 6116, 6234], [6115, 6117], [6061, 6116, 6118], [6117, 6119], [6118, 6120, 6235], [6119, 6121], [6062, 6120, 6122], [6121, 6123], [6122, 6124, 6236], [6123, 6125], [6063, 6124, 6126], [6125, 6127], [6126, 6128, 6237], [6127, 6129], [6064, 6128, 6130], [6129, 6131], [6130, 6132, 6238], [6131, 6133], [6065, 6132, 6134], [6133, 6135], [6134, 6136, 6239], [6135, 6137], [6066, 6136, 6138], [6137, 6139], [6138, 6140, 6240], [6139, 6141], [6067, 6140, 6142], [6141, 6143], [6142, 6144, 6241], [6143, 6145], [6068, 6144, 6146], [6145, 6147], [6146, 6148, 6242], [6147, 6149], [6069, 6148, 6150], [6149, 6151], [6150, 6152, 6243], [6151, 6153], [6070, 6152, 6154], [6153, 6155], [6154, 6156, 6244], [6155, 6157], [6071, 6156, 6158], [6157, 6159], [6158, 6160, 6245], [6159, 6161], [6072, 6160, 6162], [6161, 6163], [6162, 6164, 6246], [6163, 6165], [6073, 6164, 6166], [6165, 6167], [6166, 6168, 6247], [6167, 6169], [6074, 6168, 6170], [6169, 6171], [6170, 6172, 6248], [6171, 6173], [6075, 6172, 6174], [6173, 6175], [6174, 6176, 6249], [6175, 6177], [6076, 6176, 6178], [6177, 6179], [6178, 6180, 6250], [6179, 6181], [6077, 6180, 6182], [6181, 6183], [6182, 6184, 6251], [6183, 6185], [6078, 6184, 6186], [6185, 6187], [6186, 6188, 6252], [6187, 6189], [6079, 6188, 6190], [6189, 6191], [6190, 6192, 6253], [6191, 6193], [6080, 6192, 6194], [6193, 6195], [6194, 6196, 6254], [6195, 6197], [6081, 6196, 6198], [6197, 6199], [6198, 6200, 6255], [6199, 6201], [6082, 6200, 6202], [6201, 6203], [6202, 6204, 6256], [6203, 6205], [6083, 6204, 6206], [6205, 6207], [6206, 6208, 6257], [6207, 6209], [6084, 6208, 6210], [6209, 6211], [6210, 6212, 6258], [6211, 6213], [6085, 6212, 6214], [6213, 6215], [6214, 6216, 6259], [6215, 6217], [6086, 6216, 6218], [6217, 6219], [6218, 6220, 6260], [6219, 6221], [6087, 6220, 6222], [6221, 6223], [6222, 6224, 6261], [6223, 6225], [6088, 6224, 6226], [6225, 6227], [6226, 6262], [6091, 6265], [6095, 6269], [6099, 6273], [6103, 6277], [6107, 6281], [6111, 6285], [6115, 6289], [6119, 6293], [6123, 6297], [6127, 6301], [6131, 6305], [6135, 6309], [6139, 6313], [6143, 6317], [6147, 6321], [6151, 6325], [6155, 6329], [6159, 6333], [6163, 6337], [6167, 6341], [6171, 6345], [6175, 6349], [6179, 6353], [6183, 6357], [6187, 6361], [6191, 6365], [6195, 6369], [6199, 6373], [6203, 6377], [6207, 6381], [6211, 6385], [6215, 6389], [6219, 6393], [6223, 6397], [6227, 6401], [6264, 6402], [6263, 6265], [6228, 6264, 6266], [6265, 6267], [6266, 6268, 6403], [6267, 6269], [6229, 6268, 6270], [6269, 6271], [6270, 6272, 6404], [6271, 6273], [6230, 6272, 6274], [6273, 6275], [6274, 6276, 6405], [6275, 6277], [6231, 6276, 6278], [6277, 6279], [6278, 6280, 6406], [6279, 6281], [6232, 6280, 6282], [6281, 6283], [6282, 6284, 6407], [6283, 6285], [6233, 6284, 6286], [6285, 6287], [6286, 6288, 6408], [6287, 6289], [6234, 6288, 6290], [6289, 6291], [6290, 6292, 6409], [6291, 6293], [6235, 6292, 6294], [6293, 6295], [6294, 6296, 6410], [6295, 6297], [6236, 6296, 6298], [6297, 6299], [6298, 6300, 6411], [6299, 6301], [6237, 6300, 6302], [6301, 6303], [6302, 6304, 6412], [6303, 6305], [6238, 6304, 6306], [6305, 6307], [6306, 6308, 6413], [6307, 6309], [6239, 6308, 6310], [6309, 6311], [6310, 6312, 6414], [6311, 6313], [6240, 6312, 6314], [6313, 6315], [6314, 6316, 6415], [6315, 6317], [6241, 6316, 6318], [6317, 6319], [6318, 6320, 6416], [6319, 6321], [6242, 6320, 6322], [6321, 6323], [6322, 6324, 6417], [6323, 6325], [6243, 6324, 6326], [6325, 6327], [6326, 6328, 6418], [6327, 6329], [6244, 6328, 6330], [6329, 6331], [6330, 6332, 6419], [6331, 6333], [6245, 6332, 6334], [6333, 6335], [6334, 6336, 6420], [6335, 6337], [6246, 6336, 6338], [6337, 6339], [6338, 6340, 6421], [6339, 6341], [6247, 6340, 6342], [6341, 6343], [6342, 6344, 6422], [6343, 6345], [6248, 6344, 6346], [6345, 6347], [6346, 6348, 6423], [6347, 6349], [6249, 6348, 6350], [6349, 6351], [6350, 6352, 6424], [6351, 6353], [6250, 6352, 6354], [6353, 6355], [6354, 6356, 6425], [6355, 6357], [6251, 6356, 6358], [6357, 6359], [6358, 6360, 6426], [6359, 6361], [6252, 6360, 6362], [6361, 6363], [6362, 6364, 6427], [6363, 6365], [6253, 6364, 6366], [6365, 6367], [6366, 6368, 6428], [6367, 6369], [6254, 6368, 6370], [6369, 6371], [6370, 6372, 6429], [6371, 6373], [6255, 6372, 6374], [6373, 6375], [6374, 6376, 6430], [6375, 6377], [6256, 6376, 6378], [6377, 6379], [6378, 6380, 6431], [6379, 6381], [6257, 6380, 6382], [6381, 6383], [6382, 6384, 6432], [6383, 6385], [6258, 6384, 6386], [6385, 6387], [6386, 6388, 6433], [6387, 6389], [6259, 6388, 6390], [6389, 6391], [6390, 6392, 6434], [6391, 6393], [6260, 6392, 6394], [6393, 6395], [6394, 6396, 6435], [6395, 6397], [6261, 6396, 6398], [6397, 6399], [6398, 6400, 6436], [6399, 6401], [6262, 6400], [6263, 6437], [6267, 6441], [6271, 6445], [6275, 6449], [6279, 6453], [6283, 6457], [6287, 6461], [6291, 6465], [6295, 6469], [6299, 6473], [6303, 6477], [6307, 6481], [6311, 6485], [6315, 6489], [6319, 6493], [6323, 6497], [6327, 6501], [6331, 6505], [6335, 6509], [6339, 6513], [6343, 6517], [6347, 6521], [6351, 6525], [6355, 6529], [6359, 6533], [6363, 6537], [6367, 6541], [6371, 6545], [6375, 6549], [6379, 6553], [6383, 6557], [6387, 6561], [6391, 6565], [6395, 6569], [6399, 6573], [6402, 6438], [6437, 6439], [6438, 6440, 6576], [6439, 6441], [6403, 6440, 6442], [6441, 6443], [6442, 6444, 6577], [6443, 6445], [6404, 6444, 6446], [6445, 6447], [6446, 6448, 6578], [6447, 6449], [6405, 6448, 6450], [6449, 6451], [6450, 6452, 6579], [6451, 6453], [6406, 6452, 6454], [6453, 6455], [6454, 6456, 6580], [6455, 6457], [6407, 6456, 6458], [6457, 6459], [6458, 6460, 6581], [6459, 6461], [6408, 6460, 6462], [6461, 6463], [6462, 6464, 6582], [6463, 6465], [6409, 6464, 6466], [6465, 6467], [6466, 6468, 6583], [6467, 6469], [6410, 6468, 6470], [6469, 6471], [6470, 6472, 6584], [6471, 6473], [6411, 6472, 6474], [6473, 6475], [6474, 6476, 6585], [6475, 6477], [6412, 6476, 6478], [6477, 6479], [6478, 6480, 6586], [6479, 6481], [6413, 6480, 6482], [6481, 6483], [6482, 6484, 6587], [6483, 6485], [6414, 6484, 6486], [6485, 6487], [6486, 6488, 6588], [6487, 6489], [6415, 6488, 6490], [6489, 6491], [6490, 6492, 6589], [6491, 6493], [6416, 6492, 6494], [6493, 6495], [6494, 6496, 6590], [6495, 6497], [6417, 6496, 6498], [6497, 6499], [6498, 6500, 6591], [6499, 6501], [6418, 6500, 6502], [6501, 6503], [6502, 6504, 6592], [6503, 6505], [6419, 6504, 6506], [6505, 6507], [6506, 6508, 6593], [6507, 6509], [6420, 6508, 6510], [6509, 6511], [6510, 6512, 6594], [6511, 6513], [6421, 6512, 6514], [6513, 6515], [6514, 6516, 6595], [6515, 6517], [6422, 6516, 6518], [6517, 6519], [6518, 6520, 6596], [6519, 6521], [6423, 6520, 6522], [6521, 6523], [6522, 6524, 6597], [6523, 6525], [6424, 6524, 6526], [6525, 6527], [6526, 6528, 6598], [6527, 6529], [6425, 6528, 6530], [6529, 6531], [6530, 6532, 6599], [6531, 6533], [6426, 6532, 6534], [6533, 6535], [6534, 6536, 6600], [6535, 6537], [6427, 6536, 6538], [6537, 6539], [6538, 6540, 6601], [6539, 6541], [6428, 6540, 6542], [6541, 6543], [6542, 6544, 6602], [6543, 6545], [6429, 6544, 6546], [6545, 6547], [6546, 6548, 6603], [6547, 6549], [6430, 6548, 6550], [6549, 6551], [6550, 6552, 6604], [6551, 6553], [6431, 6552, 6554], [6553, 6555], [6554, 6556, 6605], [6555, 6557], [6432, 6556, 6558], [6557, 6559], [6558, 6560, 6606], [6559, 6561], [6433, 6560, 6562], [6561, 6563], [6562, 6564, 6607], [6563, 6565], [6434, 6564, 6566], [6565, 6567], [6566, 6568, 6608], [6567, 6569], [6435, 6568, 6570], [6569, 6571], [6570, 6572, 6609], [6571, 6573], [6436, 6572, 6574], [6573, 6575], [6574, 6610], [6439, 6613], [6443, 6617], [6447, 6621], [6451, 6625], [6455, 6629], [6459, 6633], [6463, 6637], [6467, 6641], [6471, 6645], [6475, 6649], [6479, 6653], [6483, 6657], [6487, 6661], [6491, 6665], [6495, 6669], [6499, 6673], [6503, 6677], [6507, 6681], [6511, 6685], [6515, 6689], [6519, 6693], [6523, 6697], [6527, 6701], [6531, 6705], [6535, 6709], [6539, 6713], [6543, 6717], [6547, 6721], [6551, 6725], [6555, 6729], [6559, 6733], [6563, 6737], [6567, 6741], [6571, 6745], [6575, 6749], [6612, 6750], [6611, 6613], [6576, 6612, 6614], [6613, 6615], [6614, 6616, 6751], [6615, 6617], [6577, 6616, 6618], [6617, 6619], [6618, 6620, 6752], [6619, 6621], [6578, 6620, 6622], [6621, 6623], [6622, 6624, 6753], [6623, 6625], [6579, 6624, 6626], [6625, 6627], [6626, 6628, 6754], [6627, 6629], [6580, 6628, 6630], [6629, 6631], [6630, 6632, 6755], [6631, 6633], [6581, 6632, 6634], [6633, 6635], [6634, 6636, 6756], [6635, 6637], [6582, 6636, 6638], [6637, 6639], [6638, 6640, 6757], [6639, 6641], [6583, 6640, 6642], [6641, 6643], [6642, 6644, 6758], [6643, 6645], [6584, 6644, 6646], [6645, 6647], [6646, 6648, 6759], [6647, 6649], [6585, 6648, 6650], [6649, 6651], [6650, 6652, 6760], [6651, 6653], [6586, 6652, 6654], [6653, 6655], [6654, 6656, 6761], [6655, 6657], [6587, 6656, 6658], [6657, 6659], [6658, 6660, 6762], [6659, 6661], [6588, 6660, 6662], [6661, 6663], [6662, 6664, 6763], [6663, 6665], [6589, 6664, 6666], [6665, 6667], [6666, 6668, 6764], [6667, 6669], [6590, 6668, 6670], [6669, 6671], [6670, 6672, 6765], [6671, 6673], [6591, 6672, 6674], [6673, 6675], [6674, 6676, 6766], [6675, 6677], [6592, 6676, 6678], [6677, 6679], [6678, 6680, 6767], [6679, 6681], [6593, 6680, 6682], [6681, 6683], [6682, 6684, 6768], [6683, 6685], [6594, 6684, 6686], [6685, 6687], [6686, 6688, 6769], [6687, 6689], [6595, 6688, 6690], [6689, 6691], [6690, 6692, 6770], [6691, 6693], [6596, 6692, 6694], [6693, 6695], [6694, 6696, 6771], [6695, 6697], [6597, 6696, 6698], [6697, 6699], [6698, 6700, 6772], [6699, 6701], [6598, 6700, 6702], [6701, 6703], [6702, 6704, 6773], [6703, 6705], [6599, 6704, 6706], [6705, 6707], [6706, 6708, 6774], [6707, 6709], [6600, 6708, 6710], [6709, 6711], [6710, 6712, 6775], [6711, 6713], [6601, 6712, 6714], [6713, 6715], [6714, 6716, 6776], [6715, 6717], [6602, 6716, 6718], [6717, 6719], [6718, 6720, 6777], [6719, 6721], [6603, 6720, 6722], [6721, 6723], [6722, 6724, 6778], [6723, 6725], [6604, 6724, 6726], [6725, 6727], [6726, 6728, 6779], [6727, 6729], [6605, 6728, 6730], [6729, 6731], [6730, 6732, 6780], [6731, 6733], [6606, 6732, 6734], [6733, 6735], [6734, 6736, 6781], [6735, 6737], [6607, 6736, 6738], [6737, 6739], [6738, 6740, 6782], [6739, 6741], [6608, 6740, 6742], [6741, 6743], [6742, 6744, 6783], [6743, 6745], [6609, 6744, 6746], [6745, 6747], [6746, 6748, 6784], [6747, 6749], [6610, 6748], [6611, 6785], [6615, 6789], [6619, 6793], [6623, 6797], [6627, 6801], [6631, 6805], [6635, 6809], [6639, 6813], [6643, 6817], [6647, 6821], [6651, 6825], [6655, 6829], [6659, 6833], [6663, 6837], [6667, 6841], [6671, 6845], [6675, 6849], [6679, 6853], [6683, 6857], [6687, 6861], [6691, 6865], [6695, 6869], [6699, 6873], [6703, 6877], [6707, 6881], [6711, 6885], [6715, 6889], [6719, 6893], [6723, 6897], [6727, 6901], [6731, 6905], [6735, 6909], [6739, 6913], [6743, 6917], [6747, 6921], [6750, 6786], [6785, 6787], [6786, 6788, 6924], [6787, 6789], [6751, 6788, 6790], [6789, 6791], [6790, 6792, 6925], [6791, 6793], [6752, 6792, 6794], [6793, 6795], [6794, 6796, 6926], [6795, 6797], [6753, 6796, 6798], [6797, 6799], [6798, 6800, 6927], [6799, 6801], [6754, 6800, 6802], [6801, 6803], [6802, 6804, 6928], [6803, 6805], [6755, 6804, 6806], [6805, 6807], [6806, 6808, 6929], [6807, 6809], [6756, 6808, 6810], [6809, 6811], [6810, 6812, 6930], [6811, 6813], [6757, 6812, 6814], [6813, 6815], [6814, 6816, 6931], [6815, 6817], [6758, 6816, 6818], [6817, 6819], [6818, 6820, 6932], [6819, 6821], [6759, 6820, 6822], [6821, 6823], [6822, 6824, 6933], [6823, 6825], [6760, 6824, 6826], [6825, 6827], [6826, 6828, 6934], [6827, 6829], [6761, 6828, 6830], [6829, 6831], [6830, 6832, 6935], [6831, 6833], [6762, 6832, 6834], [6833, 6835], [6834, 6836, 6936], [6835, 6837], [6763, 6836, 6838], [6837, 6839], [6838, 6840, 6937], [6839, 6841], [6764, 6840, 6842], [6841, 6843], [6842, 6844, 6938], [6843, 6845], [6765, 6844, 6846], [6845, 6847], [6846, 6848, 6939], [6847, 6849], [6766, 6848, 6850], [6849, 6851], [6850, 6852, 6940], [6851, 6853], [6767, 6852, 6854], [6853, 6855], [6854, 6856, 6941], [6855, 6857], [6768, 6856, 6858], [6857, 6859], [6858, 6860, 6942], [6859, 6861], [6769, 6860, 6862], [6861, 6863], [6862, 6864, 6943], [6863, 6865], [6770, 6864, 6866], [6865, 6867], [6866, 6868, 6944], [6867, 6869], [6771, 6868, 6870], [6869, 6871], [6870, 6872, 6945], [6871, 6873], [6772, 6872, 6874], [6873, 6875], [6874, 6876, 6946], [6875, 6877], [6773, 6876, 6878], [6877, 6879], [6878, 6880, 6947], [6879, 6881], [6774, 6880, 6882], [6881, 6883], [6882, 6884, 6948], [6883, 6885], [6775, 6884, 6886], [6885, 6887], [6886, 6888, 6949], [6887, 6889], [6776, 6888, 6890], [6889, 6891], [6890, 6892, 6950], [6891, 6893], [6777, 6892, 6894], [6893, 6895], [6894, 6896, 6951], [6895, 6897], [6778, 6896, 6898], [6897, 6899], [6898, 6900, 6952], [6899, 6901], [6779, 6900, 6902], [6901, 6903], [6902, 6904, 6953], [6903, 6905], [6780, 6904, 6906], [6905, 6907], [6906, 6908, 6954], [6907, 6909], [6781, 6908, 6910], [6909, 6911], [6910, 6912, 6955], [6911, 6913], [6782, 6912, 6914], [6913, 6915], [6914, 6916, 6956], [6915, 6917], [6783, 6916, 6918], [6917, 6919], [6918, 6920, 6957], [6919, 6921], [6784, 6920, 6922], [6921, 6923], [6922, 6958], [6787, 6961], [6791, 6965], [6795, 6969], [6799, 6973], [6803, 6977], [6807, 6981], [6811, 6985], [6815, 6989], [6819, 6993], [6823, 6997], [6827, 7001], [6831, 7005], [6835, 7009], [6839, 7013], [6843, 7017], [6847, 7021], [6851, 7025], [6855, 7029], [6859, 7033], [6863, 7037], [6867, 7041], [6871, 7045], [6875, 7049], [6879, 7053], [6883, 7057], [6887, 7061], [6891, 7065], [6895, 7069], [6899, 7073], [6903, 7077], [6907, 7081], [6911, 7085], [6915, 7089], [6919, 7093], [6923, 7097], [6960, 7098], [6959, 6961], [6924, 6960, 6962], [6961, 6963], [6962, 6964, 7099], [6963, 6965], [6925, 6964, 6966], [6965, 6967], [6966, 6968, 7100], [6967, 6969], [6926, 6968, 6970], [6969, 6971], [6970, 6972, 7101], [6971, 6973], [6927, 6972, 6974], [6973, 6975], [6974, 6976, 7102], [6975, 6977], [6928, 6976, 6978], [6977, 6979], [6978, 6980, 7103], [6979, 6981], [6929, 6980, 6982], [6981, 6983], [6982, 6984, 7104], [6983, 6985], [6930, 6984, 6986], [6985, 6987], [6986, 6988, 7105], [6987, 6989], [6931, 6988, 6990], [6989, 6991], [6990, 6992, 7106], [6991, 6993], [6932, 6992, 6994], [6993, 6995], [6994, 6996, 7107], [6995, 6997], [6933, 6996, 6998], [6997, 6999], [6998, 7000, 7108], [6999, 7001], [6934, 7000, 7002], [7001, 7003], [7002, 7004, 7109], [7003, 7005], [6935, 7004, 7006], [7005, 7007], [7006, 7008, 7110], [7007, 7009], [6936, 7008, 7010], [7009, 7011], [7010, 7012, 7111], [7011, 7013], [6937, 7012, 7014], [7013, 7015], [7014, 7016, 7112], [7015, 7017], [6938, 7016, 7018], [7017, 7019], [7018, 7020, 7113], [7019, 7021], [6939, 7020, 7022], [7021, 7023], [7022, 7024, 7114], [7023, 7025], [6940, 7024, 7026], [7025, 7027], [7026, 7028, 7115], [7027, 7029], [6941, 7028, 7030], [7029, 7031], [7030, 7032, 7116], [7031, 7033], [6942, 7032, 7034], [7033, 7035], [7034, 7036, 7117], [7035, 7037], [6943, 7036, 7038], [7037, 7039], [7038, 7040, 7118], [7039, 7041], [6944, 7040, 7042], [7041, 7043], [7042, 7044, 7119], [7043, 7045], [6945, 7044, 7046], [7045, 7047], [7046, 7048, 7120], [7047, 7049], [6946, 7048, 7050], [7049, 7051], [7050, 7052, 7121], [7051, 7053], [6947, 7052, 7054], [7053, 7055], [7054, 7056, 7122], [7055, 7057], [6948, 7056, 7058], [7057, 7059], [7058, 7060, 7123], [7059, 7061], [6949, 7060, 7062], [7061, 7063], [7062, 7064, 7124], [7063, 7065], [6950, 7064, 7066], [7065, 7067], [7066, 7068, 7125], [7067, 7069], [6951, 7068, 7070], [7069, 7071], [7070, 7072, 7126], [7071, 7073], [6952, 7072, 7074], [7073, 7075], [7074, 7076, 7127], [7075, 7077], [6953, 7076, 7078], [7077, 7079], [7078, 7080, 7128], [7079, 7081], [6954, 7080, 7082], [7081, 7083], [7082, 7084, 7129], [7083, 7085], [6955, 7084, 7086], [7085, 7087], [7086, 7088, 7130], [7087, 7089], [6956, 7088, 7090], [7089, 7091], [7090, 7092, 7131], [7091, 7093], [6957, 7092, 7094], [7093, 7095], [7094, 7096, 7132], [7095, 7097], [6958, 7096], [6959, 7133], [6963, 7137], [6967, 7141], [6971, 7145], [6975, 7149], [6979, 7153], [6983, 7157], [6987, 7161], [6991, 7165], [6995, 7169], [6999, 7173], [7003, 7177], [7007, 7181], [7011, 7185], [7015, 7189], [7019, 7193], [7023, 7197], [7027, 7201], [7031, 7205], [7035, 7209], [7039, 7213], [7043, 7217], [7047, 7221], [7051, 7225], [7055, 7229], [7059, 7233], [7063, 7237], [7067, 7241], [7071, 7245], [7075, 7249], [7079, 7253], [7083, 7257], [7087, 7261], [7091, 7265], [7095, 7269], [7098, 7134], [7133, 7135], [7134, 7136, 7272], [7135, 7137], [7099, 7136, 7138], [7137, 7139], [7138, 7140, 7273], [7139, 7141], [7100, 7140, 7142], [7141, 7143], [7142, 7144, 7274], [7143, 7145], [7101, 7144, 7146], [7145, 7147], [7146, 7148, 7275], [7147, 7149], [7102, 7148, 7150], [7149, 7151], [7150, 7152, 7276], [7151, 7153], [7103, 7152, 7154], [7153, 7155], [7154, 7156, 7277], [7155, 7157], [7104, 7156, 7158], [7157, 7159], [7158, 7160, 7278], [7159, 7161], [7105, 7160, 7162], [7161, 7163], [7162, 7164, 7279], [7163, 7165], [7106, 7164, 7166], [7165, 7167], [7166, 7168, 7280], [7167, 7169], [7107, 7168, 7170], [7169, 7171], [7170, 7172, 7281], [7171, 7173], [7108, 7172, 7174], [7173, 7175], [7174, 7176, 7282], [7175, 7177], [7109, 7176, 7178], [7177, 7179], [7178, 7180, 7283], [7179, 7181], [7110, 7180, 7182], [7181, 7183], [7182, 7184, 7284], [7183, 7185], [7111, 7184, 7186], [7185, 7187], [7186, 7188, 7285], [7187, 7189], [7112, 7188, 7190], [7189, 7191], [7190, 7192, 7286], [7191, 7193], [7113, 7192, 7194], [7193, 7195], [7194, 7196, 7287], [7195, 7197], [7114, 7196, 7198], [7197, 7199], [7198, 7200, 7288], [7199, 7201], [7115, 7200, 7202], [7201, 7203], [7202, 7204, 7289], [7203, 7205], [7116, 7204, 7206], [7205, 7207], [7206, 7208, 7290], [7207, 7209], [7117, 7208, 7210], [7209, 7211], [7210, 7212, 7291], [7211, 7213], [7118, 7212, 7214], [7213, 7215], [7214, 7216, 7292], [7215, 7217], [7119, 7216, 7218], [7217, 7219], [7218, 7220, 7293], [7219, 7221], [7120, 7220, 7222], [7221, 7223], [7222, 7224, 7294], [7223, 7225], [7121, 7224, 7226], [7225, 7227], [7226, 7228, 7295], [7227, 7229], [7122, 7228, 7230], [7229, 7231], [7230, 7232, 7296], [7231, 7233], [7123, 7232, 7234], [7233, 7235], [7234, 7236, 7297], [7235, 7237], [7124, 7236, 7238], [7237, 7239], [7238, 7240, 7298], [7239, 7241], [7125, 7240, 7242], [7241, 7243], [7242, 7244, 7299], [7243, 7245], [7126, 7244, 7246], [7245, 7247], [7246, 7248, 7300], [7247, 7249], [7127, 7248, 7250], [7249, 7251], [7250, 7252, 7301], [7251, 7253], [7128, 7252, 7254], [7253, 7255], [7254, 7256, 7302], [7255, 7257], [7129, 7256, 7258], [7257, 7259], [7258, 7260, 7303], [7259, 7261], [7130, 7260, 7262], [7261, 7263], [7262, 7264, 7304], [7263, 7265], [7131, 7264, 7266], [7265, 7267], [7266, 7268, 7305], [7267, 7269], [7132, 7268, 7270], [7269, 7271], [7270, 7306], [7135, 7309], [7139, 7313], [7143, 7317], [7147, 7321], [7151, 7325], [7155, 7329], [7159, 7333], [7163, 7337], [7167, 7341], [7171, 7345], [7175, 7349], [7179, 7353], [7183, 7357], [7187, 7361], [7191, 7365], [7195, 7369], [7199, 7373], [7203, 7377], [7207, 7381], [7211, 7385], [7215, 7389], [7219, 7393], [7223, 7397], [7227, 7401], [7231, 7405], [7235, 7409], [7239, 7413], [7243, 7417], [7247, 7421], [7251, 7425], [7255, 7429], [7259, 7433], [7263, 7437], [7267, 7441], [7271, 7445], [7308, 7446], [7307, 7309], [7272, 7308, 7310], [7309, 7311], [7310, 7312, 7447], [7311, 7313], [7273, 7312, 7314], [7313, 7315], [7314, 7316, 7448], [7315, 7317], [7274, 7316, 7318], [7317, 7319], [7318, 7320, 7449], [7319, 7321], [7275, 7320, 7322], [7321, 7323], [7322, 7324, 7450], [7323, 7325], [7276, 7324, 7326], [7325, 7327], [7326, 7328, 7451], [7327, 7329], [7277, 7328, 7330], [7329, 7331], [7330, 7332, 7452], [7331, 7333], [7278, 7332, 7334], [7333, 7335], [7334, 7336, 7453], [7335, 7337], [7279, 7336, 7338], [7337, 7339], [7338, 7340, 7454], [7339, 7341], [7280, 7340, 7342], [7341, 7343], [7342, 7344, 7455], [7343, 7345], [7281, 7344, 7346], [7345, 7347], [7346, 7348, 7456], [7347, 7349], [7282, 7348, 7350], [7349, 7351], [7350, 7352, 7457], [7351, 7353], [7283, 7352, 7354], [7353, 7355], [7354, 7356, 7458], [7355, 7357], [7284, 7356, 7358], [7357, 7359], [7358, 7360, 7459], [7359, 7361], [7285, 7360, 7362], [7361, 7363], [7362, 7364, 7460], [7363, 7365], [7286, 7364, 7366], [7365, 7367], [7366, 7368, 7461], [7367, 7369], [7287, 7368, 7370], [7369, 7371], [7370, 7372, 7462], [7371, 7373], [7288, 7372, 7374], [7373, 7375], [7374, 7376, 7463], [7375, 7377], [7289, 7376, 7378], [7377, 7379], [7378, 7380, 7464], [7379, 7381], [7290, 7380, 7382], [7381, 7383], [7382, 7384, 7465], [7383, 7385], [7291, 7384, 7386], [7385, 7387], [7386, 7388, 7466], [7387, 7389], [7292, 7388, 7390], [7389, 7391], [7390, 7392, 7467], [7391, 7393], [7293, 7392, 7394], [7393, 7395], [7394, 7396, 7468], [7395, 7397], [7294, 7396, 7398], [7397, 7399], [7398, 7400, 7469], [7399, 7401], [7295, 7400, 7402], [7401, 7403], [7402, 7404, 7470], [7403, 7405], [7296, 7404, 7406], [7405, 7407], [7406, 7408, 7471], [7407, 7409], [7297, 7408, 7410], [7409, 7411], [7410, 7412, 7472], [7411, 7413], [7298, 7412, 7414], [7413, 7415], [7414, 7416, 7473], [7415, 7417], [7299, 7416, 7418], [7417, 7419], [7418, 7420, 7474], [7419, 7421], [7300, 7420, 7422], [7421, 7423], [7422, 7424, 7475], [7423, 7425], [7301, 7424, 7426], [7425, 7427], [7426, 7428, 7476], [7427, 7429], [7302, 7428, 7430], [7429, 7431], [7430, 7432, 7477], [7431, 7433], [7303, 7432, 7434], [7433, 7435], [7434, 7436, 7478], [7435, 7437], [7304, 7436, 7438], [7437, 7439], [7438, 7440, 7479], [7439, 7441], [7305, 7440, 7442], [7441, 7443], [7442, 7444, 7480], [7443, 7445], [7306, 7444], [7307, 7481], [7311, 7485], [7315, 7489], [7319, 7493], [7323, 7497], [7327, 7501], [7331, 7505], [7335, 7509], [7339, 7513], [7343, 7517], [7347, 7521], [7351, 7525], [7355, 7529], [7359, 7533], [7363, 7537], [7367, 7541], [7371, 7545], [7375, 7549], [7379, 7553], [7383, 7557], [7387, 7561], [7391, 7565], [7395, 7569], [7399, 7573], [7403, 7577], [7407, 7581], [7411, 7585], [7415, 7589], [7419, 7593], [7423, 7597], [7427, 7601], [7431, 7605], [7435, 7609], [7439, 7613], [7443, 7617], [7446, 7482], [7481, 7483], [7482, 7484, 7620], [7483, 7485], [7447, 7484, 7486], [7485, 7487], [7486, 7488, 7621], [7487, 7489], [7448, 7488, 7490], [7489, 7491], [7490, 7492, 7622], [7491, 7493], [7449, 7492, 7494], [7493, 7495], [7494, 7496, 7623], [7495, 7497], [7450, 7496, 7498], [7497, 7499], [7498, 7500, 7624], [7499, 7501], [7451, 7500, 7502], [7501, 7503], [7502, 7504, 7625], [7503, 7505], [7452, 7504, 7506], [7505, 7507], [7506, 7508, 7626], [7507, 7509], [7453, 7508, 7510], [7509, 7511], [7510, 7512, 7627], [7511, 7513], [7454, 7512, 7514], [7513, 7515], [7514, 7516, 7628], [7515, 7517], [7455, 7516, 7518], [7517, 7519], [7518, 7520, 7629], [7519, 7521], [7456, 7520, 7522], [7521, 7523], [7522, 7524, 7630], [7523, 7525], [7457, 7524, 7526], [7525, 7527], [7526, 7528, 7631], [7527, 7529], [7458, 7528, 7530], [7529, 7531], [7530, 7532, 7632], [7531, 7533], [7459, 7532, 7534], [7533, 7535], [7534, 7536, 7633], [7535, 7537], [7460, 7536, 7538], [7537, 7539], [7538, 7540, 7634], [7539, 7541], [7461, 7540, 7542], [7541, 7543], [7542, 7544, 7635], [7543, 7545], [7462, 7544, 7546], [7545, 7547], [7546, 7548, 7636], [7547, 7549], [7463, 7548, 7550], [7549, 7551], [7550, 7552, 7637], [7551, 7553], [7464, 7552, 7554], [7553, 7555], [7554, 7556, 7638], [7555, 7557], [7465, 7556, 7558], [7557, 7559], [7558, 7560, 7639], [7559, 7561], [7466, 7560, 7562], [7561, 7563], [7562, 7564, 7640], [7563, 7565], [7467, 7564, 7566], [7565, 7567], [7566, 7568, 7641], [7567, 7569], [7468, 7568, 7570], [7569, 7571], [7570, 7572, 7642], [7571, 7573], [7469, 7572, 7574], [7573, 7575], [7574, 7576, 7643], [7575, 7577], [7470, 7576, 7578], [7577, 7579], [7578, 7580, 7644], [7579, 7581], [7471, 7580, 7582], [7581, 7583], [7582, 7584, 7645], [7583, 7585], [7472, 7584, 7586], [7585, 7587], [7586, 7588, 7646], [7587, 7589], [7473, 7588, 7590], [7589, 7591], [7590, 7592, 7647], [7591, 7593], [7474, 7592, 7594], [7593, 7595], [7594, 7596, 7648], [7595, 7597], [7475, 7596, 7598], [7597, 7599], [7598, 7600, 7649], [7599, 7601], [7476, 7600, 7602], [7601, 7603], [7602, 7604, 7650], [7603, 7605], [7477, 7604, 7606], [7605, 7607], [7606, 7608, 7651], [7607, 7609], [7478, 7608, 7610], [7609, 7611], [7610, 7612, 7652], [7611, 7613], [7479, 7612, 7614], [7613, 7615], [7614, 7616, 7653], [7615, 7617], [7480, 7616, 7618], [7617, 7619], [7618, 7654], [7483, 7657], [7487, 7661], [7491, 7665], [7495, 7669], [7499, 7673], [7503, 7677], [7507, 7681], [7511, 7685], [7515, 7689], [7519, 7693], [7523, 7697], [7527, 7701], [7531, 7705], [7535, 7709], [7539, 7713], [7543, 7717], [7547, 7721], [7551, 7725], [7555, 7729], [7559, 7733], [7563, 7737], [7567, 7741], [7571, 7745], [7575, 7749], [7579, 7753], [7583, 7757], [7587, 7761], [7591, 7765], [7595, 7769], [7599, 7773], [7603, 7777], [7607, 7781], [7611, 7785], [7615, 7789], [7619, 7793], [7656, 7794], [7655, 7657], [7620, 7656, 7658], [7657, 7659], [7658, 7660, 7795], [7659, 7661], [7621, 7660, 7662], [7661, 7663], [7662, 7664, 7796], [7663, 7665], [7622, 7664, 7666], [7665, 7667], [7666, 7668, 7797], [7667, 7669], [7623, 7668, 7670], [7669, 7671], [7670, 7672, 7798], [7671, 7673], [7624, 7672, 7674], [7673, 7675], [7674, 7676, 7799], [7675, 7677], [7625, 7676, 7678], [7677, 7679], [7678, 7680, 7800], [7679, 7681], [7626, 7680, 7682], [7681, 7683], [7682, 7684, 7801], [7683, 7685], [7627, 7684, 7686], [7685, 7687], [7686, 7688, 7802], [7687, 7689], [7628, 7688, 7690], [7689, 7691], [7690, 7692, 7803], [7691, 7693], [7629, 7692, 7694], [7693, 7695], [7694, 7696, 7804], [7695, 7697], [7630, 7696, 7698], [7697, 7699], [7698, 7700, 7805], [7699, 7701], [7631, 7700, 7702], [7701, 7703], [7702, 7704, 7806], [7703, 7705], [7632, 7704, 7706], [7705, 7707], [7706, 7708, 7807], [7707, 7709], [7633, 7708, 7710], [7709, 7711], [7710, 7712, 7808], [7711, 7713], [7634, 7712, 7714], [7713, 7715], [7714, 7716, 7809], [7715, 7717], [7635, 7716, 7718], [7717, 7719], [7718, 7720, 7810], [7719, 7721], [7636, 7720, 7722], [7721, 7723], [7722, 7724, 7811], [7723, 7725], [7637, 7724, 7726], [7725, 7727], [7726, 7728, 7812], [7727, 7729], [7638, 7728, 7730], [7729, 7731], [7730, 7732, 7813], [7731, 7733], [7639, 7732, 7734], [7733, 7735], [7734, 7736, 7814], [7735, 7737], [7640, 7736, 7738], [7737, 7739], [7738, 7740, 7815], [7739, 7741], [7641, 7740, 7742], [7741, 7743], [7742, 7744, 7816], [7743, 7745], [7642, 7744, 7746], [7745, 7747], [7746, 7748, 7817], [7747, 7749], [7643, 7748, 7750], [7749, 7751], [7750, 7752, 7818], [7751, 7753], [7644, 7752, 7754], [7753, 7755], [7754, 7756, 7819], [7755, 7757], [7645, 7756, 7758], [7757, 7759], [7758, 7760, 7820], [7759, 7761], [7646, 7760, 7762], [7761, 7763], [7762, 7764, 7821], [7763, 7765], [7647, 7764, 7766], [7765, 7767], [7766, 7768, 7822], [7767, 7769], [7648, 7768, 7770], [7769, 7771], [7770, 7772, 7823], [7771, 7773], [7649, 7772, 7774], [7773, 7775], [7774, 7776, 7824], [7775, 7777], [7650, 7776, 7778], [7777, 7779], [7778, 7780, 7825], [7779, 7781], [7651, 7780, 7782], [7781, 7783], [7782, 7784, 7826], [7783, 7785], [7652, 7784, 7786], [7785, 7787], [7786, 7788, 7827], [7787, 7789], [7653, 7788, 7790], [7789, 7791], [7790, 7792, 7828], [7791, 7793], [7654, 7792], [7655, 7829], [7659, 7833], [7663, 7837], [7667, 7841], [7671, 7845], [7675, 7849], [7679, 7853], [7683, 7857], [7687, 7861], [7691, 7865], [7695, 7869], [7699, 7873], [7703, 7877], [7707, 7881], [7711, 7885], [7715, 7889], [7719, 7893], [7723, 7897], [7727, 7901], [7731, 7905], [7735, 7909], [7739, 7913], [7743, 7917], [7747, 7921], [7751, 7925], [7755, 7929], [7759, 7933], [7763, 7937], [7767, 7941], [7771, 7945], [7775, 7949], [7779, 7953], [7783, 7957], [7787, 7961], [7791, 7965], [7794, 7830], [7829, 7831], [7830, 7832, 7968], [7831, 7833], [7795, 7832, 7834], [7833, 7835], [7834, 7836, 7969], [7835, 7837], [7796, 7836, 7838], [7837, 7839], [7838, 7840, 7970], [7839, 7841], [7797, 7840, 7842], [7841, 7843], [7842, 7844, 7971], [7843, 7845], [7798, 7844, 7846], [7845, 7847], [7846, 7848, 7972], [7847, 7849], [7799, 7848, 7850], [7849, 7851], [7850, 7852, 7973], [7851, 7853], [7800, 7852, 7854], [7853, 7855], [7854, 7856, 7974], [7855, 7857], [7801, 7856, 7858], [7857, 7859], [7858, 7860, 7975], [7859, 7861], [7802, 7860, 7862], [7861, 7863], [7862, 7864, 7976], [7863, 7865], [7803, 7864, 7866], [7865, 7867], [7866, 7868, 7977], [7867, 7869], [7804, 7868, 7870], [7869, 7871], [7870, 7872, 7978], [7871, 7873], [7805, 7872, 7874], [7873, 7875], [7874, 7876, 7979], [7875, 7877], [7806, 7876, 7878], [7877, 7879], [7878, 7880, 7980], [7879, 7881], [7807, 7880, 7882], [7881, 7883], [7882, 7884, 7981], [7883, 7885], [7808, 7884, 7886], [7885, 7887], [7886, 7888, 7982], [7887, 7889], [7809, 7888, 7890], [7889, 7891], [7890, 7892, 7983], [7891, 7893], [7810, 7892, 7894], [7893, 7895], [7894, 7896, 7984], [7895, 7897], [7811, 7896, 7898], [7897, 7899], [7898, 7900, 7985], [7899, 7901], [7812, 7900, 7902], [7901, 7903], [7902, 7904, 7986], [7903, 7905], [7813, 7904, 7906], [7905, 7907], [7906, 7908, 7987], [7907, 7909], [7814, 7908, 7910], [7909, 7911], [7910, 7912, 7988], [7911, 7913], [7815, 7912, 7914], [7913, 7915], [7914, 7916, 7989], [7915, 7917], [7816, 7916, 7918], [7917, 7919], [7918, 7920, 7990], [7919, 7921], [7817, 7920, 7922], [7921, 7923], [7922, 7924, 7991], [7923, 7925], [7818, 7924, 7926], [7925, 7927], [7926, 7928, 7992], [7927, 7929], [7819, 7928, 7930], [7929, 7931], [7930, 7932, 7993], [7931, 7933], [7820, 7932, 7934], [7933, 7935], [7934, 7936, 7994], [7935, 7937], [7821, 7936, 7938], [7937, 7939], [7938, 7940, 7995], [7939, 7941], [7822, 7940, 7942], [7941, 7943], [7942, 7944, 7996], [7943, 7945], [7823, 7944, 7946], [7945, 7947], [7946, 7948, 7997], [7947, 7949], [7824, 7948, 7950], [7949, 7951], [7950, 7952, 7998], [7951, 7953], [7825, 7952, 7954], [7953, 7955], [7954, 7956, 7999], [7955, 7957], [7826, 7956, 7958], [7957, 7959], [7958, 7960, 8000], [7959, 7961], [7827, 7960, 7962], [7961, 7963], [7962, 7964, 8001], [7963, 7965], [7828, 7964, 7966], [7965, 7967], [7966, 8002], [7831, 8005], [7835, 8009], [7839, 8013], [7843, 8017], [7847, 8021], [7851, 8025], [7855, 8029], [7859, 8033], [7863, 8037], [7867, 8041], [7871, 8045], [7875, 8049], [7879, 8053], [7883, 8057], [7887, 8061], [7891, 8065], [7895, 8069], [7899, 8073], [7903, 8077], [7907, 8081], [7911, 8085], [7915, 8089], [7919, 8093], [7923, 8097], [7927, 8101], [7931, 8105], [7935, 8109], [7939, 8113], [7943, 8117], [7947, 8121], [7951, 8125], [7955, 8129], [7959, 8133], [7963, 8137], [7967, 8141], [8004, 8142], [8003, 8005], [7968, 8004, 8006], [8005, 8007], [8006, 8008, 8143], [8007, 8009], [7969, 8008, 8010], [8009, 8011], [8010, 8012, 8144], [8011, 8013], [7970, 8012, 8014], [8013, 8015], [8014, 8016, 8145], [8015, 8017], [7971, 8016, 8018], [8017, 8019], [8018, 8020, 8146], [8019, 8021], [7972, 8020, 8022], [8021, 8023], [8022, 8024, 8147], [8023, 8025], [7973, 8024, 8026], [8025, 8027], [8026, 8028, 8148], [8027, 8029], [7974, 8028, 8030], [8029, 8031], [8030, 8032, 8149], [8031, 8033], [7975, 8032, 8034], [8033, 8035], [8034, 8036, 8150], [8035, 8037], [7976, 8036, 8038], [8037, 8039], [8038, 8040, 8151], [8039, 8041], [7977, 8040, 8042], [8041, 8043], [8042, 8044, 8152], [8043, 8045], [7978, 8044, 8046], [8045, 8047], [8046, 8048, 8153], [8047, 8049], [7979, 8048, 8050], [8049, 8051], [8050, 8052, 8154], [8051, 8053], [7980, 8052, 8054], [8053, 8055], [8054, 8056, 8155], [8055, 8057], [7981, 8056, 8058], [8057, 8059], [8058, 8060, 8156], [8059, 8061], [7982, 8060, 8062], [8061, 8063], [8062, 8064, 8157], [8063, 8065], [7983, 8064, 8066], [8065, 8067], [8066, 8068, 8158], [8067, 8069], [7984, 8068, 8070], [8069, 8071], [8070, 8072, 8159], [8071, 8073], [7985, 8072, 8074], [8073, 8075], [8074, 8076, 8160], [8075, 8077], [7986, 8076, 8078], [8077, 8079], [8078, 8080, 8161], [8079, 8081], [7987, 8080, 8082], [8081, 8083], [8082, 8084, 8162], [8083, 8085], [7988, 8084, 8086], [8085, 8087], [8086, 8088, 8163], [8087, 8089], [7989, 8088, 8090], [8089, 8091], [8090, 8092, 8164], [8091, 8093], [7990, 8092, 8094], [8093, 8095], [8094, 8096, 8165], [8095, 8097], [7991, 8096, 8098], [8097, 8099], [8098, 8100, 8166], [8099, 8101], [7992, 8100, 8102], [8101, 8103], [8102, 8104, 8167], [8103, 8105], [7993, 8104, 8106], [8105, 8107], [8106, 8108, 8168], [8107, 8109], [7994, 8108, 8110], [8109, 8111], [8110, 8112, 8169], [8111, 8113], [7995, 8112, 8114], [8113, 8115], [8114, 8116, 8170], [8115, 8117], [7996, 8116, 8118], [8117, 8119], [8118, 8120, 8171], [8119, 8121], [7997, 8120, 8122], [8121, 8123], [8122, 8124, 8172], [8123, 8125], [7998, 8124, 8126], [8125, 8127], [8126, 8128, 8173], [8127, 8129], [7999, 8128, 8130], [8129, 8131], [8130, 8132, 8174], [8131, 8133], [8000, 8132, 8134], [8133, 8135], [8134, 8136, 8175], [8135, 8137], [8001, 8136, 8138], [8137, 8139], [8138, 8140, 8176], [8139, 8141], [8002, 8140], [8003, 8177], [8007, 8181], [8011, 8185], [8015, 8189], [8019, 8193], [8023, 8197], [8027, 8201], [8031, 8205], [8035, 8209], [8039, 8213], [8043, 8217], [8047, 8221], [8051, 8225], [8055, 8229], [8059, 8233], [8063, 8237], [8067, 8241], [8071, 8245], [8075, 8249], [8079, 8253], [8083, 8257], [8087, 8261], [8091, 8265], [8095, 8269], [8099, 8273], [8103, 8277], [8107, 8281], [8111, 8285], [8115, 8289], [8119, 8293], [8123, 8297], [8127, 8301], [8131, 8305], [8135, 8309], [8139, 8313], [8142, 8178], [8177, 8179], [8178, 8180, 8316], [8179, 8181], [8143, 8180, 8182], [8181, 8183], [8182, 8184, 8317], [8183, 8185], [8144, 8184, 8186], [8185, 8187], [8186, 8188, 8318], [8187, 8189], [8145, 8188, 8190], [8189, 8191], [8190, 8192, 8319], [8191, 8193], [8146, 8192, 8194], [8193, 8195], [8194, 8196, 8320], [8195, 8197], [8147, 8196, 8198], [8197, 8199], [8198, 8200, 8321], [8199, 8201], [8148, 8200, 8202], [8201, 8203], [8202, 8204, 8322], [8203, 8205], [8149, 8204, 8206], [8205, 8207], [8206, 8208, 8323], [8207, 8209], [8150, 8208, 8210], [8209, 8211], [8210, 8212, 8324], [8211, 8213], [8151, 8212, 8214], [8213, 8215], [8214, 8216, 8325], [8215, 8217], [8152, 8216, 8218], [8217, 8219], [8218, 8220, 8326], [8219, 8221], [8153, 8220, 8222], [8221, 8223], [8222, 8224, 8327], [8223, 8225], [8154, 8224, 8226], [8225, 8227], [8226, 8228, 8328], [8227, 8229], [8155, 8228, 8230], [8229, 8231], [8230, 8232, 8329], [8231, 8233], [8156, 8232, 8234], [8233, 8235], [8234, 8236, 8330], [8235, 8237], [8157, 8236, 8238], [8237, 8239], [8238, 8240, 8331], [8239, 8241], [8158, 8240, 8242], [8241, 8243], [8242, 8244, 8332], [8243, 8245], [8159, 8244, 8246], [8245, 8247], [8246, 8248, 8333], [8247, 8249], [8160, 8248, 8250], [8249, 8251], [8250, 8252, 8334], [8251, 8253], [8161, 8252, 8254], [8253, 8255], [8254, 8256, 8335], [8255, 8257], [8162, 8256, 8258], [8257, 8259], [8258, 8260, 8336], [8259, 8261], [8163, 8260, 8262], [8261, 8263], [8262, 8264, 8337], [8263, 8265], [8164, 8264, 8266], [8265, 8267], [8266, 8268, 8338], [8267, 8269], [8165, 8268, 8270], [8269, 8271], [8270, 8272, 8339], [8271, 8273], [8166, 8272, 8274], [8273, 8275], [8274, 8276, 8340], [8275, 8277], [8167, 8276, 8278], [8277, 8279], [8278, 8280, 8341], [8279, 8281], [8168, 8280, 8282], [8281, 8283], [8282, 8284, 8342], [8283, 8285], [8169, 8284, 8286], [8285, 8287], [8286, 8288, 8343], [8287, 8289], [8170, 8288, 8290], [8289, 8291], [8290, 8292, 8344], [8291, 8293], [8171, 8292, 8294], [8293, 8295], [8294, 8296, 8345], [8295, 8297], [8172, 8296, 8298], [8297, 8299], [8298, 8300, 8346], [8299, 8301], [8173, 8300, 8302], [8301, 8303], [8302, 8304, 8347], [8303, 8305], [8174, 8304, 8306], [8305, 8307], [8306, 8308, 8348], [8307, 8309], [8175, 8308, 8310], [8309, 8311], [8310, 8312, 8349], [8311, 8313], [8176, 8312, 8314], [8313, 8315], [8314, 8350], [8179, 8353], [8183, 8357], [8187, 8361], [8191, 8365], [8195, 8369], [8199, 8373], [8203, 8377], [8207, 8381], [8211, 8385], [8215, 8389], [8219, 8393], [8223, 8397], [8227, 8401], [8231, 8405], [8235, 8409], [8239, 8413], [8243, 8417], [8247, 8421], [8251, 8425], [8255, 8429], [8259, 8433], [8263, 8437], [8267, 8441], [8271, 8445], [8275, 8449], [8279, 8453], [8283, 8457], [8287, 8461], [8291, 8465], [8295, 8469], [8299, 8473], [8303, 8477], [8307, 8481], [8311, 8485], [8315, 8489], [8352, 8490], [8351, 8353], [8316, 8352, 8354], [8353, 8355], [8354, 8356, 8491], [8355, 8357], [8317, 8356, 8358], [8357, 8359], [8358, 8360, 8492], [8359, 8361], [8318, 8360, 8362], [8361, 8363], [8362, 8364, 8493], [8363, 8365], [8319, 8364, 8366], [8365, 8367], [8366, 8368, 8494], [8367, 8369], [8320, 8368, 8370], [8369, 8371], [8370, 8372, 8495], [8371, 8373], [8321, 8372, 8374], [8373, 8375], [8374, 8376, 8496], [8375, 8377], [8322, 8376, 8378], [8377, 8379], [8378, 8380, 8497], [8379, 8381], [8323, 8380, 8382], [8381, 8383], [8382, 8384, 8498], [8383, 8385], [8324, 8384, 8386], [8385, 8387], [8386, 8388, 8499], [8387, 8389], [8325, 8388, 8390], [8389, 8391], [8390, 8392, 8500], [8391, 8393], [8326, 8392, 8394], [8393, 8395], [8394, 8396, 8501], [8395, 8397], [8327, 8396, 8398], [8397, 8399], [8398, 8400, 8502], [8399, 8401], [8328, 8400, 8402], [8401, 8403], [8402, 8404, 8503], [8403, 8405], [8329, 8404, 8406], [8405, 8407], [8406, 8408, 8504], [8407, 8409], [8330, 8408, 8410], [8409, 8411], [8410, 8412, 8505], [8411, 8413], [8331, 8412, 8414], [8413, 8415], [8414, 8416, 8506], [8415, 8417], [8332, 8416, 8418], [8417, 8419], [8418, 8420, 8507], [8419, 8421], [8333, 8420, 8422], [8421, 8423], [8422, 8424, 8508], [8423, 8425], [8334, 8424, 8426], [8425, 8427], [8426, 8428, 8509], [8427, 8429], [8335, 8428, 8430], [8429, 8431], [8430, 8432, 8510], [8431, 8433], [8336, 8432, 8434], [8433, 8435], [8434, 8436, 8511], [8435, 8437], [8337, 8436, 8438], [8437, 8439], [8438, 8440, 8512], [8439, 8441], [8338, 8440, 8442], [8441, 8443], [8442, 8444, 8513], [8443, 8445], [8339, 8444, 8446], [8445, 8447], [8446, 8448, 8514], [8447, 8449], [8340, 8448, 8450], [8449, 8451], [8450, 8452, 8515], [8451, 8453], [8341, 8452, 8454], [8453, 8455], [8454, 8456, 8516], [8455, 8457], [8342, 8456, 8458], [8457, 8459], [8458, 8460, 8517], [8459, 8461], [8343, 8460, 8462], [8461, 8463], [8462, 8464, 8518], [8463, 8465], [8344, 8464, 8466], [8465, 8467], [8466, 8468, 8519], [8467, 8469], [8345, 8468, 8470], [8469, 8471], [8470, 8472, 8520], [8471, 8473], [8346, 8472, 8474], [8473, 8475], [8474, 8476, 8521], [8475, 8477], [8347, 8476, 8478], [8477, 8479], [8478, 8480, 8522], [8479, 8481], [8348, 8480, 8482], [8481, 8483], [8482, 8484, 8523], [8483, 8485], [8349, 8484, 8486], [8485, 8487], [8486, 8488, 8524], [8487, 8489], [8350, 8488], [8351, 8525], [8355, 8529], [8359, 8533], [8363, 8537], [8367, 8541], [8371, 8545], [8375, 8549], [8379, 8553], [8383, 8557], [8387, 8561], [8391, 8565], [8395, 8569], [8399, 8573], [8403, 8577], [8407, 8581], [8411, 8585], [8415, 8589], [8419, 8593], [8423, 8597], [8427, 8601], [8431, 8605], [8435, 8609], [8439, 8613], [8443, 8617], [8447, 8621], [8451, 8625], [8455, 8629], [8459, 8633], [8463, 8637], [8467, 8641], [8471, 8645], [8475, 8649], [8479, 8653], [8483, 8657], [8487, 8661], [8490, 8526], [8525, 8527], [8526, 8528, 8664], [8527, 8529], [8491, 8528, 8530], [8529, 8531], [8530, 8532, 8665], [8531, 8533], [8492, 8532, 8534], [8533, 8535], [8534, 8536, 8666], [8535, 8537], [8493, 8536, 8538], [8537, 8539], [8538, 8540, 8667], [8539, 8541], [8494, 8540, 8542], [8541, 8543], [8542, 8544, 8668], [8543, 8545], [8495, 8544, 8546], [8545, 8547], [8546, 8548, 8669], [8547, 8549], [8496, 8548, 8550], [8549, 8551], [8550, 8552, 8670], [8551, 8553], [8497, 8552, 8554], [8553, 8555], [8554, 8556, 8671], [8555, 8557], [8498, 8556, 8558], [8557, 8559], [8558, 8560, 8672], [8559, 8561], [8499, 8560, 8562], [8561, 8563], [8562, 8564, 8673], [8563, 8565], [8500, 8564, 8566], [8565, 8567], [8566, 8568, 8674], [8567, 8569], [8501, 8568, 8570], [8569, 8571], [8570, 8572, 8675], [8571, 8573], [8502, 8572, 8574], [8573, 8575], [8574, 8576, 8676], [8575, 8577], [8503, 8576, 8578], [8577, 8579], [8578, 8580, 8677], [8579, 8581], [8504, 8580, 8582], [8581, 8583], [8582, 8584, 8678], [8583, 8585], [8505, 8584, 8586], [8585, 8587], [8586, 8588, 8679], [8587, 8589], [8506, 8588, 8590], [8589, 8591], [8590, 8592, 8680], [8591, 8593], [8507, 8592, 8594], [8593, 8595], [8594, 8596, 8681], [8595, 8597], [8508, 8596, 8598], [8597, 8599], [8598, 8600, 8682], [8599, 8601], [8509, 8600, 8602], [8601, 8603], [8602, 8604, 8683], [8603, 8605], [8510, 8604, 8606], [8605, 8607], [8606, 8608, 8684], [8607, 8609], [8511, 8608, 8610], [8609, 8611], [8610, 8612, 8685], [8611, 8613], [8512, 8612, 8614], [8613, 8615], [8614, 8616, 8686], [8615, 8617], [8513, 8616, 8618], [8617, 8619], [8618, 8620, 8687], [8619, 8621], [8514, 8620, 8622], [8621, 8623], [8622, 8624, 8688], [8623, 8625], [8515, 8624, 8626], [8625, 8627], [8626, 8628, 8689], [8627, 8629], [8516, 8628, 8630], [8629, 8631], [8630, 8632, 8690], [8631, 8633], [8517, 8632, 8634], [8633, 8635], [8634, 8636, 8691], [8635, 8637], [8518, 8636, 8638], [8637, 8639], [8638, 8640, 8692], [8639, 8641], [8519, 8640, 8642], [8641, 8643], [8642, 8644, 8693], [8643, 8645], [8520, 8644, 8646], [8645, 8647], [8646, 8648, 8694], [8647, 8649], [8521, 8648, 8650], [8649, 8651], [8650, 8652, 8695], [8651, 8653], [8522, 8652, 8654], [8653, 8655], [8654, 8656, 8696], [8655, 8657], [8523, 8656, 8658], [8657, 8659], [8658, 8660, 8697], [8659, 8661], [8524, 8660, 8662], [8661, 8663], [8662, 8698], [8527, 8701], [8531, 8705], [8535, 8709], [8539, 8713], [8543, 8717], [8547, 8721], [8551, 8725], [8555, 8729], [8559, 8733], [8563, 8737], [8567, 8741], [8571, 8745], [8575, 8749], [8579, 8753], [8583, 8757], [8587, 8761], [8591, 8765], [8595, 8769], [8599, 8773], [8603, 8777], [8607, 8781], [8611, 8785], [8615, 8789], [8619, 8793], [8623, 8797], [8627, 8801], [8631, 8805], [8635, 8809], [8639, 8813], [8643, 8817], [8647, 8821], [8651, 8825], [8655, 8829], [8659, 8833], [8663, 8837], [8700, 8838], [8699, 8701], [8664, 8700, 8702], [8701, 8703], [8702, 8704, 8839], [8703, 8705], [8665, 8704, 8706], [8705, 8707], [8706, 8708, 8840], [8707, 8709], [8666, 8708, 8710], [8709, 8711], [8710, 8712, 8841], [8711, 8713], [8667, 8712, 8714], [8713, 8715], [8714, 8716, 8842], [8715, 8717], [8668, 8716, 8718], [8717, 8719], [8718, 8720, 8843], [8719, 8721], [8669, 8720, 8722], [8721, 8723], [8722, 8724, 8844], [8723, 8725], [8670, 8724, 8726], [8725, 8727], [8726, 8728, 8845], [8727, 8729], [8671, 8728, 8730], [8729, 8731], [8730, 8732, 8846], [8731, 8733], [8672, 8732, 8734], [8733, 8735], [8734, 8736, 8847], [8735, 8737], [8673, 8736, 8738], [8737, 8739], [8738, 8740, 8848], [8739, 8741], [8674, 8740, 8742], [8741, 8743], [8742, 8744, 8849], [8743, 8745], [8675, 8744, 8746], [8745, 8747], [8746, 8748, 8850], [8747, 8749], [8676, 8748, 8750], [8749, 8751], [8750, 8752, 8851], [8751, 8753], [8677, 8752, 8754], [8753, 8755], [8754, 8756, 8852], [8755, 8757], [8678, 8756, 8758], [8757, 8759], [8758, 8760, 8853], [8759, 8761], [8679, 8760, 8762], [8761, 8763], [8762, 8764, 8854], [8763, 8765], [8680, 8764, 8766], [8765, 8767], [8766, 8768, 8855], [8767, 8769], [8681, 8768, 8770], [8769, 8771], [8770, 8772, 8856], [8771, 8773], [8682, 8772, 8774], [8773, 8775], [8774, 8776, 8857], [8775, 8777], [8683, 8776, 8778], [8777, 8779], [8778, 8780, 8858], [8779, 8781], [8684, 8780, 8782], [8781, 8783], [8782, 8784, 8859], [8783, 8785], [8685, 8784, 8786], [8785, 8787], [8786, 8788, 8860], [8787, 8789], [8686, 8788, 8790], [8789, 8791], [8790, 8792, 8861], [8791, 8793], [8687, 8792, 8794], [8793, 8795], [8794, 8796, 8862], [8795, 8797], [8688, 8796, 8798], [8797, 8799], [8798, 8800, 8863], [8799, 8801], [8689, 8800, 8802], [8801, 8803], [8802, 8804, 8864], [8803, 8805], [8690, 8804, 8806], [8805, 8807], [8806, 8808, 8865], [8807, 8809], [8691, 8808, 8810], [8809, 8811], [8810, 8812, 8866], [8811, 8813], [8692, 8812, 8814], [8813, 8815], [8814, 8816, 8867], [8815, 8817], [8693, 8816, 8818], [8817, 8819], [8818, 8820, 8868], [8819, 8821], [8694, 8820, 8822], [8821, 8823], [8822, 8824, 8869], [8823, 8825], [8695, 8824, 8826], [8825, 8827], [8826, 8828, 8870], [8827, 8829], [8696, 8828, 8830], [8829, 8831], [8830, 8832, 8871], [8831, 8833], [8697, 8832, 8834], [8833, 8835], [8834, 8836, 8872], [8835, 8837], [8698, 8836], [8699, 8873], [8703, 8877], [8707, 8881], [8711, 8885], [8715, 8889], [8719, 8893], [8723, 8897], [8727, 8901], [8731, 8905], [8735, 8909], [8739, 8913], [8743, 8917], [8747, 8921], [8751, 8925], [8755, 8929], [8759, 8933], [8763, 8937], [8767, 8941], [8771, 8945], [8775, 8949], [8779, 8953], [8783, 8957], [8787, 8961], [8791, 8965], [8795, 8969], [8799, 8973], [8803, 8977], [8807, 8981], [8811, 8985], [8815, 8989], [8819, 8993], [8823, 8997], [8827, 9001], [8831, 9005], [8835, 9009], [8838, 8874], [8873, 8875], [8874, 8876, 9012], [8875, 8877], [8839, 8876, 8878], [8877, 8879], [8878, 8880, 9013], [8879, 8881], [8840, 8880, 8882], [8881, 8883], [8882, 8884, 9014], [8883, 8885], [8841, 8884, 8886], [8885, 8887], [8886, 8888, 9015], [8887, 8889], [8842, 8888, 8890], [8889, 8891], [8890, 8892, 9016], [8891, 8893], [8843, 8892, 8894], [8893, 8895], [8894, 8896, 9017], [8895, 8897], [8844, 8896, 8898], [8897, 8899], [8898, 8900, 9018], [8899, 8901], [8845, 8900, 8902], [8901, 8903], [8902, 8904, 9019], [8903, 8905], [8846, 8904, 8906], [8905, 8907], [8906, 8908, 9020], [8907, 8909], [8847, 8908, 8910], [8909, 8911], [8910, 8912, 9021], [8911, 8913], [8848, 8912, 8914], [8913, 8915], [8914, 8916, 9022], [8915, 8917], [8849, 8916, 8918], [8917, 8919], [8918, 8920, 9023], [8919, 8921], [8850, 8920, 8922], [8921, 8923], [8922, 8924, 9024], [8923, 8925], [8851, 8924, 8926], [8925, 8927], [8926, 8928, 9025], [8927, 8929], [8852, 8928, 8930], [8929, 8931], [8930, 8932, 9026], [8931, 8933], [8853, 8932, 8934], [8933, 8935], [8934, 8936, 9027], [8935, 8937], [8854, 8936, 8938], [8937, 8939], [8938, 8940, 9028], [8939, 8941], [8855, 8940, 8942], [8941, 8943], [8942, 8944, 9029], [8943, 8945], [8856, 8944, 8946], [8945, 8947], [8946, 8948, 9030], [8947, 8949], [8857, 8948, 8950], [8949, 8951], [8950, 8952, 9031], [8951, 8953], [8858, 8952, 8954], [8953, 8955], [8954, 8956, 9032], [8955, 8957], [8859, 8956, 8958], [8957, 8959], [8958, 8960, 9033], [8959, 8961], [8860, 8960, 8962], [8961, 8963], [8962, 8964, 9034], [8963, 8965], [8861, 8964, 8966], [8965, 8967], [8966, 8968, 9035], [8967, 8969], [8862, 8968, 8970], [8969, 8971], [8970, 8972, 9036], [8971, 8973], [8863, 8972, 8974], [8973, 8975], [8974, 8976, 9037], [8975, 8977], [8864, 8976, 8978], [8977, 8979], [8978, 8980, 9038], [8979, 8981], [8865, 8980, 8982], [8981, 8983], [8982, 8984, 9039], [8983, 8985], [8866, 8984, 8986], [8985, 8987], [8986, 8988, 9040], [8987, 8989], [8867, 8988, 8990], [8989, 8991], [8990, 8992, 9041], [8991, 8993], [8868, 8992, 8994], [8993, 8995], [8994, 8996, 9042], [8995, 8997], [8869, 8996, 8998], [8997, 8999], [8998, 9000, 9043], [8999, 9001], [8870, 9000, 9002], [9001, 9003], [9002, 9004, 9044], [9003, 9005], [8871, 9004, 9006], [9005, 9007], [9006, 9008, 9045], [9007, 9009], [8872, 9008, 9010], [9009, 9011], [9010, 9046], [8875, 9049], [8879, 9053], [8883, 9057], [8887, 9061], [8891, 9065], [8895, 9069], [8899, 9073], [8903, 9077], [8907, 9081], [8911, 9085], [8915, 9089], [8919, 9093], [8923, 9097], [8927, 9101], [8931, 9105], [8935, 9109], [8939, 9113], [8943, 9117], [8947, 9121], [8951, 9125], [8955, 9129], [8959, 9133], [8963, 9137], [8967, 9141], [8971, 9145], [8975, 9149], [8979, 9153], [8983, 9157], [8987, 9161], [8991, 9165], [8995, 9169], [8999, 9173], [9003, 9177], [9007, 9181], [9011, 9185], [9048, 9186], [9047, 9049], [9012, 9048, 9050], [9049, 9051], [9050, 9052, 9187], [9051, 9053], [9013, 9052, 9054], [9053, 9055], [9054, 9056, 9188], [9055, 9057], [9014, 9056, 9058], [9057, 9059], [9058, 9060, 9189], [9059, 9061], [9015, 9060, 9062], [9061, 9063], [9062, 9064, 9190], [9063, 9065], [9016, 9064, 9066], [9065, 9067], [9066, 9068, 9191], [9067, 9069], [9017, 9068, 9070], [9069, 9071], [9070, 9072, 9192], [9071, 9073], [9018, 9072, 9074], [9073, 9075], [9074, 9076, 9193], [9075, 9077], [9019, 9076, 9078], [9077, 9079], [9078, 9080, 9194], [9079, 9081], [9020, 9080, 9082], [9081, 9083], [9082, 9084, 9195], [9083, 9085], [9021, 9084, 9086], [9085, 9087], [9086, 9088, 9196], [9087, 9089], [9022, 9088, 9090], [9089, 9091], [9090, 9092, 9197], [9091, 9093], [9023, 9092, 9094], [9093, 9095], [9094, 9096, 9198], [9095, 9097], [9024, 9096, 9098], [9097, 9099], [9098, 9100, 9199], [9099, 9101], [9025, 9100, 9102], [9101, 9103], [9102, 9104, 9200], [9103, 9105], [9026, 9104, 9106], [9105, 9107], [9106, 9108, 9201], [9107, 9109], [9027, 9108, 9110], [9109, 9111], [9110, 9112, 9202], [9111, 9113], [9028, 9112, 9114], [9113, 9115], [9114, 9116, 9203], [9115, 9117], [9029, 9116, 9118], [9117, 9119], [9118, 9120, 9204], [9119, 9121], [9030, 9120, 9122], [9121, 9123], [9122, 9124, 9205], [9123, 9125], [9031, 9124, 9126], [9125, 9127], [9126, 9128, 9206], [9127, 9129], [9032, 9128, 9130], [9129, 9131], [9130, 9132, 9207], [9131, 9133], [9033, 9132, 9134], [9133, 9135], [9134, 9136, 9208], [9135, 9137], [9034, 9136, 9138], [9137, 9139], [9138, 9140, 9209], [9139, 9141], [9035, 9140, 9142], [9141, 9143], [9142, 9144, 9210], [9143, 9145], [9036, 9144, 9146], [9145, 9147], [9146, 9148, 9211], [9147, 9149], [9037, 9148, 9150], [9149, 9151], [9150, 9152, 9212], [9151, 9153], [9038, 9152, 9154], [9153, 9155], [9154, 9156, 9213], [9155, 9157], [9039, 9156, 9158], [9157, 9159], [9158, 9160, 9214], [9159, 9161], [9040, 9160, 9162], [9161, 9163], [9162, 9164, 9215], [9163, 9165], [9041, 9164, 9166], [9165, 9167], [9166, 9168, 9216], [9167, 9169], [9042, 9168, 9170], [9169, 9171], [9170, 9172, 9217], [9171, 9173], [9043, 9172, 9174], [9173, 9175], [9174, 9176, 9218], [9175, 9177], [9044, 9176, 9178], [9177, 9179], [9178, 9180, 9219], [9179, 9181], [9045, 9180, 9182], [9181, 9183], [9182, 9184, 9220], [9183, 9185], [9046, 9184], [9047, 9221], [9051, 9225], [9055, 9229], [9059, 9233], [9063, 9237], [9067, 9241], [9071, 9245], [9075, 9249], [9079, 9253], [9083, 9257], [9087, 9261], [9091, 9265], [9095, 9269], [9099, 9273], [9103, 9277], [9107, 9281], [9111, 9285], [9115, 9289], [9119, 9293], [9123, 9297], [9127, 9301], [9131, 9305], [9135, 9309], [9139, 9313], [9143, 9317], [9147, 9321], [9151, 9325], [9155, 9329], [9159, 9333], [9163, 9337], [9167, 9341], [9171, 9345], [9175, 9349], [9179, 9353], [9183, 9357], [9186, 9222], [9221, 9223], [9222, 9224, 9360], [9223, 9225], [9187, 9224, 9226], [9225, 9227], [9226, 9228, 9361], [9227, 9229], [9188, 9228, 9230], [9229, 9231], [9230, 9232, 9362], [9231, 9233], [9189, 9232, 9234], [9233, 9235], [9234, 9236, 9363], [9235, 9237], [9190, 9236, 9238], [9237, 9239], [9238, 9240, 9364], [9239, 9241], [9191, 9240, 9242], [9241, 9243], [9242, 9244, 9365], [9243, 9245], [9192, 9244, 9246], [9245, 9247], [9246, 9248, 9366], [9247, 9249], [9193, 9248, 9250], [9249, 9251], [9250, 9252, 9367], [9251, 9253], [9194, 9252, 9254], [9253, 9255], [9254, 9256, 9368], [9255, 9257], [9195, 9256, 9258], [9257, 9259], [9258, 9260, 9369], [9259, 9261], [9196, 9260, 9262], [9261, 9263], [9262, 9264, 9370], [9263, 9265], [9197, 9264, 9266], [9265, 9267], [9266, 9268, 9371], [9267, 9269], [9198, 9268, 9270], [9269, 9271], [9270, 9272, 9372], [9271, 9273], [9199, 9272, 9274], [9273, 9275], [9274, 9276, 9373], [9275, 9277], [9200, 9276, 9278], [9277, 9279], [9278, 9280, 9374], [9279, 9281], [9201, 9280, 9282], [9281, 9283], [9282, 9284, 9375], [9283, 9285], [9202, 9284, 9286], [9285, 9287], [9286, 9288, 9376], [9287, 9289], [9203, 9288, 9290], [9289, 9291], [9290, 9292, 9377], [9291, 9293], [9204, 9292, 9294], [9293, 9295], [9294, 9296, 9378], [9295, 9297], [9205, 9296, 9298], [9297, 9299], [9298, 9300, 9379], [9299, 9301], [9206, 9300, 9302], [9301, 9303], [9302, 9304, 9380], [9303, 9305], [9207, 9304, 9306], [9305, 9307], [9306, 9308, 9381], [9307, 9309], [9208, 9308, 9310], [9309, 9311], [9310, 9312, 9382], [9311, 9313], [9209, 9312, 9314], [9313, 9315], [9314, 9316, 9383], [9315, 9317], [9210, 9316, 9318], [9317, 9319], [9318, 9320, 9384], [9319, 9321], [9211, 9320, 9322], [9321, 9323], [9322, 9324, 9385], [9323, 9325], [9212, 9324, 9326], [9325, 9327], [9326, 9328, 9386], [9327, 9329], [9213, 9328, 9330], [9329, 9331], [9330, 9332, 9387], [9331, 9333], [9214, 9332, 9334], [9333, 9335], [9334, 9336, 9388], [9335, 9337], [9215, 9336, 9338], [9337, 9339], [9338, 9340, 9389], [9339, 9341], [9216, 9340, 9342], [9341, 9343], [9342, 9344, 9390], [9343, 9345], [9217, 9344, 9346], [9345, 9347], [9346, 9348, 9391], [9347, 9349], [9218, 9348, 9350], [9349, 9351], [9350, 9352, 9392], [9351, 9353], [9219, 9352, 9354], [9353, 9355], [9354, 9356, 9393], [9355, 9357], [9220, 9356, 9358], [9357, 9359], [9358, 9394], [9223, 9397], [9227, 9401], [9231, 9405], [9235, 9409], [9239, 9413], [9243, 9417], [9247, 9421], [9251, 9425], [9255, 9429], [9259, 9433], [9263, 9437], [9267, 9441], [9271, 9445], [9275, 9449], [9279, 9453], [9283, 9457], [9287, 9461], [9291, 9465], [9295, 9469], [9299, 9473], [9303, 9477], [9307, 9481], [9311, 9485], [9315, 9489], [9319, 9493], [9323, 9497], [9327, 9501], [9331, 9505], [9335, 9509], [9339, 9513], [9343, 9517], [9347, 9521], [9351, 9525], [9355, 9529], [9359, 9533], [9396, 9534], [9395, 9397], [9360, 9396, 9398], [9397, 9399], [9398, 9400, 9535], [9399, 9401], [9361, 9400, 9402], [9401, 9403], [9402, 9404, 9536], [9403, 9405], [9362, 9404, 9406], [9405, 9407], [9406, 9408, 9537], [9407, 9409], [9363, 9408, 9410], [9409, 9411], [9410, 9412, 9538], [9411, 9413], [9364, 9412, 9414], [9413, 9415], [9414, 9416, 9539], [9415, 9417], [9365, 9416, 9418], [9417, 9419], [9418, 9420, 9540], [9419, 9421], [9366, 9420, 9422], [9421, 9423], [9422, 9424, 9541], [9423, 9425], [9367, 9424, 9426], [9425, 9427], [9426, 9428, 9542], [9427, 9429], [9368, 9428, 9430], [9429, 9431], [9430, 9432, 9543], [9431, 9433], [9369, 9432, 9434], [9433, 9435], [9434, 9436, 9544], [9435, 9437], [9370, 9436, 9438], [9437, 9439], [9438, 9440, 9545], [9439, 9441], [9371, 9440, 9442], [9441, 9443], [9442, 9444, 9546], [9443, 9445], [9372, 9444, 9446], [9445, 9447], [9446, 9448, 9547], [9447, 9449], [9373, 9448, 9450], [9449, 9451], [9450, 9452, 9548], [9451, 9453], [9374, 9452, 9454], [9453, 9455], [9454, 9456, 9549], [9455, 9457], [9375, 9456, 9458], [9457, 9459], [9458, 9460, 9550], [9459, 9461], [9376, 9460, 9462], [9461, 9463], [9462, 9464, 9551], [9463, 9465], [9377, 9464, 9466], [9465, 9467], [9466, 9468, 9552], [9467, 9469], [9378, 9468, 9470], [9469, 9471], [9470, 9472, 9553], [9471, 9473], [9379, 9472, 9474], [9473, 9475], [9474, 9476, 9554], [9475, 9477], [9380, 9476, 9478], [9477, 9479], [9478, 9480, 9555], [9479, 9481], [9381, 9480, 9482], [9481, 9483], [9482, 9484, 9556], [9483, 9485], [9382, 9484, 9486], [9485, 9487], [9486, 9488, 9557], [9487, 9489], [9383, 9488, 9490], [9489, 9491], [9490, 9492, 9558], [9491, 9493], [9384, 9492, 9494], [9493, 9495], [9494, 9496, 9559], [9495, 9497], [9385, 9496, 9498], [9497, 9499], [9498, 9500, 9560], [9499, 9501], [9386, 9500, 9502], [9501, 9503], [9502, 9504, 9561], [9503, 9505], [9387, 9504, 9506], [9505, 9507], [9506, 9508, 9562], [9507, 9509], [9388, 9508, 9510], [9509, 9511], [9510, 9512, 9563], [9511, 9513], [9389, 9512, 9514], [9513, 9515], [9514, 9516, 9564], [9515, 9517], [9390, 9516, 9518], [9517, 9519], [9518, 9520, 9565], [9519, 9521], [9391, 9520, 9522], [9521, 9523], [9522, 9524, 9566], [9523, 9525], [9392, 9524, 9526], [9525, 9527], [9526, 9528, 9567], [9527, 9529], [9393, 9528, 9530], [9529, 9531], [9530, 9532, 9568], [9531, 9533], [9394, 9532], [9395, 9569], [9399, 9573], [9403, 9577], [9407, 9581], [9411, 9585], [9415, 9589], [9419, 9593], [9423, 9597], [9427, 9601], [9431, 9605], [9435, 9609], [9439, 9613], [9443, 9617], [9447, 9621], [9451, 9625], [9455, 9629], [9459, 9633], [9463, 9637], [9467, 9641], [9471, 9645], [9475, 9649], [9479, 9653], [9483, 9657], [9487, 9661], [9491, 9665], [9495, 9669], [9499, 9673], [9503, 9677], [9507, 9681], [9511, 9685], [9515, 9689], [9519, 9693], [9523, 9697], [9527, 9701], [9531, 9705], [9534, 9570], [9569, 9571], [9570, 9572, 9708], [9571, 9573], [9535, 9572, 9574], [9573, 9575], [9574, 9576, 9709], [9575, 9577], [9536, 9576, 9578], [9577, 9579], [9578, 9580, 9710], [9579, 9581], [9537, 9580, 9582], [9581, 9583], [9582, 9584, 9711], [9583, 9585], [9538, 9584, 9586], [9585, 9587], [9586, 9588, 9712], [9587, 9589], [9539, 9588, 9590], [9589, 9591], [9590, 9592, 9713], [9591, 9593], [9540, 9592, 9594], [9593, 9595], [9594, 9596, 9714], [9595, 9597], [9541, 9596, 9598], [9597, 9599], [9598, 9600, 9715], [9599, 9601], [9542, 9600, 9602], [9601, 9603], [9602, 9604, 9716], [9603, 9605], [9543, 9604, 9606], [9605, 9607], [9606, 9608, 9717], [9607, 9609], [9544, 9608, 9610], [9609, 9611], [9610, 9612, 9718], [9611, 9613], [9545, 9612, 9614], [9613, 9615], [9614, 9616, 9719], [9615, 9617], [9546, 9616, 9618], [9617, 9619], [9618, 9620, 9720], [9619, 9621], [9547, 9620, 9622], [9621, 9623], [9622, 9624, 9721], [9623, 9625], [9548, 9624, 9626], [9625, 9627], [9626, 9628, 9722], [9627, 9629], [9549, 9628, 9630], [9629, 9631], [9630, 9632, 9723], [9631, 9633], [9550, 9632, 9634], [9633, 9635], [9634, 9636, 9724], [9635, 9637], [9551, 9636, 9638], [9637, 9639], [9638, 9640, 9725], [9639, 9641], [9552, 9640, 9642], [9641, 9643], [9642, 9644, 9726], [9643, 9645], [9553, 9644, 9646], [9645, 9647], [9646, 9648, 9727], [9647, 9649], [9554, 9648, 9650], [9649, 9651], [9650, 9652, 9728], [9651, 9653], [9555, 9652, 9654], [9653, 9655], [9654, 9656, 9729], [9655, 9657], [9556, 9656, 9658], [9657, 9659], [9658, 9660, 9730], [9659, 9661], [9557, 9660, 9662], [9661, 9663], [9662, 9664, 9731], [9663, 9665], [9558, 9664, 9666], [9665, 9667], [9666, 9668, 9732], [9667, 9669], [9559, 9668, 9670], [9669, 9671], [9670, 9672, 9733], [9671, 9673], [9560, 9672, 9674], [9673, 9675], [9674, 9676, 9734], [9675, 9677], [9561, 9676, 9678], [9677, 9679], [9678, 9680, 9735], [9679, 9681], [9562, 9680, 9682], [9681, 9683], [9682, 9684, 9736], [9683, 9685], [9563, 9684, 9686], [9685, 9687], [9686, 9688, 9737], [9687, 9689], [9564, 9688, 9690], [9689, 9691], [9690, 9692, 9738], [9691, 9693], [9565, 9692, 9694], [9693, 9695], [9694, 9696, 9739], [9695, 9697], [9566, 9696, 9698], [9697, 9699], [9698, 9700, 9740], [9699, 9701], [9567, 9700, 9702], [9701, 9703], [9702, 9704, 9741], [9703, 9705], [9568, 9704, 9706], [9705, 9707], [9706, 9742], [9571, 9745], [9575, 9749], [9579, 9753], [9583, 9757], [9587, 9761], [9591, 9765], [9595, 9769], [9599, 9773], [9603, 9777], [9607, 9781], [9611, 9785], [9615, 9789], [9619, 9793], [9623, 9797], [9627, 9801], [9631, 9805], [9635, 9809], [9639, 9813], [9643, 9817], [9647, 9821], [9651, 9825], [9655, 9829], [9659, 9833], [9663, 9837], [9667, 9841], [9671, 9845], [9675, 9849], [9679, 9853], [9683, 9857], [9687, 9861], [9691, 9865], [9695, 9869], [9699, 9873], [9703, 9877], [9707, 9881], [9744, 9882], [9743, 9745], [9708, 9744, 9746], [9745, 9747], [9746, 9748, 9883], [9747, 9749], [9709, 9748, 9750], [9749, 9751], [9750, 9752, 9884], [9751, 9753], [9710, 9752, 9754], [9753, 9755], [9754, 9756, 9885], [9755, 9757], [9711, 9756, 9758], [9757, 9759], [9758, 9760, 9886], [9759, 9761], [9712, 9760, 9762], [9761, 9763], [9762, 9764, 9887], [9763, 9765], [9713, 9764, 9766], [9765, 9767], [9766, 9768, 9888], [9767, 9769], [9714, 9768, 9770], [9769, 9771], [9770, 9772, 9889], [9771, 9773], [9715, 9772, 9774], [9773, 9775], [9774, 9776, 9890], [9775, 9777], [9716, 9776, 9778], [9777, 9779], [9778, 9780, 9891], [9779, 9781], [9717, 9780, 9782], [9781, 9783], [9782, 9784, 9892], [9783, 9785], [9718, 9784, 9786], [9785, 9787], [9786, 9788, 9893], [9787, 9789], [9719, 9788, 9790], [9789, 9791], [9790, 9792, 9894], [9791, 9793], [9720, 9792, 9794], [9793, 9795], [9794, 9796, 9895], [9795, 9797], [9721, 9796, 9798], [9797, 9799], [9798, 9800, 9896], [9799, 9801], [9722, 9800, 9802], [9801, 9803], [9802, 9804, 9897], [9803, 9805], [9723, 9804, 9806], [9805, 9807], [9806, 9808, 9898], [9807, 9809], [9724, 9808, 9810], [9809, 9811], [9810, 9812, 9899], [9811, 9813], [9725, 9812, 9814], [9813, 9815], [9814, 9816, 9900], [9815, 9817], [9726, 9816, 9818], [9817, 9819], [9818, 9820, 9901], [9819, 9821], [9727, 9820, 9822], [9821, 9823], [9822, 9824, 9902], [9823, 9825], [9728, 9824, 9826], [9825, 9827], [9826, 9828, 9903], [9827, 9829], [9729, 9828, 9830], [9829, 9831], [9830, 9832, 9904], [9831, 9833], [9730, 9832, 9834], [9833, 9835], [9834, 9836, 9905], [9835, 9837], [9731, 9836, 9838], [9837, 9839], [9838, 9840, 9906], [9839, 9841], [9732, 9840, 9842], [9841, 9843], [9842, 9844, 9907], [9843, 9845], [9733, 9844, 9846], [9845, 9847], [9846, 9848, 9908], [9847, 9849], [9734, 9848, 9850], [9849, 9851], [9850, 9852, 9909], [9851, 9853], [9735, 9852, 9854], [9853, 9855], [9854, 9856, 9910], [9855, 9857], [9736, 9856, 9858], [9857, 9859], [9858, 9860, 9911], [9859, 9861], [9737, 9860, 9862], [9861, 9863], [9862, 9864, 9912], [9863, 9865], [9738, 9864, 9866], [9865, 9867], [9866, 9868, 9913], [9867, 9869], [9739, 9868, 9870], [9869, 9871], [9870, 9872, 9914], [9871, 9873], [9740, 9872, 9874], [9873, 9875], [9874, 9876, 9915], [9875, 9877], [9741, 9876, 9878], [9877, 9879], [9878, 9880, 9916], [9879, 9881], [9742, 9880], [9743, 9917], [9747, 9921], [9751, 9925], [9755, 9929], [9759, 9933], [9763, 9937], [9767, 9941], [9771, 9945], [9775, 9949], [9779, 9953], [9783, 9957], [9787, 9961], [9791, 9965], [9795, 9969], [9799, 9973], [9803, 9977], [9807, 9981], [9811, 9985], [9815, 9989], [9819, 9993], [9823, 9997], [9827, 10001], [9831, 10005], [9835, 10009], [9839, 10013], [9843, 10017], [9847, 10021], [9851, 10025], [9855, 10029], [9859, 10033], [9863, 10037], [9867, 10041], [9871, 10045], [9875, 10049], [9879, 10053], [9882, 9918], [9917, 9919], [9918, 9920, 10056], [9919, 9921], [9883, 9920, 9922], [9921, 9923], [9922, 9924, 10057], [9923, 9925], [9884, 9924, 9926], [9925, 9927], [9926, 9928, 10058], [9927, 9929], [9885, 9928, 9930], [9929, 9931], [9930, 9932, 10059], [9931, 9933], [9886, 9932, 9934], [9933, 9935], [9934, 9936, 10060], [9935, 9937], [9887, 9936, 9938], [9937, 9939], [9938, 9940, 10061], [9939, 9941], [9888, 9940, 9942], [9941, 9943], [9942, 9944, 10062], [9943, 9945], [9889, 9944, 9946], [9945, 9947], [9946, 9948, 10063], [9947, 9949], [9890, 9948, 9950], [9949, 9951], [9950, 9952, 10064], [9951, 9953], [9891, 9952, 9954], [9953, 9955], [9954, 9956, 10065], [9955, 9957], [9892, 9956, 9958], [9957, 9959], [9958, 9960, 10066], [9959, 9961], [9893, 9960, 9962], [9961, 9963], [9962, 9964, 10067], [9963, 9965], [9894, 9964, 9966], [9965, 9967], [9966, 9968, 10068], [9967, 9969], [9895, 9968, 9970], [9969, 9971], [9970, 9972, 10069], [9971, 9973], [9896, 9972, 9974], [9973, 9975], [9974, 9976, 10070], [9975, 9977], [9897, 9976, 9978], [9977, 9979], [9978, 9980, 10071], [9979, 9981], [9898, 9980, 9982], [9981, 9983], [9982, 9984, 10072], [9983, 9985], [9899, 9984, 9986], [9985, 9987], [9986, 9988, 10073], [9987, 9989], [9900, 9988, 9990], [9989, 9991], [9990, 9992, 10074], [9991, 9993], [9901, 9992, 9994], [9993, 9995], [9994, 9996, 10075], [9995, 9997], [9902, 9996, 9998], [9997, 9999], [9998, 10000, 10076], [9999, 10001], [9903, 10000, 10002], [10001, 10003], [10002, 10004, 10077], [10003, 10005], [9904, 10004, 10006], [10005, 10007], [10006, 10008, 10078], [10007, 10009], [9905, 10008, 10010], [10009, 10011], [10010, 10012, 10079], [10011, 10013], [9906, 10012, 10014], [10013, 10015], [10014, 10016, 10080], [10015, 10017], [9907, 10016, 10018], [10017, 10019], [10018, 10020, 10081], [10019, 10021], [9908, 10020, 10022], [10021, 10023], [10022, 10024, 10082], [10023, 10025], [9909, 10024, 10026], [10025, 10027], [10026, 10028, 10083], [10027, 10029], [9910, 10028, 10030], [10029, 10031], [10030, 10032, 10084], [10031, 10033], [9911, 10032, 10034], [10033, 10035], [10034, 10036, 10085], [10035, 10037], [9912, 10036, 10038], [10037, 10039], [10038, 10040, 10086], [10039, 10041], [9913, 10040, 10042], [10041, 10043], [10042, 10044, 10087], [10043, 10045], [9914, 10044, 10046], [10045, 10047], [10046, 10048, 10088], [10047, 10049], [9915, 10048, 10050], [10049, 10051], [10050, 10052, 10089], [10051, 10053], [9916, 10052, 10054], [10053, 10055], [10054, 10090], [9919, 10093], [9923, 10097], [9927, 10101], [9931, 10105], [9935, 10109], [9939, 10113], [9943, 10117], [9947, 10121], [9951, 10125], [9955, 10129], [9959, 10133], [9963, 10137], [9967, 10141], [9971, 10145], [9975, 10149], [9979, 10153], [9983, 10157], [9987, 10161], [9991, 10165], [9995, 10169], [9999, 10173], [10003, 10177], [10007, 10181], [10011, 10185], [10015, 10189], [10019, 10193], [10023, 10197], [10027, 10201], [10031, 10205], [10035, 10209], [10039, 10213], [10043, 10217], [10047, 10221], [10051, 10225], [10055, 10229], [10092, 10230], [10091, 10093], [10056, 10092, 10094], [10093, 10095], [10094, 10096, 10231], [10095, 10097], [10057, 10096, 10098], [10097, 10099], [10098, 10100, 10232], [10099, 10101], [10058, 10100, 10102], [10101, 10103], [10102, 10104, 10233], [10103, 10105], [10059, 10104, 10106], [10105, 10107], [10106, 10108, 10234], [10107, 10109], [10060, 10108, 10110], [10109, 10111], [10110, 10112, 10235], [10111, 10113], [10061, 10112, 10114], [10113, 10115], [10114, 10116, 10236], [10115, 10117], [10062, 10116, 10118], [10117, 10119], [10118, 10120, 10237], [10119, 10121], [10063, 10120, 10122], [10121, 10123], [10122, 10124, 10238], [10123, 10125], [10064, 10124, 10126], [10125, 10127], [10126, 10128, 10239], [10127, 10129], [10065, 10128, 10130], [10129, 10131], [10130, 10132, 10240], [10131, 10133], [10066, 10132, 10134], [10133, 10135], [10134, 10136, 10241], [10135, 10137], [10067, 10136, 10138], [10137, 10139], [10138, 10140, 10242], [10139, 10141], [10068, 10140, 10142], [10141, 10143], [10142, 10144, 10243], [10143, 10145], [10069, 10144, 10146], [10145, 10147], [10146, 10148, 10244], [10147, 10149], [10070, 10148, 10150], [10149, 10151], [10150, 10152, 10245], [10151, 10153], [10071, 10152, 10154], [10153, 10155], [10154, 10156, 10246], [10155, 10157], [10072, 10156, 10158], [10157, 10159], [10158, 10160, 10247], [10159, 10161], [10073, 10160, 10162], [10161, 10163], [10162, 10164, 10248], [10163, 10165], [10074, 10164, 10166], [10165, 10167], [10166, 10168, 10249], [10167, 10169], [10075, 10168, 10170], [10169, 10171], [10170, 10172, 10250], [10171, 10173], [10076, 10172, 10174], [10173, 10175], [10174, 10176, 10251], [10175, 10177], [10077, 10176, 10178], [10177, 10179], [10178, 10180, 10252], [10179, 10181], [10078, 10180, 10182], [10181, 10183], [10182, 10184, 10253], [10183, 10185], [10079, 10184, 10186], [10185, 10187], [10186, 10188, 10254], [10187, 10189], [10080, 10188, 10190], [10189, 10191], [10190, 10192, 10255], [10191, 10193], [10081, 10192, 10194], [10193, 10195], [10194, 10196, 10256], [10195, 10197], [10082, 10196, 10198], [10197, 10199], [10198, 10200, 10257], [10199, 10201], [10083, 10200, 10202], [10201, 10203], [10202, 10204, 10258], [10203, 10205], [10084, 10204, 10206], [10205, 10207], [10206, 10208, 10259], [10207, 10209], [10085, 10208, 10210], [10209, 10211], [10210, 10212, 10260], [10211, 10213], [10086, 10212, 10214], [10213, 10215], [10214, 10216, 10261], [10215, 10217], [10087, 10216, 10218], [10217, 10219], [10218, 10220, 10262], [10219, 10221], [10088, 10220, 10222], [10221, 10223], [10222, 10224, 10263], [10223, 10225], [10089, 10224, 10226], [10225, 10227], [10226, 10228, 10264], [10227, 10229], [10090, 10228], [10091, 10265], [10095, 10269], [10099, 10273], [10103, 10277], [10107, 10281], [10111, 10285], [10115, 10289], [10119, 10293], [10123, 10297], [10127, 10301], [10131, 10305], [10135, 10309], [10139, 10313], [10143, 10317], [10147, 10321], [10151, 10325], [10155, 10329], [10159, 10333], [10163, 10337], [10167, 10341], [10171, 10345], [10175, 10349], [10179, 10353], [10183, 10357], [10187, 10361], [10191, 10365], [10195, 10369], [10199, 10373], [10203, 10377], [10207, 10381], [10211, 10385], [10215, 10389], [10219, 10393], [10223, 10397], [10227, 10401], [10230, 10266], [10265, 10267], [10266, 10268, 10404], [10267, 10269], [10231, 10268, 10270], [10269, 10271], [10270, 10272, 10405], [10271, 10273], [10232, 10272, 10274], [10273, 10275], [10274, 10276, 10406], [10275, 10277], [10233, 10276, 10278], [10277, 10279], [10278, 10280, 10407], [10279, 10281], [10234, 10280, 10282], [10281, 10283], [10282, 10284, 10408], [10283, 10285], [10235, 10284, 10286], [10285, 10287], [10286, 10288, 10409], [10287, 10289], [10236, 10288, 10290], [10289, 10291], [10290, 10292, 10410], [10291, 10293], [10237, 10292, 10294], [10293, 10295], [10294, 10296, 10411], [10295, 10297], [10238, 10296, 10298], [10297, 10299], [10298, 10300, 10412], [10299, 10301], [10239, 10300, 10302], [10301, 10303], [10302, 10304, 10413], [10303, 10305], [10240, 10304, 10306], [10305, 10307], [10306, 10308, 10414], [10307, 10309], [10241, 10308, 10310], [10309, 10311], [10310, 10312, 10415], [10311, 10313], [10242, 10312, 10314], [10313, 10315], [10314, 10316, 10416], [10315, 10317], [10243, 10316, 10318], [10317, 10319], [10318, 10320, 10417], [10319, 10321], [10244, 10320, 10322], [10321, 10323], [10322, 10324, 10418], [10323, 10325], [10245, 10324, 10326], [10325, 10327], [10326, 10328, 10419], [10327, 10329], [10246, 10328, 10330], [10329, 10331], [10330, 10332, 10420], [10331, 10333], [10247, 10332, 10334], [10333, 10335], [10334, 10336, 10421], [10335, 10337], [10248, 10336, 10338], [10337, 10339], [10338, 10340, 10422], [10339, 10341], [10249, 10340, 10342], [10341, 10343], [10342, 10344, 10423], [10343, 10345], [10250, 10344, 10346], [10345, 10347], [10346, 10348, 10424], [10347, 10349], [10251, 10348, 10350], [10349, 10351], [10350, 10352, 10425], [10351, 10353], [10252, 10352, 10354], [10353, 10355], [10354, 10356, 10426], [10355, 10357], [10253, 10356, 10358], [10357, 10359], [10358, 10360, 10427], [10359, 10361], [10254, 10360, 10362], [10361, 10363], [10362, 10364, 10428], [10363, 10365], [10255, 10364, 10366], [10365, 10367], [10366, 10368, 10429], [10367, 10369], [10256, 10368, 10370], [10369, 10371], [10370, 10372, 10430], [10371, 10373], [10257, 10372, 10374], [10373, 10375], [10374, 10376, 10431], [10375, 10377], [10258, 10376, 10378], [10377, 10379], [10378, 10380, 10432], [10379, 10381], [10259, 10380, 10382], [10381, 10383], [10382, 10384, 10433], [10383, 10385], [10260, 10384, 10386], [10385, 10387], [10386, 10388, 10434], [10387, 10389], [10261, 10388, 10390], [10389, 10391], [10390, 10392, 10435], [10391, 10393], [10262, 10392, 10394], [10393, 10395], [10394, 10396, 10436], [10395, 10397], [10263, 10396, 10398], [10397, 10399], [10398, 10400, 10437], [10399, 10401], [10264, 10400, 10402], [10401, 10403], [10402, 10438], [10267, 10441], [10271, 10445], [10275, 10449], [10279, 10453], [10283, 10457], [10287, 10461], [10291, 10465], [10295, 10469], [10299, 10473], [10303, 10477], [10307, 10481], [10311, 10485], [10315, 10489], [10319, 10493], [10323, 10497], [10327, 10501], [10331, 10505], [10335, 10509], [10339, 10513], [10343, 10517], [10347, 10521], [10351, 10525], [10355, 10529], [10359, 10533], [10363, 10537], [10367, 10541], [10371, 10545], [10375, 10549], [10379, 10553], [10383, 10557], [10387, 10561], [10391, 10565], [10395, 10569], [10399, 10573], [10403, 10577], [10440, 10578], [10439, 10441], [10404, 10440, 10442], [10441, 10443], [10442, 10444, 10579], [10443, 10445], [10405, 10444, 10446], [10445, 10447], [10446, 10448, 10580], [10447, 10449], [10406, 10448, 10450], [10449, 10451], [10450, 10452, 10581], [10451, 10453], [10407, 10452, 10454], [10453, 10455], [10454, 10456, 10582], [10455, 10457], [10408, 10456, 10458], [10457, 10459], [10458, 10460, 10583], [10459, 10461], [10409, 10460, 10462], [10461, 10463], [10462, 10464, 10584], [10463, 10465], [10410, 10464, 10466], [10465, 10467], [10466, 10468, 10585], [10467, 10469], [10411, 10468, 10470], [10469, 10471], [10470, 10472, 10586], [10471, 10473], [10412, 10472, 10474], [10473, 10475], [10474, 10476, 10587], [10475, 10477], [10413, 10476, 10478], [10477, 10479], [10478, 10480, 10588], [10479, 10481], [10414, 10480, 10482], [10481, 10483], [10482, 10484, 10589], [10483, 10485], [10415, 10484, 10486], [10485, 10487], [10486, 10488, 10590], [10487, 10489], [10416, 10488, 10490], [10489, 10491], [10490, 10492, 10591], [10491, 10493], [10417, 10492, 10494], [10493, 10495], [10494, 10496, 10592], [10495, 10497], [10418, 10496, 10498], [10497, 10499], [10498, 10500, 10593], [10499, 10501], [10419, 10500, 10502], [10501, 10503], [10502, 10504, 10594], [10503, 10505], [10420, 10504, 10506], [10505, 10507], [10506, 10508, 10595], [10507, 10509], [10421, 10508, 10510], [10509, 10511], [10510, 10512, 10596], [10511, 10513], [10422, 10512, 10514], [10513, 10515], [10514, 10516, 10597], [10515, 10517], [10423, 10516, 10518], [10517, 10519], [10518, 10520, 10598], [10519, 10521], [10424, 10520, 10522], [10521, 10523], [10522, 10524, 10599], [10523, 10525], [10425, 10524, 10526], [10525, 10527], [10526, 10528, 10600], [10527, 10529], [10426, 10528, 10530], [10529, 10531], [10530, 10532, 10601], [10531, 10533], [10427, 10532, 10534], [10533, 10535], [10534, 10536, 10602], [10535, 10537], [10428, 10536, 10538], [10537, 10539], [10538, 10540, 10603], [10539, 10541], [10429, 10540, 10542], [10541, 10543], [10542, 10544, 10604], [10543, 10545], [10430, 10544, 10546], [10545, 10547], [10546, 10548, 10605], [10547, 10549], [10431, 10548, 10550], [10549, 10551], [10550, 10552, 10606], [10551, 10553], [10432, 10552, 10554], [10553, 10555], [10554, 10556, 10607], [10555, 10557], [10433, 10556, 10558], [10557, 10559], [10558, 10560, 10608], [10559, 10561], [10434, 10560, 10562], [10561, 10563], [10562, 10564, 10609], [10563, 10565], [10435, 10564, 10566], [10565, 10567], [10566, 10568, 10610], [10567, 10569], [10436, 10568, 10570], [10569, 10571], [10570, 10572, 10611], [10571, 10573], [10437, 10572, 10574], [10573, 10575], [10574, 10576, 10612], [10575, 10577], [10438, 10576], [10439, 10613], [10443, 10617], [10447, 10621], [10451, 10625], [10455, 10629], [10459, 10633], [10463, 10637], [10467, 10641], [10471, 10645], [10475, 10649], [10479, 10653], [10483, 10657], [10487, 10661], [10491, 10665], [10495, 10669], [10499, 10673], [10503, 10677], [10507, 10681], [10511, 10685], [10515, 10689], [10519, 10693], [10523, 10697], [10527, 10701], [10531, 10705], [10535, 10709], [10539, 10713], [10543, 10717], [10547, 10721], [10551, 10725], [10555, 10729], [10559, 10733], [10563, 10737], [10567, 10741], [10571, 10745], [10575, 10749], [10578, 10614], [10613, 10615], [10614, 10616, 10752], [10615, 10617], [10579, 10616, 10618], [10617, 10619], [10618, 10620, 10753], [10619, 10621], [10580, 10620, 10622], [10621, 10623], [10622, 10624, 10754], [10623, 10625], [10581, 10624, 10626], [10625, 10627], [10626, 10628, 10755], [10627, 10629], [10582, 10628, 10630], [10629, 10631], [10630, 10632, 10756], [10631, 10633], [10583, 10632, 10634], [10633, 10635], [10634, 10636, 10757], [10635, 10637], [10584, 10636, 10638], [10637, 10639], [10638, 10640, 10758], [10639, 10641], [10585, 10640, 10642], [10641, 10643], [10642, 10644, 10759], [10643, 10645], [10586, 10644, 10646], [10645, 10647], [10646, 10648, 10760], [10647, 10649], [10587, 10648, 10650], [10649, 10651], [10650, 10652, 10761], [10651, 10653], [10588, 10652, 10654], [10653, 10655], [10654, 10656, 10762], [10655, 10657], [10589, 10656, 10658], [10657, 10659], [10658, 10660, 10763], [10659, 10661], [10590, 10660, 10662], [10661, 10663], [10662, 10664, 10764], [10663, 10665], [10591, 10664, 10666], [10665, 10667], [10666, 10668, 10765], [10667, 10669], [10592, 10668, 10670], [10669, 10671], [10670, 10672, 10766], [10671, 10673], [10593, 10672, 10674], [10673, 10675], [10674, 10676, 10767], [10675, 10677], [10594, 10676, 10678], [10677, 10679], [10678, 10680, 10768], [10679, 10681], [10595, 10680, 10682], [10681, 10683], [10682, 10684, 10769], [10683, 10685], [10596, 10684, 10686], [10685, 10687], [10686, 10688, 10770], [10687, 10689], [10597, 10688, 10690], [10689, 10691], [10690, 10692, 10771], [10691, 10693], [10598, 10692, 10694], [10693, 10695], [10694, 10696, 10772], [10695, 10697], [10599, 10696, 10698], [10697, 10699], [10698, 10700, 10773], [10699, 10701], [10600, 10700, 10702], [10701, 10703], [10702, 10704, 10774], [10703, 10705], [10601, 10704, 10706], [10705, 10707], [10706, 10708, 10775], [10707, 10709], [10602, 10708, 10710], [10709, 10711], [10710, 10712, 10776], [10711, 10713], [10603, 10712, 10714], [10713, 10715], [10714, 10716, 10777], [10715, 10717], [10604, 10716, 10718], [10717, 10719], [10718, 10720, 10778], [10719, 10721], [10605, 10720, 10722], [10721, 10723], [10722, 10724, 10779], [10723, 10725], [10606, 10724, 10726], [10725, 10727], [10726, 10728, 10780], [10727, 10729], [10607, 10728, 10730], [10729, 10731], [10730, 10732, 10781], [10731, 10733], [10608, 10732, 10734], [10733, 10735], [10734, 10736, 10782], [10735, 10737], [10609, 10736, 10738], [10737, 10739], [10738, 10740, 10783], [10739, 10741], [10610, 10740, 10742], [10741, 10743], [10742, 10744, 10784], [10743, 10745], [10611, 10744, 10746], [10745, 10747], [10746, 10748, 10785], [10747, 10749], [10612, 10748, 10750], [10749, 10751], [10750, 10786], [10615, 10789], [10619, 10793], [10623, 10797], [10627, 10801], [10631, 10805], [10635, 10809], [10639, 10813], [10643, 10817], [10647, 10821], [10651, 10825], [10655, 10829], [10659, 10833], [10663, 10837], [10667, 10841], [10671, 10845], [10675, 10849], [10679, 10853], [10683, 10857], [10687, 10861], [10691, 10865], [10695, 10869], [10699, 10873], [10703, 10877], [10707, 10881], [10711, 10885], [10715, 10889], [10719, 10893], [10723, 10897], [10727, 10901], [10731, 10905], [10735, 10909], [10739, 10913], [10743, 10917], [10747, 10921], [10751, 10925], [10788, 10926], [10787, 10789], [10752, 10788, 10790], [10789, 10791], [10790, 10792, 10927], [10791, 10793], [10753, 10792, 10794], [10793, 10795], [10794, 10796, 10928], [10795, 10797], [10754, 10796, 10798], [10797, 10799], [10798, 10800, 10929], [10799, 10801], [10755, 10800, 10802], [10801, 10803], [10802, 10804, 10930], [10803, 10805], [10756, 10804, 10806], [10805, 10807], [10806, 10808, 10931], [10807, 10809], [10757, 10808, 10810], [10809, 10811], [10810, 10812, 10932], [10811, 10813], [10758, 10812, 10814], [10813, 10815], [10814, 10816, 10933], [10815, 10817], [10759, 10816, 10818], [10817, 10819], [10818, 10820, 10934], [10819, 10821], [10760, 10820, 10822], [10821, 10823], [10822, 10824, 10935], [10823, 10825], [10761, 10824, 10826], [10825, 10827], [10826, 10828, 10936], [10827, 10829], [10762, 10828, 10830], [10829, 10831], [10830, 10832, 10937], [10831, 10833], [10763, 10832, 10834], [10833, 10835], [10834, 10836, 10938], [10835, 10837], [10764, 10836, 10838], [10837, 10839], [10838, 10840, 10939], [10839, 10841], [10765, 10840, 10842], [10841, 10843], [10842, 10844, 10940], [10843, 10845], [10766, 10844, 10846], [10845, 10847], [10846, 10848, 10941], [10847, 10849], [10767, 10848, 10850], [10849, 10851], [10850, 10852, 10942], [10851, 10853], [10768, 10852, 10854], [10853, 10855], [10854, 10856, 10943], [10855, 10857], [10769, 10856, 10858], [10857, 10859], [10858, 10860, 10944], [10859, 10861], [10770, 10860, 10862], [10861, 10863], [10862, 10864, 10945], [10863, 10865], [10771, 10864, 10866], [10865, 10867], [10866, 10868, 10946], [10867, 10869], [10772, 10868, 10870], [10869, 10871], [10870, 10872, 10947], [10871, 10873], [10773, 10872, 10874], [10873, 10875], [10874, 10876, 10948], [10875, 10877], [10774, 10876, 10878], [10877, 10879], [10878, 10880, 10949], [10879, 10881], [10775, 10880, 10882], [10881, 10883], [10882, 10884, 10950], [10883, 10885], [10776, 10884, 10886], [10885, 10887], [10886, 10888, 10951], [10887, 10889], [10777, 10888, 10890], [10889, 10891], [10890, 10892, 10952], [10891, 10893], [10778, 10892, 10894], [10893, 10895], [10894, 10896, 10953], [10895, 10897], [10779, 10896, 10898], [10897, 10899], [10898, 10900, 10954], [10899, 10901], [10780, 10900, 10902], [10901, 10903], [10902, 10904, 10955], [10903, 10905], [10781, 10904, 10906], [10905, 10907], [10906, 10908, 10956], [10907, 10909], [10782, 10908, 10910], [10909, 10911], [10910, 10912, 10957], [10911, 10913], [10783, 10912, 10914], [10913, 10915], [10914, 10916, 10958], [10915, 10917], [10784, 10916, 10918], [10917, 10919], [10918, 10920, 10959], [10919, 10921], [10785, 10920, 10922], [10921, 10923], [10922, 10924, 10960], [10923, 10925], [10786, 10924], [10787, 10961], [10791, 10965], [10795, 10969], [10799, 10973], [10803, 10977], [10807, 10981], [10811, 10985], [10815, 10989], [10819, 10993], [10823, 10997], [10827, 11001], [10831, 11005], [10835, 11009], [10839, 11013], [10843, 11017], [10847, 11021], [10851, 11025], [10855, 11029], [10859, 11033], [10863, 11037], [10867, 11041], [10871, 11045], [10875, 11049], [10879, 11053], [10883, 11057], [10887, 11061], [10891, 11065], [10895, 11069], [10899, 11073], [10903, 11077], [10907, 11081], [10911, 11085], [10915, 11089], [10919, 11093], [10923, 11097], [10926, 10962], [10961, 10963], [10962, 10964, 11100], [10963, 10965], [10927, 10964, 10966], [10965, 10967], [10966, 10968, 11101], [10967, 10969], [10928, 10968, 10970], [10969, 10971], [10970, 10972, 11102], [10971, 10973], [10929, 10972, 10974], [10973, 10975], [10974, 10976, 11103], [10975, 10977], [10930, 10976, 10978], [10977, 10979], [10978, 10980, 11104], [10979, 10981], [10931, 10980, 10982], [10981, 10983], [10982, 10984, 11105], [10983, 10985], [10932, 10984, 10986], [10985, 10987], [10986, 10988, 11106], [10987, 10989], [10933, 10988, 10990], [10989, 10991], [10990, 10992, 11107], [10991, 10993], [10934, 10992, 10994], [10993, 10995], [10994, 10996, 11108], [10995, 10997], [10935, 10996, 10998], [10997, 10999], [10998, 11000, 11109], [10999, 11001], [10936, 11000, 11002], [11001, 11003], [11002, 11004, 11110], [11003, 11005], [10937, 11004, 11006], [11005, 11007], [11006, 11008, 11111], [11007, 11009], [10938, 11008, 11010], [11009, 11011], [11010, 11012, 11112], [11011, 11013], [10939, 11012, 11014], [11013, 11015], [11014, 11016, 11113], [11015, 11017], [10940, 11016, 11018], [11017, 11019], [11018, 11020, 11114], [11019, 11021], [10941, 11020, 11022], [11021, 11023], [11022, 11024, 11115], [11023, 11025], [10942, 11024, 11026], [11025, 11027], [11026, 11028, 11116], [11027, 11029], [10943, 11028, 11030], [11029, 11031], [11030, 11032, 11117], [11031, 11033], [10944, 11032, 11034], [11033, 11035], [11034, 11036, 11118], [11035, 11037], [10945, 11036, 11038], [11037, 11039], [11038, 11040, 11119], [11039, 11041], [10946, 11040, 11042], [11041, 11043], [11042, 11044, 11120], [11043, 11045], [10947, 11044, 11046], [11045, 11047], [11046, 11048, 11121], [11047, 11049], [10948, 11048, 11050], [11049, 11051], [11050, 11052, 11122], [11051, 11053], [10949, 11052, 11054], [11053, 11055], [11054, 11056, 11123], [11055, 11057], [10950, 11056, 11058], [11057, 11059], [11058, 11060, 11124], [11059, 11061], [10951, 11060, 11062], [11061, 11063], [11062, 11064, 11125], [11063, 11065], [10952, 11064, 11066], [11065, 11067], [11066, 11068, 11126], [11067, 11069], [10953, 11068, 11070], [11069, 11071], [11070, 11072, 11127], [11071, 11073], [10954, 11072, 11074], [11073, 11075], [11074, 11076, 11128], [11075, 11077], [10955, 11076, 11078], [11077, 11079], [11078, 11080, 11129], [11079, 11081], [10956, 11080, 11082], [11081, 11083], [11082, 11084, 11130], [11083, 11085], [10957, 11084, 11086], [11085, 11087], [11086, 11088, 11131], [11087, 11089], [10958, 11088, 11090], [11089, 11091], [11090, 11092, 11132], [11091, 11093], [10959, 11092, 11094], [11093, 11095], [11094, 11096, 11133], [11095, 11097], [10960, 11096, 11098], [11097, 11099], [11098, 11134], [10963, 11137], [10967, 11141], [10971, 11145], [10975, 11149], [10979, 11153], [10983, 11157], [10987, 11161], [10991, 11165], [10995, 11169], [10999, 11173], [11003, 11177], [11007, 11181], [11011, 11185], [11015, 11189], [11019, 11193], [11023, 11197], [11027, 11201], [11031, 11205], [11035, 11209], [11039, 11213], [11043, 11217], [11047, 11221], [11051, 11225], [11055, 11229], [11059, 11233], [11063, 11237], [11067, 11241], [11071, 11245], [11075, 11249], [11079, 11253], [11083, 11257], [11087, 11261], [11091, 11265], [11095, 11269], [11099, 11273], [11136, 11274], [11135, 11137], [11100, 11136, 11138], [11137, 11139], [11138, 11140, 11275], [11139, 11141], [11101, 11140, 11142], [11141, 11143], [11142, 11144, 11276], [11143, 11145], [11102, 11144, 11146], [11145, 11147], [11146, 11148, 11277], [11147, 11149], [11103, 11148, 11150], [11149, 11151], [11150, 11152, 11278], [11151, 11153], [11104, 11152, 11154], [11153, 11155], [11154, 11156, 11279], [11155, 11157], [11105, 11156, 11158], [11157, 11159], [11158, 11160, 11280], [11159, 11161], [11106, 11160, 11162], [11161, 11163], [11162, 11164, 11281], [11163, 11165], [11107, 11164, 11166], [11165, 11167], [11166, 11168, 11282], [11167, 11169], [11108, 11168, 11170], [11169, 11171], [11170, 11172, 11283], [11171, 11173], [11109, 11172, 11174], [11173, 11175], [11174, 11176, 11284], [11175, 11177], [11110, 11176, 11178], [11177, 11179], [11178, 11180, 11285], [11179, 11181], [11111, 11180, 11182], [11181, 11183], [11182, 11184, 11286], [11183, 11185], [11112, 11184, 11186], [11185, 11187], [11186, 11188, 11287], [11187, 11189], [11113, 11188, 11190], [11189, 11191], [11190, 11192, 11288], [11191, 11193], [11114, 11192, 11194], [11193, 11195], [11194, 11196, 11289], [11195, 11197], [11115, 11196, 11198], [11197, 11199], [11198, 11200, 11290], [11199, 11201], [11116, 11200, 11202], [11201, 11203], [11202, 11204, 11291], [11203, 11205], [11117, 11204, 11206], [11205, 11207], [11206, 11208, 11292], [11207, 11209], [11118, 11208, 11210], [11209, 11211], [11210, 11212, 11293], [11211, 11213], [11119, 11212, 11214], [11213, 11215], [11214, 11216, 11294], [11215, 11217], [11120, 11216, 11218], [11217, 11219], [11218, 11220, 11295], [11219, 11221], [11121, 11220, 11222], [11221, 11223], [11222, 11224, 11296], [11223, 11225], [11122, 11224, 11226], [11225, 11227], [11226, 11228, 11297], [11227, 11229], [11123, 11228, 11230], [11229, 11231], [11230, 11232, 11298], [11231, 11233], [11124, 11232, 11234], [11233, 11235], [11234, 11236, 11299], [11235, 11237], [11125, 11236, 11238], [11237, 11239], [11238, 11240, 11300], [11239, 11241], [11126, 11240, 11242], [11241, 11243], [11242, 11244, 11301], [11243, 11245], [11127, 11244, 11246], [11245, 11247], [11246, 11248, 11302], [11247, 11249], [11128, 11248, 11250], [11249, 11251], [11250, 11252, 11303], [11251, 11253], [11129, 11252, 11254], [11253, 11255], [11254, 11256, 11304], [11255, 11257], [11130, 11256, 11258], [11257, 11259], [11258, 11260, 11305], [11259, 11261], [11131, 11260, 11262], [11261, 11263], [11262, 11264, 11306], [11263, 11265], [11132, 11264, 11266], [11265, 11267], [11266, 11268, 11307], [11267, 11269], [11133, 11268, 11270], [11269, 11271], [11270, 11272, 11308], [11271, 11273], [11134, 11272], [11135, 11309], [11139, 11313], [11143, 11317], [11147, 11321], [11151, 11325], [11155, 11329], [11159, 11333], [11163, 11337], [11167, 11341], [11171, 11345], [11175, 11349], [11179, 11353], [11183, 11357], [11187, 11361], [11191, 11365], [11195, 11369], [11199, 11373], [11203, 11377], [11207, 11381], [11211, 11385], [11215, 11389], [11219, 11393], [11223, 11397], [11227, 11401], [11231, 11405], [11235, 11409], [11239, 11413], [11243, 11417], [11247, 11421], [11251, 11425], [11255, 11429], [11259, 11433], [11263, 11437], [11267, 11441], [11271, 11445], [11274, 11310], [11309, 11311], [11310, 11312, 11448], [11311, 11313], [11275, 11312, 11314], [11313, 11315], [11314, 11316, 11449], [11315, 11317], [11276, 11316, 11318], [11317, 11319], [11318, 11320, 11450], [11319, 11321], [11277, 11320, 11322], [11321, 11323], [11322, 11324, 11451], [11323, 11325], [11278, 11324, 11326], [11325, 11327], [11326, 11328, 11452], [11327, 11329], [11279, 11328, 11330], [11329, 11331], [11330, 11332, 11453], [11331, 11333], [11280, 11332, 11334], [11333, 11335], [11334, 11336, 11454], [11335, 11337], [11281, 11336, 11338], [11337, 11339], [11338, 11340, 11455], [11339, 11341], [11282, 11340, 11342], [11341, 11343], [11342, 11344, 11456], [11343, 11345], [11283, 11344, 11346], [11345, 11347], [11346, 11348, 11457], [11347, 11349], [11284, 11348, 11350], [11349, 11351], [11350, 11352, 11458], [11351, 11353], [11285, 11352, 11354], [11353, 11355], [11354, 11356, 11459], [11355, 11357], [11286, 11356, 11358], [11357, 11359], [11358, 11360, 11460], [11359, 11361], [11287, 11360, 11362], [11361, 11363], [11362, 11364, 11461], [11363, 11365], [11288, 11364, 11366], [11365, 11367], [11366, 11368, 11462], [11367, 11369], [11289, 11368, 11370], [11369, 11371], [11370, 11372, 11463], [11371, 11373], [11290, 11372, 11374], [11373, 11375], [11374, 11376, 11464], [11375, 11377], [11291, 11376, 11378], [11377, 11379], [11378, 11380, 11465], [11379, 11381], [11292, 11380, 11382], [11381, 11383], [11382, 11384, 11466], [11383, 11385], [11293, 11384, 11386], [11385, 11387], [11386, 11388, 11467], [11387, 11389], [11294, 11388, 11390], [11389, 11391], [11390, 11392, 11468], [11391, 11393], [11295, 11392, 11394], [11393, 11395], [11394, 11396, 11469], [11395, 11397], [11296, 11396, 11398], [11397, 11399], [11398, 11400, 11470], [11399, 11401], [11297, 11400, 11402], [11401, 11403], [11402, 11404, 11471], [11403, 11405], [11298, 11404, 11406], [11405, 11407], [11406, 11408, 11472], [11407, 11409], [11299, 11408, 11410], [11409, 11411], [11410, 11412, 11473], [11411, 11413], [11300, 11412, 11414], [11413, 11415], [11414, 11416, 11474], [11415, 11417], [11301, 11416, 11418], [11417, 11419], [11418, 11420, 11475], [11419, 11421], [11302, 11420, 11422], [11421, 11423], [11422, 11424, 11476], [11423, 11425], [11303, 11424, 11426], [11425, 11427], [11426, 11428, 11477], [11427, 11429], [11304, 11428, 11430], [11429, 11431], [11430, 11432, 11478], [11431, 11433], [11305, 11432, 11434], [11433, 11435], [11434, 11436, 11479], [11435, 11437], [11306, 11436, 11438], [11437, 11439], [11438, 11440, 11480], [11439, 11441], [11307, 11440, 11442], [11441, 11443], [11442, 11444, 11481], [11443, 11445], [11308, 11444, 11446], [11445, 11447], [11446, 11482], [11311, 11485], [11315, 11489], [11319, 11493], [11323, 11497], [11327, 11501], [11331, 11505], [11335, 11509], [11339, 11513], [11343, 11517], [11347, 11521], [11351, 11525], [11355, 11529], [11359, 11533], [11363, 11537], [11367, 11541], [11371, 11545], [11375, 11549], [11379, 11553], [11383, 11557], [11387, 11561], [11391, 11565], [11395, 11569], [11399, 11573], [11403, 11577], [11407, 11581], [11411, 11585], [11415, 11589], [11419, 11593], [11423, 11597], [11427, 11601], [11431, 11605], [11435, 11609], [11439, 11613], [11443, 11617], [11447, 11621], [11484, 11622], [11483, 11485], [11448, 11484, 11486], [11485, 11487], [11486, 11488, 11623], [11487, 11489], [11449, 11488, 11490], [11489, 11491], [11490, 11492, 11624], [11491, 11493], [11450, 11492, 11494], [11493, 11495], [11494, 11496, 11625], [11495, 11497], [11451, 11496, 11498], [11497, 11499], [11498, 11500, 11626], [11499, 11501], [11452, 11500, 11502], [11501, 11503], [11502, 11504, 11627], [11503, 11505], [11453, 11504, 11506], [11505, 11507], [11506, 11508, 11628], [11507, 11509], [11454, 11508, 11510], [11509, 11511], [11510, 11512, 11629], [11511, 11513], [11455, 11512, 11514], [11513, 11515], [11514, 11516, 11630], [11515, 11517], [11456, 11516, 11518], [11517, 11519], [11518, 11520, 11631], [11519, 11521], [11457, 11520, 11522], [11521, 11523], [11522, 11524, 11632], [11523, 11525], [11458, 11524, 11526], [11525, 11527], [11526, 11528, 11633], [11527, 11529], [11459, 11528, 11530], [11529, 11531], [11530, 11532, 11634], [11531, 11533], [11460, 11532, 11534], [11533, 11535], [11534, 11536, 11635], [11535, 11537], [11461, 11536, 11538], [11537, 11539], [11538, 11540, 11636], [11539, 11541], [11462, 11540, 11542], [11541, 11543], [11542, 11544, 11637], [11543, 11545], [11463, 11544, 11546], [11545, 11547], [11546, 11548, 11638], [11547, 11549], [11464, 11548, 11550], [11549, 11551], [11550, 11552, 11639], [11551, 11553], [11465, 11552, 11554], [11553, 11555], [11554, 11556, 11640], [11555, 11557], [11466, 11556, 11558], [11557, 11559], [11558, 11560, 11641], [11559, 11561], [11467, 11560, 11562], [11561, 11563], [11562, 11564, 11642], [11563, 11565], [11468, 11564, 11566], [11565, 11567], [11566, 11568, 11643], [11567, 11569], [11469, 11568, 11570], [11569, 11571], [11570, 11572, 11644], [11571, 11573], [11470, 11572, 11574], [11573, 11575], [11574, 11576, 11645], [11575, 11577], [11471, 11576, 11578], [11577, 11579], [11578, 11580, 11646], [11579, 11581], [11472, 11580, 11582], [11581, 11583], [11582, 11584, 11647], [11583, 11585], [11473, 11584, 11586], [11585, 11587], [11586, 11588, 11648], [11587, 11589], [11474, 11588, 11590], [11589, 11591], [11590, 11592, 11649], [11591, 11593], [11475, 11592, 11594], [11593, 11595], [11594, 11596, 11650], [11595, 11597], [11476, 11596, 11598], [11597, 11599], [11598, 11600, 11651], [11599, 11601], [11477, 11600, 11602], [11601, 11603], [11602, 11604, 11652], [11603, 11605], [11478, 11604, 11606], [11605, 11607], [11606, 11608, 11653], [11607, 11609], [11479, 11608, 11610], [11609, 11611], [11610, 11612, 11654], [11611, 11613], [11480, 11612, 11614], [11613, 11615], [11614, 11616, 11655], [11615, 11617], [11481, 11616, 11618], [11617, 11619], [11618, 11620, 11656], [11619, 11621], [11482, 11620], [11483, 11657], [11487, 11661], [11491, 11665], [11495, 11669], [11499, 11673], [11503, 11677], [11507, 11681], [11511, 11685], [11515, 11689], [11519, 11693], [11523, 11697], [11527, 11701], [11531, 11705], [11535, 11709], [11539, 11713], [11543, 11717], [11547, 11721], [11551, 11725], [11555, 11729], [11559, 11733], [11563, 11737], [11567, 11741], [11571, 11745], [11575, 11749], [11579, 11753], [11583, 11757], [11587, 11761], [11591, 11765], [11595, 11769], [11599, 11773], [11603, 11777], [11607, 11781], [11611, 11785], [11615, 11789], [11619, 11793], [11622, 11658], [11657, 11659], [11658, 11660, 11796], [11659, 11661], [11623, 11660, 11662], [11661, 11663], [11662, 11664, 11797], [11663, 11665], [11624, 11664, 11666], [11665, 11667], [11666, 11668, 11798], [11667, 11669], [11625, 11668, 11670], [11669, 11671], [11670, 11672, 11799], [11671, 11673], [11626, 11672, 11674], [11673, 11675], [11674, 11676, 11800], [11675, 11677], [11627, 11676, 11678], [11677, 11679], [11678, 11680, 11801], [11679, 11681], [11628, 11680, 11682], [11681, 11683], [11682, 11684, 11802], [11683, 11685], [11629, 11684, 11686], [11685, 11687], [11686, 11688, 11803], [11687, 11689], [11630, 11688, 11690], [11689, 11691], [11690, 11692, 11804], [11691, 11693], [11631, 11692, 11694], [11693, 11695], [11694, 11696, 11805], [11695, 11697], [11632, 11696, 11698], [11697, 11699], [11698, 11700, 11806], [11699, 11701], [11633, 11700, 11702], [11701, 11703], [11702, 11704, 11807], [11703, 11705], [11634, 11704, 11706], [11705, 11707], [11706, 11708, 11808], [11707, 11709], [11635, 11708, 11710], [11709, 11711], [11710, 11712, 11809], [11711, 11713], [11636, 11712, 11714], [11713, 11715], [11714, 11716, 11810], [11715, 11717], [11637, 11716, 11718], [11717, 11719], [11718, 11720, 11811], [11719, 11721], [11638, 11720, 11722], [11721, 11723], [11722, 11724, 11812], [11723, 11725], [11639, 11724, 11726], [11725, 11727], [11726, 11728, 11813], [11727, 11729], [11640, 11728, 11730], [11729, 11731], [11730, 11732, 11814], [11731, 11733], [11641, 11732, 11734], [11733, 11735], [11734, 11736, 11815], [11735, 11737], [11642, 11736, 11738], [11737, 11739], [11738, 11740, 11816], [11739, 11741], [11643, 11740, 11742], [11741, 11743], [11742, 11744, 11817], [11743, 11745], [11644, 11744, 11746], [11745, 11747], [11746, 11748, 11818], [11747, 11749], [11645, 11748, 11750], [11749, 11751], [11750, 11752, 11819], [11751, 11753], [11646, 11752, 11754], [11753, 11755], [11754, 11756, 11820], [11755, 11757], [11647, 11756, 11758], [11757, 11759], [11758, 11760, 11821], [11759, 11761], [11648, 11760, 11762], [11761, 11763], [11762, 11764, 11822], [11763, 11765], [11649, 11764, 11766], [11765, 11767], [11766, 11768, 11823], [11767, 11769], [11650, 11768, 11770], [11769, 11771], [11770, 11772, 11824], [11771, 11773], [11651, 11772, 11774], [11773, 11775], [11774, 11776, 11825], [11775, 11777], [11652, 11776, 11778], [11777, 11779], [11778, 11780, 11826], [11779, 11781], [11653, 11780, 11782], [11781, 11783], [11782, 11784, 11827], [11783, 11785], [11654, 11784, 11786], [11785, 11787], [11786, 11788, 11828], [11787, 11789], [11655, 11788, 11790], [11789, 11791], [11790, 11792, 11829], [11791, 11793], [11656, 11792, 11794], [11793, 11795], [11794, 11830], [11659, 11832], [11663, 11836], [11667, 11840], [11671, 11844], [11675, 11848], [11679, 11852], [11683, 11856], [11687, 11860], [11691, 11864], [11695, 11868], [11699, 11872], [11703, 11876], [11707, 11880], [11711, 11884], [11715, 11888], [11719, 11892], [11723, 11896], [11727, 11900], [11731, 11904], [11735, 11908], [11739, 11912], [11743, 11916], [11747, 11920], [11751, 11924], [11755, 11928], [11759, 11932], [11763, 11936], [11767, 11940], [11771, 11944], [11775, 11948], [11779, 11952], [11783, 11956], [11787, 11960], [11791, 11964], [11795, 11968], [11832], [11796, 11831, 11833], [11832, 11834], [11833, 11835], [11834, 11836], [11797, 11835, 11837], [11836, 11838], [11837, 11839], [11838, 11840], [11798, 11839, 11841], [11840, 11842], [11841, 11843], [11842, 11844], [11799, 11843, 11845], [11844, 11846], [11845, 11847], [11846, 11848], [11800, 11847, 11849], [11848, 11850], [11849, 11851], [11850, 11852], [11801, 11851, 11853], [11852, 11854], [11853, 11855], [11854, 11856], [11802, 11855, 11857], [11856, 11858], [11857, 11859], [11858, 11860], [11803, 11859, 11861], [11860, 11862], [11861, 11863], [11862, 11864], [11804, 11863, 11865], [11864, 11866], [11865, 11867], [11866, 11868], [11805, 11867, 11869], [11868, 11870], [11869, 11871], [11870, 11872], [11806, 11871, 11873], [11872, 11874], [11873, 11875], [11874, 11876], [11807, 11875, 11877], [11876, 11878], [11877, 11879], [11878, 11880], [11808, 11879, 11881], [11880, 11882], [11881, 11883], [11882, 11884], [11809, 11883, 11885], [11884, 11886], [11885, 11887], [11886, 11888], [11810, 11887, 11889], [11888, 11890], [11889, 11891], [11890, 11892], [11811, 11891, 11893], [11892, 11894], [11893, 11895], [11894, 11896], [11812, 11895, 11897], [11896, 11898], [11897, 11899], [11898, 11900], [11813, 11899, 11901], [11900, 11902], [11901, 11903], [11902, 11904], [11814, 11903, 11905], [11904, 11906], [11905, 11907], [11906, 11908], [11815, 11907, 11909], [11908, 11910], [11909, 11911], [11910, 11912], [11816, 11911, 11913], [11912, 11914], [11913, 11915], [11914, 11916], [11817, 11915, 11917], [11916, 11918], [11917, 11919], [11918, 11920], [11818, 11919, 11921], [11920, 11922], [11921, 11923], [11922, 11924], [11819, 11923, 11925], [11924, 11926], [11925, 11927], [11926, 11928], [11820, 11927, 11929], [11928, 11930], [11929, 11931], [11930, 11932], [11821, 11931, 11933], [11932, 11934], [11933, 11935], [11934, 11936], [11822, 11935, 11937], [11936, 11938], [11937, 11939], [11938, 11940], [11823, 11939, 11941], [11940, 11942], [11941, 11943], [11942, 11944], [11824, 11943, 11945], [11944, 11946], [11945, 11947], [11946, 11948], [11825, 11947, 11949], [11948, 11950], [11949, 11951], [11950, 11952], [11826, 11951, 11953], [11952, 11954], [11953, 11955], [11954, 11956], [11827, 11955, 11957], [11956, 11958], [11957, 11959], [11958, 11960], [11828, 11959, 11961], [11960, 11962], [11961, 11963], [11962, 11964], [11829, 11963, 11965], [11964, 11966], [11965, 11967], [11966, 11968], [11830, 11967]] +CNOTERROR: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] +CNOTTIME: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] diff --git a/benchmark/topology/topo_2129.layout b/benchmark/topology/topo_2129.layout index 7e5708649..66b501b63 100644 --- a/benchmark/topology/topo_2129.layout +++ b/benchmark/topology/topo_2129.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1, 58], [0, 2], [1, 3], [2, 4], [3, 5, 59], [4, 6], [5, 7], [6, 8], [7, 9, 60], [8, 10], [9, 11], [10, 12], [11, 13, 61], [12, 14], [13, 15], [14, 16], [15, 17, 62], [16, 18], [17, 19], [18, 20], [19, 21, 63], [20, 22], [21, 23], [22, 24], [23, 25, 64], [24, 26], [25, 27], [26, 28], [27, 29, 65], [28, 30], [29, 31], [30, 32], [31, 33, 66], [32, 34], [33, 35], [34, 36], [35, 37, 67], [36, 38], [37, 39], [38, 40], [39, 41, 68], [40, 42], [41, 43], [42, 44], [43, 45, 69], [44, 46], [45, 47], [46, 48], [47, 49, 70], [48, 50], [49, 51], [50, 52], [51, 53, 71], [52, 54], [53, 55], [54, 56], [55, 57, 72], [56], [0, 73], [4, 77], [8, 81], [12, 85], [16, 89], [20, 93], [24, 97], [28, 101], [32, 105], [36, 109], [40, 113], [44, 117], [48, 121], [52, 125], [56, 129], [58, 74], [73, 75], [74, 76, 132], [75, 77], [59, 76, 78], [77, 79], [78, 80, 133], [79, 81], [60, 80, 82], [81, 83], [82, 84, 134], [83, 85], [61, 84, 86], [85, 87], [86, 88, 135], [87, 89], [62, 88, 90], [89, 91], [90, 92, 136], [91, 93], [63, 92, 94], [93, 95], [94, 96, 137], [95, 97], [64, 96, 98], [97, 99], [98, 100, 138], [99, 101], [65, 100, 102], [101, 103], [102, 104, 139], [103, 105], [66, 104, 106], [105, 107], [106, 108, 140], [107, 109], [67, 108, 110], [109, 111], [110, 112, 141], [111, 113], [68, 112, 114], [113, 115], [114, 116, 142], [115, 117], [69, 116, 118], [117, 119], [118, 120, 143], [119, 121], [70, 120, 122], [121, 123], [122, 124, 144], [123, 125], [71, 124, 126], [125, 127], [126, 128, 145], [127, 129], [72, 128, 130], [129, 131], [130, 146], [75, 149], [79, 153], [83, 157], [87, 161], [91, 165], [95, 169], [99, 173], [103, 177], [107, 181], [111, 185], [115, 189], [119, 193], [123, 197], [127, 201], [131, 205], [148, 206], [147, 149], [132, 148, 150], [149, 151], [150, 152, 207], [151, 153], [133, 152, 154], [153, 155], [154, 156, 208], [155, 157], [134, 156, 158], [157, 159], [158, 160, 209], [159, 161], [135, 160, 162], [161, 163], [162, 164, 210], [163, 165], [136, 164, 166], [165, 167], [166, 168, 211], [167, 169], [137, 168, 170], [169, 171], [170, 172, 212], [171, 173], [138, 172, 174], [173, 175], [174, 176, 213], [175, 177], [139, 176, 178], [177, 179], [178, 180, 214], [179, 181], [140, 180, 182], [181, 183], [182, 184, 215], [183, 185], [141, 184, 186], [185, 187], [186, 188, 216], [187, 189], [142, 188, 190], [189, 191], [190, 192, 217], [191, 193], [143, 192, 194], [193, 195], [194, 196, 218], [195, 197], [144, 196, 198], [197, 199], [198, 200, 219], [199, 201], [145, 200, 202], [201, 203], [202, 204, 220], [203, 205], [146, 204], [147, 221], [151, 225], [155, 229], [159, 233], [163, 237], [167, 241], [171, 245], [175, 249], [179, 253], [183, 257], [187, 261], [191, 265], [195, 269], [199, 273], [203, 277], [206, 222], [221, 223], [222, 224, 280], [223, 225], [207, 224, 226], [225, 227], [226, 228, 281], [227, 229], [208, 228, 230], [229, 231], [230, 232, 282], [231, 233], [209, 232, 234], [233, 235], [234, 236, 283], [235, 237], [210, 236, 238], [237, 239], [238, 240, 284], [239, 241], [211, 240, 242], [241, 243], [242, 244, 285], [243, 245], [212, 244, 246], [245, 247], [246, 248, 286], [247, 249], [213, 248, 250], [249, 251], [250, 252, 287], [251, 253], [214, 252, 254], [253, 255], [254, 256, 288], [255, 257], [215, 256, 258], [257, 259], [258, 260, 289], [259, 261], [216, 260, 262], [261, 263], [262, 264, 290], [263, 265], [217, 264, 266], [265, 267], [266, 268, 291], [267, 269], [218, 268, 270], [269, 271], [270, 272, 292], [271, 273], [219, 272, 274], [273, 275], [274, 276, 293], [275, 277], [220, 276, 278], [277, 279], [278, 294], [223, 297], [227, 301], [231, 305], [235, 309], [239, 313], [243, 317], [247, 321], [251, 325], [255, 329], [259, 333], [263, 337], [267, 341], [271, 345], [275, 349], [279, 353], [296, 354], [295, 297], [280, 296, 298], [297, 299], [298, 300, 355], [299, 301], [281, 300, 302], [301, 303], [302, 304, 356], [303, 305], [282, 304, 306], [305, 307], [306, 308, 357], [307, 309], [283, 308, 310], [309, 311], [310, 312, 358], [311, 313], [284, 312, 314], [313, 315], [314, 316, 359], [315, 317], [285, 316, 318], [317, 319], [318, 320, 360], [319, 321], [286, 320, 322], [321, 323], [322, 324, 361], [323, 325], [287, 324, 326], [325, 327], [326, 328, 362], [327, 329], [288, 328, 330], [329, 331], [330, 332, 363], [331, 333], [289, 332, 334], [333, 335], [334, 336, 364], [335, 337], [290, 336, 338], [337, 339], [338, 340, 365], [339, 341], [291, 340, 342], [341, 343], [342, 344, 366], [343, 345], [292, 344, 346], [345, 347], [346, 348, 367], [347, 349], [293, 348, 350], [349, 351], [350, 352, 368], [351, 353], [294, 352], [295, 369], [299, 373], [303, 377], [307, 381], [311, 385], [315, 389], [319, 393], [323, 397], [327, 401], [331, 405], [335, 409], [339, 413], [343, 417], [347, 421], [351, 425], [354, 370], [369, 371], [370, 372, 428], [371, 373], [355, 372, 374], [373, 375], [374, 376, 429], [375, 377], [356, 376, 378], [377, 379], [378, 380, 430], [379, 381], [357, 380, 382], [381, 383], [382, 384, 431], [383, 385], [358, 384, 386], [385, 387], [386, 388, 432], [387, 389], [359, 388, 390], [389, 391], [390, 392, 433], [391, 393], [360, 392, 394], [393, 395], [394, 396, 434], [395, 397], [361, 396, 398], [397, 399], [398, 400, 435], [399, 401], [362, 400, 402], [401, 403], [402, 404, 436], [403, 405], [363, 404, 406], [405, 407], [406, 408, 437], [407, 409], [364, 408, 410], [409, 411], [410, 412, 438], [411, 413], [365, 412, 414], [413, 415], [414, 416, 439], [415, 417], [366, 416, 418], [417, 419], [418, 420, 440], [419, 421], [367, 420, 422], [421, 423], [422, 424, 441], [423, 425], [368, 424, 426], [425, 427], [426, 442], [371, 445], [375, 449], [379, 453], [383, 457], [387, 461], [391, 465], [395, 469], [399, 473], [403, 477], [407, 481], [411, 485], [415, 489], [419, 493], [423, 497], [427, 501], [444, 502], [443, 445], [428, 444, 446], [445, 447], [446, 448, 503], [447, 449], [429, 448, 450], [449, 451], [450, 452, 504], [451, 453], [430, 452, 454], [453, 455], [454, 456, 505], [455, 457], [431, 456, 458], [457, 459], [458, 460, 506], [459, 461], [432, 460, 462], [461, 463], [462, 464, 507], [463, 465], [433, 464, 466], [465, 467], [466, 468, 508], [467, 469], [434, 468, 470], [469, 471], [470, 472, 509], [471, 473], [435, 472, 474], [473, 475], [474, 476, 510], [475, 477], [436, 476, 478], [477, 479], [478, 480, 511], [479, 481], [437, 480, 482], [481, 483], [482, 484, 512], [483, 485], [438, 484, 486], [485, 487], [486, 488, 513], [487, 489], [439, 488, 490], [489, 491], [490, 492, 514], [491, 493], [440, 492, 494], [493, 495], [494, 496, 515], [495, 497], [441, 496, 498], [497, 499], [498, 500, 516], [499, 501], [442, 500], [443, 517], [447, 521], [451, 525], [455, 529], [459, 533], [463, 537], [467, 541], [471, 545], [475, 549], [479, 553], [483, 557], [487, 561], [491, 565], [495, 569], [499, 573], [502, 518], [517, 519], [518, 520, 576], [519, 521], [503, 520, 522], [521, 523], [522, 524, 577], [523, 525], [504, 524, 526], [525, 527], [526, 528, 578], [527, 529], [505, 528, 530], [529, 531], [530, 532, 579], [531, 533], [506, 532, 534], [533, 535], [534, 536, 580], [535, 537], [507, 536, 538], [537, 539], [538, 540, 581], [539, 541], [508, 540, 542], [541, 543], [542, 544, 582], [543, 545], [509, 544, 546], [545, 547], [546, 548, 583], [547, 549], [510, 548, 550], [549, 551], [550, 552, 584], [551, 553], [511, 552, 554], [553, 555], [554, 556, 585], [555, 557], [512, 556, 558], [557, 559], [558, 560, 586], [559, 561], [513, 560, 562], [561, 563], [562, 564, 587], [563, 565], [514, 564, 566], [565, 567], [566, 568, 588], [567, 569], [515, 568, 570], [569, 571], [570, 572, 589], [571, 573], [516, 572, 574], [573, 575], [574, 590], [519, 593], [523, 597], [527, 601], [531, 605], [535, 609], [539, 613], [543, 617], [547, 621], [551, 625], [555, 629], [559, 633], [563, 637], [567, 641], [571, 645], [575, 649], [592, 650], [591, 593], [576, 592, 594], [593, 595], [594, 596, 651], [595, 597], [577, 596, 598], [597, 599], [598, 600, 652], [599, 601], [578, 600, 602], [601, 603], [602, 604, 653], [603, 605], [579, 604, 606], [605, 607], [606, 608, 654], [607, 609], [580, 608, 610], [609, 611], [610, 612, 655], [611, 613], [581, 612, 614], [613, 615], [614, 616, 656], [615, 617], [582, 616, 618], [617, 619], [618, 620, 657], [619, 621], [583, 620, 622], [621, 623], [622, 624, 658], [623, 625], [584, 624, 626], [625, 627], [626, 628, 659], [627, 629], [585, 628, 630], [629, 631], [630, 632, 660], [631, 633], [586, 632, 634], [633, 635], [634, 636, 661], [635, 637], [587, 636, 638], [637, 639], [638, 640, 662], [639, 641], [588, 640, 642], [641, 643], [642, 644, 663], [643, 645], [589, 644, 646], [645, 647], [646, 648, 664], [647, 649], [590, 648], [591, 665], [595, 669], [599, 673], [603, 677], [607, 681], [611, 685], [615, 689], [619, 693], [623, 697], [627, 701], [631, 705], [635, 709], [639, 713], [643, 717], [647, 721], [650, 666], [665, 667], [666, 668, 724], [667, 669], [651, 668, 670], [669, 671], [670, 672, 725], [671, 673], [652, 672, 674], [673, 675], [674, 676, 726], [675, 677], [653, 676, 678], [677, 679], [678, 680, 727], [679, 681], [654, 680, 682], [681, 683], [682, 684, 728], [683, 685], [655, 684, 686], [685, 687], [686, 688, 729], [687, 689], [656, 688, 690], [689, 691], [690, 692, 730], [691, 693], [657, 692, 694], [693, 695], [694, 696, 731], [695, 697], [658, 696, 698], [697, 699], [698, 700, 732], [699, 701], [659, 700, 702], [701, 703], [702, 704, 733], [703, 705], [660, 704, 706], [705, 707], [706, 708, 734], [707, 709], [661, 708, 710], [709, 711], [710, 712, 735], [711, 713], [662, 712, 714], [713, 715], [714, 716, 736], [715, 717], [663, 716, 718], [717, 719], [718, 720, 737], [719, 721], [664, 720, 722], [721, 723], [722, 738], [667, 741], [671, 745], [675, 749], [679, 753], [683, 757], [687, 761], [691, 765], [695, 769], [699, 773], [703, 777], [707, 781], [711, 785], [715, 789], [719, 793], [723, 797], [740, 798], [739, 741], [724, 740, 742], [741, 743], [742, 744, 799], [743, 745], [725, 744, 746], [745, 747], [746, 748, 800], [747, 749], [726, 748, 750], [749, 751], [750, 752, 801], [751, 753], [727, 752, 754], [753, 755], [754, 756, 802], [755, 757], [728, 756, 758], [757, 759], [758, 760, 803], [759, 761], [729, 760, 762], [761, 763], [762, 764, 804], [763, 765], [730, 764, 766], [765, 767], [766, 768, 805], [767, 769], [731, 768, 770], [769, 771], [770, 772, 806], [771, 773], [732, 772, 774], [773, 775], [774, 776, 807], [775, 777], [733, 776, 778], [777, 779], [778, 780, 808], [779, 781], [734, 780, 782], [781, 783], [782, 784, 809], [783, 785], [735, 784, 786], [785, 787], [786, 788, 810], [787, 789], [736, 788, 790], [789, 791], [790, 792, 811], [791, 793], [737, 792, 794], [793, 795], [794, 796, 812], [795, 797], [738, 796], [739, 813], [743, 817], [747, 821], [751, 825], [755, 829], [759, 833], [763, 837], [767, 841], [771, 845], [775, 849], [779, 853], [783, 857], [787, 861], [791, 865], [795, 869], [798, 814], [813, 815], [814, 816, 872], [815, 817], [799, 816, 818], [817, 819], [818, 820, 873], [819, 821], [800, 820, 822], [821, 823], [822, 824, 874], [823, 825], [801, 824, 826], [825, 827], [826, 828, 875], [827, 829], [802, 828, 830], [829, 831], [830, 832, 876], [831, 833], [803, 832, 834], [833, 835], [834, 836, 877], [835, 837], [804, 836, 838], [837, 839], [838, 840, 878], [839, 841], [805, 840, 842], [841, 843], [842, 844, 879], [843, 845], [806, 844, 846], [845, 847], [846, 848, 880], [847, 849], [807, 848, 850], [849, 851], [850, 852, 881], [851, 853], [808, 852, 854], [853, 855], [854, 856, 882], [855, 857], [809, 856, 858], [857, 859], [858, 860, 883], [859, 861], [810, 860, 862], [861, 863], [862, 864, 884], [863, 865], [811, 864, 866], [865, 867], [866, 868, 885], [867, 869], [812, 868, 870], [869, 871], [870, 886], [815, 889], [819, 893], [823, 897], [827, 901], [831, 905], [835, 909], [839, 913], [843, 917], [847, 921], [851, 925], [855, 929], [859, 933], [863, 937], [867, 941], [871, 945], [888, 946], [887, 889], [872, 888, 890], [889, 891], [890, 892, 947], [891, 893], [873, 892, 894], [893, 895], [894, 896, 948], [895, 897], [874, 896, 898], [897, 899], [898, 900, 949], [899, 901], [875, 900, 902], [901, 903], [902, 904, 950], [903, 905], [876, 904, 906], [905, 907], [906, 908, 951], [907, 909], [877, 908, 910], [909, 911], [910, 912, 952], [911, 913], [878, 912, 914], [913, 915], [914, 916, 953], [915, 917], [879, 916, 918], [917, 919], [918, 920, 954], [919, 921], [880, 920, 922], [921, 923], [922, 924, 955], [923, 925], [881, 924, 926], [925, 927], [926, 928, 956], [927, 929], [882, 928, 930], [929, 931], [930, 932, 957], [931, 933], [883, 932, 934], [933, 935], [934, 936, 958], [935, 937], [884, 936, 938], [937, 939], [938, 940, 959], [939, 941], [885, 940, 942], [941, 943], [942, 944, 960], [943, 945], [886, 944], [887, 961], [891, 965], [895, 969], [899, 973], [903, 977], [907, 981], [911, 985], [915, 989], [919, 993], [923, 997], [927, 1001], [931, 1005], [935, 1009], [939, 1013], [943, 1017], [946, 962], [961, 963], [962, 964, 1020], [963, 965], [947, 964, 966], [965, 967], [966, 968, 1021], [967, 969], [948, 968, 970], [969, 971], [970, 972, 1022], [971, 973], [949, 972, 974], [973, 975], [974, 976, 1023], [975, 977], [950, 976, 978], [977, 979], [978, 980, 1024], [979, 981], [951, 980, 982], [981, 983], [982, 984, 1025], [983, 985], [952, 984, 986], [985, 987], [986, 988, 1026], [987, 989], [953, 988, 990], [989, 991], [990, 992, 1027], [991, 993], [954, 992, 994], [993, 995], [994, 996, 1028], [995, 997], [955, 996, 998], [997, 999], [998, 1000, 1029], [999, 1001], [956, 1000, 1002], [1001, 1003], [1002, 1004, 1030], [1003, 1005], [957, 1004, 1006], [1005, 1007], [1006, 1008, 1031], [1007, 1009], [958, 1008, 1010], [1009, 1011], [1010, 1012, 1032], [1011, 1013], [959, 1012, 1014], [1013, 1015], [1014, 1016, 1033], [1015, 1017], [960, 1016, 1018], [1017, 1019], [1018, 1034], [963, 1037], [967, 1041], [971, 1045], [975, 1049], [979, 1053], [983, 1057], [987, 1061], [991, 1065], [995, 1069], [999, 1073], [1003, 1077], [1007, 1081], [1011, 1085], [1015, 1089], [1019, 1093], [1036, 1094], [1035, 1037], [1020, 1036, 1038], [1037, 1039], [1038, 1040, 1095], [1039, 1041], [1021, 1040, 1042], [1041, 1043], [1042, 1044, 1096], [1043, 1045], [1022, 1044, 1046], [1045, 1047], [1046, 1048, 1097], [1047, 1049], [1023, 1048, 1050], [1049, 1051], [1050, 1052, 1098], [1051, 1053], [1024, 1052, 1054], [1053, 1055], [1054, 1056, 1099], [1055, 1057], [1025, 1056, 1058], [1057, 1059], [1058, 1060, 1100], [1059, 1061], [1026, 1060, 1062], [1061, 1063], [1062, 1064, 1101], [1063, 1065], [1027, 1064, 1066], [1065, 1067], [1066, 1068, 1102], [1067, 1069], [1028, 1068, 1070], [1069, 1071], [1070, 1072, 1103], [1071, 1073], [1029, 1072, 1074], [1073, 1075], [1074, 1076, 1104], [1075, 1077], [1030, 1076, 1078], [1077, 1079], [1078, 1080, 1105], [1079, 1081], [1031, 1080, 1082], [1081, 1083], [1082, 1084, 1106], [1083, 1085], [1032, 1084, 1086], [1085, 1087], [1086, 1088, 1107], [1087, 1089], [1033, 1088, 1090], [1089, 1091], [1090, 1092, 1108], [1091, 1093], [1034, 1092], [1035, 1109], [1039, 1113], [1043, 1117], [1047, 1121], [1051, 1125], [1055, 1129], [1059, 1133], [1063, 1137], [1067, 1141], [1071, 1145], [1075, 1149], [1079, 1153], [1083, 1157], [1087, 1161], [1091, 1165], [1094, 1110], [1109, 1111], [1110, 1112, 1168], [1111, 1113], [1095, 1112, 1114], [1113, 1115], [1114, 1116, 1169], [1115, 1117], [1096, 1116, 1118], [1117, 1119], [1118, 1120, 1170], [1119, 1121], [1097, 1120, 1122], [1121, 1123], [1122, 1124, 1171], [1123, 1125], [1098, 1124, 1126], [1125, 1127], [1126, 1128, 1172], [1127, 1129], [1099, 1128, 1130], [1129, 1131], [1130, 1132, 1173], [1131, 1133], [1100, 1132, 1134], [1133, 1135], [1134, 1136, 1174], [1135, 1137], [1101, 1136, 1138], [1137, 1139], [1138, 1140, 1175], [1139, 1141], [1102, 1140, 1142], [1141, 1143], [1142, 1144, 1176], [1143, 1145], [1103, 1144, 1146], [1145, 1147], [1146, 1148, 1177], [1147, 1149], [1104, 1148, 1150], [1149, 1151], [1150, 1152, 1178], [1151, 1153], [1105, 1152, 1154], [1153, 1155], [1154, 1156, 1179], [1155, 1157], [1106, 1156, 1158], [1157, 1159], [1158, 1160, 1180], [1159, 1161], [1107, 1160, 1162], [1161, 1163], [1162, 1164, 1181], [1163, 1165], [1108, 1164, 1166], [1165, 1167], [1166, 1182], [1111, 1185], [1115, 1189], [1119, 1193], [1123, 1197], [1127, 1201], [1131, 1205], [1135, 1209], [1139, 1213], [1143, 1217], [1147, 1221], [1151, 1225], [1155, 1229], [1159, 1233], [1163, 1237], [1167, 1241], [1184, 1242], [1183, 1185], [1168, 1184, 1186], [1185, 1187], [1186, 1188, 1243], [1187, 1189], [1169, 1188, 1190], [1189, 1191], [1190, 1192, 1244], [1191, 1193], [1170, 1192, 1194], [1193, 1195], [1194, 1196, 1245], [1195, 1197], [1171, 1196, 1198], [1197, 1199], [1198, 1200, 1246], [1199, 1201], [1172, 1200, 1202], [1201, 1203], [1202, 1204, 1247], [1203, 1205], [1173, 1204, 1206], [1205, 1207], [1206, 1208, 1248], [1207, 1209], [1174, 1208, 1210], [1209, 1211], [1210, 1212, 1249], [1211, 1213], [1175, 1212, 1214], [1213, 1215], [1214, 1216, 1250], [1215, 1217], [1176, 1216, 1218], [1217, 1219], [1218, 1220, 1251], [1219, 1221], [1177, 1220, 1222], [1221, 1223], [1222, 1224, 1252], [1223, 1225], [1178, 1224, 1226], [1225, 1227], [1226, 1228, 1253], [1227, 1229], [1179, 1228, 1230], [1229, 1231], [1230, 1232, 1254], [1231, 1233], [1180, 1232, 1234], [1233, 1235], [1234, 1236, 1255], [1235, 1237], [1181, 1236, 1238], [1237, 1239], [1238, 1240, 1256], [1239, 1241], [1182, 1240], [1183, 1257], [1187, 1261], [1191, 1265], [1195, 1269], [1199, 1273], [1203, 1277], [1207, 1281], [1211, 1285], [1215, 1289], [1219, 1293], [1223, 1297], [1227, 1301], [1231, 1305], [1235, 1309], [1239, 1313], [1242, 1258], [1257, 1259], [1258, 1260, 1316], [1259, 1261], [1243, 1260, 1262], [1261, 1263], [1262, 1264, 1317], [1263, 1265], [1244, 1264, 1266], [1265, 1267], [1266, 1268, 1318], [1267, 1269], [1245, 1268, 1270], [1269, 1271], [1270, 1272, 1319], [1271, 1273], [1246, 1272, 1274], [1273, 1275], [1274, 1276, 1320], [1275, 1277], [1247, 1276, 1278], [1277, 1279], [1278, 1280, 1321], [1279, 1281], [1248, 1280, 1282], [1281, 1283], [1282, 1284, 1322], [1283, 1285], [1249, 1284, 1286], [1285, 1287], [1286, 1288, 1323], [1287, 1289], [1250, 1288, 1290], [1289, 1291], [1290, 1292, 1324], [1291, 1293], [1251, 1292, 1294], [1293, 1295], [1294, 1296, 1325], [1295, 1297], [1252, 1296, 1298], [1297, 1299], [1298, 1300, 1326], [1299, 1301], [1253, 1300, 1302], [1301, 1303], [1302, 1304, 1327], [1303, 1305], [1254, 1304, 1306], [1305, 1307], [1306, 1308, 1328], [1307, 1309], [1255, 1308, 1310], [1309, 1311], [1310, 1312, 1329], [1311, 1313], [1256, 1312, 1314], [1313, 1315], [1314, 1330], [1259, 1333], [1263, 1337], [1267, 1341], [1271, 1345], [1275, 1349], [1279, 1353], [1283, 1357], [1287, 1361], [1291, 1365], [1295, 1369], [1299, 1373], [1303, 1377], [1307, 1381], [1311, 1385], [1315, 1389], [1332, 1390], [1331, 1333], [1316, 1332, 1334], [1333, 1335], [1334, 1336, 1391], [1335, 1337], [1317, 1336, 1338], [1337, 1339], [1338, 1340, 1392], [1339, 1341], [1318, 1340, 1342], [1341, 1343], [1342, 1344, 1393], [1343, 1345], [1319, 1344, 1346], [1345, 1347], [1346, 1348, 1394], [1347, 1349], [1320, 1348, 1350], [1349, 1351], [1350, 1352, 1395], [1351, 1353], [1321, 1352, 1354], [1353, 1355], [1354, 1356, 1396], [1355, 1357], [1322, 1356, 1358], [1357, 1359], [1358, 1360, 1397], [1359, 1361], [1323, 1360, 1362], [1361, 1363], [1362, 1364, 1398], [1363, 1365], [1324, 1364, 1366], [1365, 1367], [1366, 1368, 1399], [1367, 1369], [1325, 1368, 1370], [1369, 1371], [1370, 1372, 1400], [1371, 1373], [1326, 1372, 1374], [1373, 1375], [1374, 1376, 1401], [1375, 1377], [1327, 1376, 1378], [1377, 1379], [1378, 1380, 1402], [1379, 1381], [1328, 1380, 1382], [1381, 1383], [1382, 1384, 1403], [1383, 1385], [1329, 1384, 1386], [1385, 1387], [1386, 1388, 1404], [1387, 1389], [1330, 1388], [1331, 1405], [1335, 1409], [1339, 1413], [1343, 1417], [1347, 1421], [1351, 1425], [1355, 1429], [1359, 1433], [1363, 1437], [1367, 1441], [1371, 1445], [1375, 1449], [1379, 1453], [1383, 1457], [1387, 1461], [1390, 1406], [1405, 1407], [1406, 1408, 1464], [1407, 1409], [1391, 1408, 1410], [1409, 1411], [1410, 1412, 1465], [1411, 1413], [1392, 1412, 1414], [1413, 1415], [1414, 1416, 1466], [1415, 1417], [1393, 1416, 1418], [1417, 1419], [1418, 1420, 1467], [1419, 1421], [1394, 1420, 1422], [1421, 1423], [1422, 1424, 1468], [1423, 1425], [1395, 1424, 1426], [1425, 1427], [1426, 1428, 1469], [1427, 1429], [1396, 1428, 1430], [1429, 1431], [1430, 1432, 1470], [1431, 1433], [1397, 1432, 1434], [1433, 1435], [1434, 1436, 1471], [1435, 1437], [1398, 1436, 1438], [1437, 1439], [1438, 1440, 1472], [1439, 1441], [1399, 1440, 1442], [1441, 1443], [1442, 1444, 1473], [1443, 1445], [1400, 1444, 1446], [1445, 1447], [1446, 1448, 1474], [1447, 1449], [1401, 1448, 1450], [1449, 1451], [1450, 1452, 1475], [1451, 1453], [1402, 1452, 1454], [1453, 1455], [1454, 1456, 1476], [1455, 1457], [1403, 1456, 1458], [1457, 1459], [1458, 1460, 1477], [1459, 1461], [1404, 1460, 1462], [1461, 1463], [1462, 1478], [1407, 1481], [1411, 1485], [1415, 1489], [1419, 1493], [1423, 1497], [1427, 1501], [1431, 1505], [1435, 1509], [1439, 1513], [1443, 1517], [1447, 1521], [1451, 1525], [1455, 1529], [1459, 1533], [1463, 1537], [1480, 1538], [1479, 1481], [1464, 1480, 1482], [1481, 1483], [1482, 1484, 1539], [1483, 1485], [1465, 1484, 1486], [1485, 1487], [1486, 1488, 1540], [1487, 1489], [1466, 1488, 1490], [1489, 1491], [1490, 1492, 1541], [1491, 1493], [1467, 1492, 1494], [1493, 1495], [1494, 1496, 1542], [1495, 1497], [1468, 1496, 1498], [1497, 1499], [1498, 1500, 1543], [1499, 1501], [1469, 1500, 1502], [1501, 1503], [1502, 1504, 1544], [1503, 1505], [1470, 1504, 1506], [1505, 1507], [1506, 1508, 1545], [1507, 1509], [1471, 1508, 1510], [1509, 1511], [1510, 1512, 1546], [1511, 1513], [1472, 1512, 1514], [1513, 1515], [1514, 1516, 1547], [1515, 1517], [1473, 1516, 1518], [1517, 1519], [1518, 1520, 1548], [1519, 1521], [1474, 1520, 1522], [1521, 1523], [1522, 1524, 1549], [1523, 1525], [1475, 1524, 1526], [1525, 1527], [1526, 1528, 1550], [1527, 1529], [1476, 1528, 1530], [1529, 1531], [1530, 1532, 1551], [1531, 1533], [1477, 1532, 1534], [1533, 1535], [1534, 1536, 1552], [1535, 1537], [1478, 1536], [1479, 1553], [1483, 1557], [1487, 1561], [1491, 1565], [1495, 1569], [1499, 1573], [1503, 1577], [1507, 1581], [1511, 1585], [1515, 1589], [1519, 1593], [1523, 1597], [1527, 1601], [1531, 1605], [1535, 1609], [1538, 1554], [1553, 1555], [1554, 1556, 1612], [1555, 1557], [1539, 1556, 1558], [1557, 1559], [1558, 1560, 1613], [1559, 1561], [1540, 1560, 1562], [1561, 1563], [1562, 1564, 1614], [1563, 1565], [1541, 1564, 1566], [1565, 1567], [1566, 1568, 1615], [1567, 1569], [1542, 1568, 1570], [1569, 1571], [1570, 1572, 1616], [1571, 1573], [1543, 1572, 1574], [1573, 1575], [1574, 1576, 1617], [1575, 1577], [1544, 1576, 1578], [1577, 1579], [1578, 1580, 1618], [1579, 1581], [1545, 1580, 1582], [1581, 1583], [1582, 1584, 1619], [1583, 1585], [1546, 1584, 1586], [1585, 1587], [1586, 1588, 1620], [1587, 1589], [1547, 1588, 1590], [1589, 1591], [1590, 1592, 1621], [1591, 1593], [1548, 1592, 1594], [1593, 1595], [1594, 1596, 1622], [1595, 1597], [1549, 1596, 1598], [1597, 1599], [1598, 1600, 1623], [1599, 1601], [1550, 1600, 1602], [1601, 1603], [1602, 1604, 1624], [1603, 1605], [1551, 1604, 1606], [1605, 1607], [1606, 1608, 1625], [1607, 1609], [1552, 1608, 1610], [1609, 1611], [1610, 1626], [1555, 1629], [1559, 1633], [1563, 1637], [1567, 1641], [1571, 1645], [1575, 1649], [1579, 1653], [1583, 1657], [1587, 1661], [1591, 1665], [1595, 1669], [1599, 1673], [1603, 1677], [1607, 1681], [1611, 1685], [1628, 1686], [1627, 1629], [1612, 1628, 1630], [1629, 1631], [1630, 1632, 1687], [1631, 1633], [1613, 1632, 1634], [1633, 1635], [1634, 1636, 1688], [1635, 1637], [1614, 1636, 1638], [1637, 1639], [1638, 1640, 1689], [1639, 1641], [1615, 1640, 1642], [1641, 1643], [1642, 1644, 1690], [1643, 1645], [1616, 1644, 1646], [1645, 1647], [1646, 1648, 1691], [1647, 1649], [1617, 1648, 1650], [1649, 1651], [1650, 1652, 1692], [1651, 1653], [1618, 1652, 1654], [1653, 1655], [1654, 1656, 1693], [1655, 1657], [1619, 1656, 1658], [1657, 1659], [1658, 1660, 1694], [1659, 1661], [1620, 1660, 1662], [1661, 1663], [1662, 1664, 1695], [1663, 1665], [1621, 1664, 1666], [1665, 1667], [1666, 1668, 1696], [1667, 1669], [1622, 1668, 1670], [1669, 1671], [1670, 1672, 1697], [1671, 1673], [1623, 1672, 1674], [1673, 1675], [1674, 1676, 1698], [1675, 1677], [1624, 1676, 1678], [1677, 1679], [1678, 1680, 1699], [1679, 1681], [1625, 1680, 1682], [1681, 1683], [1682, 1684, 1700], [1683, 1685], [1626, 1684], [1627, 1701], [1631, 1705], [1635, 1709], [1639, 1713], [1643, 1717], [1647, 1721], [1651, 1725], [1655, 1729], [1659, 1733], [1663, 1737], [1667, 1741], [1671, 1745], [1675, 1749], [1679, 1753], [1683, 1757], [1686, 1702], [1701, 1703], [1702, 1704, 1760], [1703, 1705], [1687, 1704, 1706], [1705, 1707], [1706, 1708, 1761], [1707, 1709], [1688, 1708, 1710], [1709, 1711], [1710, 1712, 1762], [1711, 1713], [1689, 1712, 1714], [1713, 1715], [1714, 1716, 1763], [1715, 1717], [1690, 1716, 1718], [1717, 1719], [1718, 1720, 1764], [1719, 1721], [1691, 1720, 1722], [1721, 1723], [1722, 1724, 1765], [1723, 1725], [1692, 1724, 1726], [1725, 1727], [1726, 1728, 1766], [1727, 1729], [1693, 1728, 1730], [1729, 1731], [1730, 1732, 1767], [1731, 1733], [1694, 1732, 1734], [1733, 1735], [1734, 1736, 1768], [1735, 1737], [1695, 1736, 1738], [1737, 1739], [1738, 1740, 1769], [1739, 1741], [1696, 1740, 1742], [1741, 1743], [1742, 1744, 1770], [1743, 1745], [1697, 1744, 1746], [1745, 1747], [1746, 1748, 1771], [1747, 1749], [1698, 1748, 1750], [1749, 1751], [1750, 1752, 1772], [1751, 1753], [1699, 1752, 1754], [1753, 1755], [1754, 1756, 1773], [1755, 1757], [1700, 1756, 1758], [1757, 1759], [1758, 1774], [1703, 1777], [1707, 1781], [1711, 1785], [1715, 1789], [1719, 1793], [1723, 1797], [1727, 1801], [1731, 1805], [1735, 1809], [1739, 1813], [1743, 1817], [1747, 1821], [1751, 1825], [1755, 1829], [1759, 1833], [1776, 1834], [1775, 1777], [1760, 1776, 1778], [1777, 1779], [1778, 1780, 1835], [1779, 1781], [1761, 1780, 1782], [1781, 1783], [1782, 1784, 1836], [1783, 1785], [1762, 1784, 1786], [1785, 1787], [1786, 1788, 1837], [1787, 1789], [1763, 1788, 1790], [1789, 1791], [1790, 1792, 1838], [1791, 1793], [1764, 1792, 1794], [1793, 1795], [1794, 1796, 1839], [1795, 1797], [1765, 1796, 1798], [1797, 1799], [1798, 1800, 1840], [1799, 1801], [1766, 1800, 1802], [1801, 1803], [1802, 1804, 1841], [1803, 1805], [1767, 1804, 1806], [1805, 1807], [1806, 1808, 1842], [1807, 1809], [1768, 1808, 1810], [1809, 1811], [1810, 1812, 1843], [1811, 1813], [1769, 1812, 1814], [1813, 1815], [1814, 1816, 1844], [1815, 1817], [1770, 1816, 1818], [1817, 1819], [1818, 1820, 1845], [1819, 1821], [1771, 1820, 1822], [1821, 1823], [1822, 1824, 1846], [1823, 1825], [1772, 1824, 1826], [1825, 1827], [1826, 1828, 1847], [1827, 1829], [1773, 1828, 1830], [1829, 1831], [1830, 1832, 1848], [1831, 1833], [1774, 1832], [1775, 1849], [1779, 1853], [1783, 1857], [1787, 1861], [1791, 1865], [1795, 1869], [1799, 1873], [1803, 1877], [1807, 1881], [1811, 1885], [1815, 1889], [1819, 1893], [1823, 1897], [1827, 1901], [1831, 1905], [1834, 1850], [1849, 1851], [1850, 1852, 1908], [1851, 1853], [1835, 1852, 1854], [1853, 1855], [1854, 1856, 1909], [1855, 1857], [1836, 1856, 1858], [1857, 1859], [1858, 1860, 1910], [1859, 1861], [1837, 1860, 1862], [1861, 1863], [1862, 1864, 1911], [1863, 1865], [1838, 1864, 1866], [1865, 1867], [1866, 1868, 1912], [1867, 1869], [1839, 1868, 1870], [1869, 1871], [1870, 1872, 1913], [1871, 1873], [1840, 1872, 1874], [1873, 1875], [1874, 1876, 1914], [1875, 1877], [1841, 1876, 1878], [1877, 1879], [1878, 1880, 1915], [1879, 1881], [1842, 1880, 1882], [1881, 1883], [1882, 1884, 1916], [1883, 1885], [1843, 1884, 1886], [1885, 1887], [1886, 1888, 1917], [1887, 1889], [1844, 1888, 1890], [1889, 1891], [1890, 1892, 1918], [1891, 1893], [1845, 1892, 1894], [1893, 1895], [1894, 1896, 1919], [1895, 1897], [1846, 1896, 1898], [1897, 1899], [1898, 1900, 1920], [1899, 1901], [1847, 1900, 1902], [1901, 1903], [1902, 1904, 1921], [1903, 1905], [1848, 1904, 1906], [1905, 1907], [1906, 1922], [1851, 1925], [1855, 1929], [1859, 1933], [1863, 1937], [1867, 1941], [1871, 1945], [1875, 1949], [1879, 1953], [1883, 1957], [1887, 1961], [1891, 1965], [1895, 1969], [1899, 1973], [1903, 1977], [1907, 1981], [1924, 1982], [1923, 1925], [1908, 1924, 1926], [1925, 1927], [1926, 1928, 1983], [1927, 1929], [1909, 1928, 1930], [1929, 1931], [1930, 1932, 1984], [1931, 1933], [1910, 1932, 1934], [1933, 1935], [1934, 1936, 1985], [1935, 1937], [1911, 1936, 1938], [1937, 1939], [1938, 1940, 1986], [1939, 1941], [1912, 1940, 1942], [1941, 1943], [1942, 1944, 1987], [1943, 1945], [1913, 1944, 1946], [1945, 1947], [1946, 1948, 1988], [1947, 1949], [1914, 1948, 1950], [1949, 1951], [1950, 1952, 1989], [1951, 1953], [1915, 1952, 1954], [1953, 1955], [1954, 1956, 1990], [1955, 1957], [1916, 1956, 1958], [1957, 1959], [1958, 1960, 1991], [1959, 1961], [1917, 1960, 1962], [1961, 1963], [1962, 1964, 1992], [1963, 1965], [1918, 1964, 1966], [1965, 1967], [1966, 1968, 1993], [1967, 1969], [1919, 1968, 1970], [1969, 1971], [1970, 1972, 1994], [1971, 1973], [1920, 1972, 1974], [1973, 1975], [1974, 1976, 1995], [1975, 1977], [1921, 1976, 1978], [1977, 1979], [1978, 1980, 1996], [1979, 1981], [1922, 1980], [1923, 1997], [1927, 2001], [1931, 2005], [1935, 2009], [1939, 2013], [1943, 2017], [1947, 2021], [1951, 2025], [1955, 2029], [1959, 2033], [1963, 2037], [1967, 2041], [1971, 2045], [1975, 2049], [1979, 2053], [1982, 1998], [1997, 1999], [1998, 2000, 2056], [1999, 2001], [1983, 2000, 2002], [2001, 2003], [2002, 2004, 2057], [2003, 2005], [1984, 2004, 2006], [2005, 2007], [2006, 2008, 2058], [2007, 2009], [1985, 2008, 2010], [2009, 2011], [2010, 2012, 2059], [2011, 2013], [1986, 2012, 2014], [2013, 2015], [2014, 2016, 2060], [2015, 2017], [1987, 2016, 2018], [2017, 2019], [2018, 2020, 2061], [2019, 2021], [1988, 2020, 2022], [2021, 2023], [2022, 2024, 2062], [2023, 2025], [1989, 2024, 2026], [2025, 2027], [2026, 2028, 2063], [2027, 2029], [1990, 2028, 2030], [2029, 2031], [2030, 2032, 2064], [2031, 2033], [1991, 2032, 2034], [2033, 2035], [2034, 2036, 2065], [2035, 2037], [1992, 2036, 2038], [2037, 2039], [2038, 2040, 2066], [2039, 2041], [1993, 2040, 2042], [2041, 2043], [2042, 2044, 2067], [2043, 2045], [1994, 2044, 2046], [2045, 2047], [2046, 2048, 2068], [2047, 2049], [1995, 2048, 2050], [2049, 2051], [2050, 2052, 2069], [2051, 2053], [1996, 2052, 2054], [2053, 2055], [2054, 2070], [1999, 2072], [2003, 2076], [2007, 2080], [2011, 2084], [2015, 2088], [2019, 2092], [2023, 2096], [2027, 2100], [2031, 2104], [2035, 2108], [2039, 2112], [2043, 2116], [2047, 2120], [2051, 2124], [2055, 2128], [2072], [2056, 2071, 2073], [2072, 2074], [2073, 2075], [2074, 2076], [2057, 2075, 2077], [2076, 2078], [2077, 2079], [2078, 2080], [2058, 2079, 2081], [2080, 2082], [2081, 2083], [2082, 2084], [2059, 2083, 2085], [2084, 2086], [2085, 2087], [2086, 2088], [2060, 2087, 2089], [2088, 2090], [2089, 2091], [2090, 2092], [2061, 2091, 2093], [2092, 2094], [2093, 2095], [2094, 2096], [2062, 2095, 2097], [2096, 2098], [2097, 2099], [2098, 2100], [2063, 2099, 2101], [2100, 2102], [2101, 2103], [2102, 2104], [2064, 2103, 2105], [2104, 2106], [2105, 2107], [2106, 2108], [2065, 2107, 2109], [2108, 2110], [2109, 2111], [2110, 2112], [2066, 2111, 2113], [2112, 2114], [2113, 2115], [2114, 2116], [2067, 2115, 2117], [2116, 2118], [2117, 2119], [2118, 2120], [2068, 2119, 2121], [2120, 2122], [2121, 2123], [2122, 2124], [2069, 2123, 2125], [2124, 2126], [2125, 2127], [2126, 2128], [2070, 2127]] SGERROR: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1, 58], [0, 2], [1, 3], [2, 4], [3, 5, 59], [4, 6], [5, 7], [6, 8], [7, 9, 60], [8, 10], [9, 11], [10, 12], [11, 13, 61], [12, 14], [13, 15], [14, 16], [15, 17, 62], [16, 18], [17, 19], [18, 20], [19, 21, 63], [20, 22], [21, 23], [22, 24], [23, 25, 64], [24, 26], [25, 27], [26, 28], [27, 29, 65], [28, 30], [29, 31], [30, 32], [31, 33, 66], [32, 34], [33, 35], [34, 36], [35, 37, 67], [36, 38], [37, 39], [38, 40], [39, 41, 68], [40, 42], [41, 43], [42, 44], [43, 45, 69], [44, 46], [45, 47], [46, 48], [47, 49, 70], [48, 50], [49, 51], [50, 52], [51, 53, 71], [52, 54], [53, 55], [54, 56], [55, 57, 72], [56], [0, 73], [4, 77], [8, 81], [12, 85], [16, 89], [20, 93], [24, 97], [28, 101], [32, 105], [36, 109], [40, 113], [44, 117], [48, 121], [52, 125], [56, 129], [58, 74], [73, 75], [74, 76, 132], [75, 77], [59, 76, 78], [77, 79], [78, 80, 133], [79, 81], [60, 80, 82], [81, 83], [82, 84, 134], [83, 85], [61, 84, 86], [85, 87], [86, 88, 135], [87, 89], [62, 88, 90], [89, 91], [90, 92, 136], [91, 93], [63, 92, 94], [93, 95], [94, 96, 137], [95, 97], [64, 96, 98], [97, 99], [98, 100, 138], [99, 101], [65, 100, 102], [101, 103], [102, 104, 139], [103, 105], [66, 104, 106], [105, 107], [106, 108, 140], [107, 109], [67, 108, 110], [109, 111], [110, 112, 141], [111, 113], [68, 112, 114], [113, 115], [114, 116, 142], [115, 117], [69, 116, 118], [117, 119], [118, 120, 143], [119, 121], [70, 120, 122], [121, 123], [122, 124, 144], [123, 125], [71, 124, 126], [125, 127], [126, 128, 145], [127, 129], [72, 128, 130], [129, 131], [130, 146], [75, 149], [79, 153], [83, 157], [87, 161], [91, 165], [95, 169], [99, 173], [103, 177], [107, 181], [111, 185], [115, 189], [119, 193], [123, 197], [127, 201], [131, 205], [148, 206], [147, 149], [132, 148, 150], [149, 151], [150, 152, 207], [151, 153], [133, 152, 154], [153, 155], [154, 156, 208], [155, 157], [134, 156, 158], [157, 159], [158, 160, 209], [159, 161], [135, 160, 162], [161, 163], [162, 164, 210], [163, 165], [136, 164, 166], [165, 167], [166, 168, 211], [167, 169], [137, 168, 170], [169, 171], [170, 172, 212], [171, 173], [138, 172, 174], [173, 175], [174, 176, 213], [175, 177], [139, 176, 178], [177, 179], [178, 180, 214], [179, 181], [140, 180, 182], [181, 183], [182, 184, 215], [183, 185], [141, 184, 186], [185, 187], [186, 188, 216], [187, 189], [142, 188, 190], [189, 191], [190, 192, 217], [191, 193], [143, 192, 194], [193, 195], [194, 196, 218], [195, 197], [144, 196, 198], [197, 199], [198, 200, 219], [199, 201], [145, 200, 202], [201, 203], [202, 204, 220], [203, 205], [146, 204], [147, 221], [151, 225], [155, 229], [159, 233], [163, 237], [167, 241], [171, 245], [175, 249], [179, 253], [183, 257], [187, 261], [191, 265], [195, 269], [199, 273], [203, 277], [206, 222], [221, 223], [222, 224, 280], [223, 225], [207, 224, 226], [225, 227], [226, 228, 281], [227, 229], [208, 228, 230], [229, 231], [230, 232, 282], [231, 233], [209, 232, 234], [233, 235], [234, 236, 283], [235, 237], [210, 236, 238], [237, 239], [238, 240, 284], [239, 241], [211, 240, 242], [241, 243], [242, 244, 285], [243, 245], [212, 244, 246], [245, 247], [246, 248, 286], [247, 249], [213, 248, 250], [249, 251], [250, 252, 287], [251, 253], [214, 252, 254], [253, 255], [254, 256, 288], [255, 257], [215, 256, 258], [257, 259], [258, 260, 289], [259, 261], [216, 260, 262], [261, 263], [262, 264, 290], [263, 265], [217, 264, 266], [265, 267], [266, 268, 291], [267, 269], [218, 268, 270], [269, 271], [270, 272, 292], [271, 273], [219, 272, 274], [273, 275], [274, 276, 293], [275, 277], [220, 276, 278], [277, 279], [278, 294], [223, 297], [227, 301], [231, 305], [235, 309], [239, 313], [243, 317], [247, 321], [251, 325], [255, 329], [259, 333], [263, 337], [267, 341], [271, 345], [275, 349], [279, 353], [296, 354], [295, 297], [280, 296, 298], [297, 299], [298, 300, 355], [299, 301], [281, 300, 302], [301, 303], [302, 304, 356], [303, 305], [282, 304, 306], [305, 307], [306, 308, 357], [307, 309], [283, 308, 310], [309, 311], [310, 312, 358], [311, 313], [284, 312, 314], [313, 315], [314, 316, 359], [315, 317], [285, 316, 318], [317, 319], [318, 320, 360], [319, 321], [286, 320, 322], [321, 323], [322, 324, 361], [323, 325], [287, 324, 326], [325, 327], [326, 328, 362], [327, 329], [288, 328, 330], [329, 331], [330, 332, 363], [331, 333], [289, 332, 334], [333, 335], [334, 336, 364], [335, 337], [290, 336, 338], [337, 339], [338, 340, 365], [339, 341], [291, 340, 342], [341, 343], [342, 344, 366], [343, 345], [292, 344, 346], [345, 347], [346, 348, 367], [347, 349], [293, 348, 350], [349, 351], [350, 352, 368], [351, 353], [294, 352], [295, 369], [299, 373], [303, 377], [307, 381], [311, 385], [315, 389], [319, 393], [323, 397], [327, 401], [331, 405], [335, 409], [339, 413], [343, 417], [347, 421], [351, 425], [354, 370], [369, 371], [370, 372, 428], [371, 373], [355, 372, 374], [373, 375], [374, 376, 429], [375, 377], [356, 376, 378], [377, 379], [378, 380, 430], [379, 381], [357, 380, 382], [381, 383], [382, 384, 431], [383, 385], [358, 384, 386], [385, 387], [386, 388, 432], [387, 389], [359, 388, 390], [389, 391], [390, 392, 433], [391, 393], [360, 392, 394], [393, 395], [394, 396, 434], [395, 397], [361, 396, 398], [397, 399], [398, 400, 435], [399, 401], [362, 400, 402], [401, 403], [402, 404, 436], [403, 405], [363, 404, 406], [405, 407], [406, 408, 437], [407, 409], [364, 408, 410], [409, 411], [410, 412, 438], [411, 413], [365, 412, 414], [413, 415], [414, 416, 439], [415, 417], [366, 416, 418], [417, 419], [418, 420, 440], [419, 421], [367, 420, 422], [421, 423], [422, 424, 441], [423, 425], [368, 424, 426], [425, 427], [426, 442], [371, 445], [375, 449], [379, 453], [383, 457], [387, 461], [391, 465], [395, 469], [399, 473], [403, 477], [407, 481], [411, 485], [415, 489], [419, 493], [423, 497], [427, 501], [444, 502], [443, 445], [428, 444, 446], [445, 447], [446, 448, 503], [447, 449], [429, 448, 450], [449, 451], [450, 452, 504], [451, 453], [430, 452, 454], [453, 455], [454, 456, 505], [455, 457], [431, 456, 458], [457, 459], [458, 460, 506], [459, 461], [432, 460, 462], [461, 463], [462, 464, 507], [463, 465], [433, 464, 466], [465, 467], [466, 468, 508], [467, 469], [434, 468, 470], [469, 471], [470, 472, 509], [471, 473], [435, 472, 474], [473, 475], [474, 476, 510], [475, 477], [436, 476, 478], [477, 479], [478, 480, 511], [479, 481], [437, 480, 482], [481, 483], [482, 484, 512], [483, 485], [438, 484, 486], [485, 487], [486, 488, 513], [487, 489], [439, 488, 490], [489, 491], [490, 492, 514], [491, 493], [440, 492, 494], [493, 495], [494, 496, 515], [495, 497], [441, 496, 498], [497, 499], [498, 500, 516], [499, 501], [442, 500], [443, 517], [447, 521], [451, 525], [455, 529], [459, 533], [463, 537], [467, 541], [471, 545], [475, 549], [479, 553], [483, 557], [487, 561], [491, 565], [495, 569], [499, 573], [502, 518], [517, 519], [518, 520, 576], [519, 521], [503, 520, 522], [521, 523], [522, 524, 577], [523, 525], [504, 524, 526], [525, 527], [526, 528, 578], [527, 529], [505, 528, 530], [529, 531], [530, 532, 579], [531, 533], [506, 532, 534], [533, 535], [534, 536, 580], [535, 537], [507, 536, 538], [537, 539], [538, 540, 581], [539, 541], [508, 540, 542], [541, 543], [542, 544, 582], [543, 545], [509, 544, 546], [545, 547], [546, 548, 583], [547, 549], [510, 548, 550], [549, 551], [550, 552, 584], [551, 553], [511, 552, 554], [553, 555], [554, 556, 585], [555, 557], [512, 556, 558], [557, 559], [558, 560, 586], [559, 561], [513, 560, 562], [561, 563], [562, 564, 587], [563, 565], [514, 564, 566], [565, 567], [566, 568, 588], [567, 569], [515, 568, 570], [569, 571], [570, 572, 589], [571, 573], [516, 572, 574], [573, 575], [574, 590], [519, 593], [523, 597], [527, 601], [531, 605], [535, 609], [539, 613], [543, 617], [547, 621], [551, 625], [555, 629], [559, 633], [563, 637], [567, 641], [571, 645], [575, 649], [592, 650], [591, 593], [576, 592, 594], [593, 595], [594, 596, 651], [595, 597], [577, 596, 598], [597, 599], [598, 600, 652], [599, 601], [578, 600, 602], [601, 603], [602, 604, 653], [603, 605], [579, 604, 606], [605, 607], [606, 608, 654], [607, 609], [580, 608, 610], [609, 611], [610, 612, 655], [611, 613], [581, 612, 614], [613, 615], [614, 616, 656], [615, 617], [582, 616, 618], [617, 619], [618, 620, 657], [619, 621], [583, 620, 622], [621, 623], [622, 624, 658], [623, 625], [584, 624, 626], [625, 627], [626, 628, 659], [627, 629], [585, 628, 630], [629, 631], [630, 632, 660], [631, 633], [586, 632, 634], [633, 635], [634, 636, 661], [635, 637], [587, 636, 638], [637, 639], [638, 640, 662], [639, 641], [588, 640, 642], [641, 643], [642, 644, 663], [643, 645], [589, 644, 646], [645, 647], [646, 648, 664], [647, 649], [590, 648], [591, 665], [595, 669], [599, 673], [603, 677], [607, 681], [611, 685], [615, 689], [619, 693], [623, 697], [627, 701], [631, 705], [635, 709], [639, 713], [643, 717], [647, 721], [650, 666], [665, 667], [666, 668, 724], [667, 669], [651, 668, 670], [669, 671], [670, 672, 725], [671, 673], [652, 672, 674], [673, 675], [674, 676, 726], [675, 677], [653, 676, 678], [677, 679], [678, 680, 727], [679, 681], [654, 680, 682], [681, 683], [682, 684, 728], [683, 685], [655, 684, 686], [685, 687], [686, 688, 729], [687, 689], [656, 688, 690], [689, 691], [690, 692, 730], [691, 693], [657, 692, 694], [693, 695], [694, 696, 731], [695, 697], [658, 696, 698], [697, 699], [698, 700, 732], [699, 701], [659, 700, 702], [701, 703], [702, 704, 733], [703, 705], [660, 704, 706], [705, 707], [706, 708, 734], [707, 709], [661, 708, 710], [709, 711], [710, 712, 735], [711, 713], [662, 712, 714], [713, 715], [714, 716, 736], [715, 717], [663, 716, 718], [717, 719], [718, 720, 737], [719, 721], [664, 720, 722], [721, 723], [722, 738], [667, 741], [671, 745], [675, 749], [679, 753], [683, 757], [687, 761], [691, 765], [695, 769], [699, 773], [703, 777], [707, 781], [711, 785], [715, 789], [719, 793], [723, 797], [740, 798], [739, 741], [724, 740, 742], [741, 743], [742, 744, 799], [743, 745], [725, 744, 746], [745, 747], [746, 748, 800], [747, 749], [726, 748, 750], [749, 751], [750, 752, 801], [751, 753], [727, 752, 754], [753, 755], [754, 756, 802], [755, 757], [728, 756, 758], [757, 759], [758, 760, 803], [759, 761], [729, 760, 762], [761, 763], [762, 764, 804], [763, 765], [730, 764, 766], [765, 767], [766, 768, 805], [767, 769], [731, 768, 770], [769, 771], [770, 772, 806], [771, 773], [732, 772, 774], [773, 775], [774, 776, 807], [775, 777], [733, 776, 778], [777, 779], [778, 780, 808], [779, 781], [734, 780, 782], [781, 783], [782, 784, 809], [783, 785], [735, 784, 786], [785, 787], [786, 788, 810], [787, 789], [736, 788, 790], [789, 791], [790, 792, 811], [791, 793], [737, 792, 794], [793, 795], [794, 796, 812], [795, 797], [738, 796], [739, 813], [743, 817], [747, 821], [751, 825], [755, 829], [759, 833], [763, 837], [767, 841], [771, 845], [775, 849], [779, 853], [783, 857], [787, 861], [791, 865], [795, 869], [798, 814], [813, 815], [814, 816, 872], [815, 817], [799, 816, 818], [817, 819], [818, 820, 873], [819, 821], [800, 820, 822], [821, 823], [822, 824, 874], [823, 825], [801, 824, 826], [825, 827], [826, 828, 875], [827, 829], [802, 828, 830], [829, 831], [830, 832, 876], [831, 833], [803, 832, 834], [833, 835], [834, 836, 877], [835, 837], [804, 836, 838], [837, 839], [838, 840, 878], [839, 841], [805, 840, 842], [841, 843], [842, 844, 879], [843, 845], [806, 844, 846], [845, 847], [846, 848, 880], [847, 849], [807, 848, 850], [849, 851], [850, 852, 881], [851, 853], [808, 852, 854], [853, 855], [854, 856, 882], [855, 857], [809, 856, 858], [857, 859], [858, 860, 883], [859, 861], [810, 860, 862], [861, 863], [862, 864, 884], [863, 865], [811, 864, 866], [865, 867], [866, 868, 885], [867, 869], [812, 868, 870], [869, 871], [870, 886], [815, 889], [819, 893], [823, 897], [827, 901], [831, 905], [835, 909], [839, 913], [843, 917], [847, 921], [851, 925], [855, 929], [859, 933], [863, 937], [867, 941], [871, 945], [888, 946], [887, 889], [872, 888, 890], [889, 891], [890, 892, 947], [891, 893], [873, 892, 894], [893, 895], [894, 896, 948], [895, 897], [874, 896, 898], [897, 899], [898, 900, 949], [899, 901], [875, 900, 902], [901, 903], [902, 904, 950], [903, 905], [876, 904, 906], [905, 907], [906, 908, 951], [907, 909], [877, 908, 910], [909, 911], [910, 912, 952], [911, 913], [878, 912, 914], [913, 915], [914, 916, 953], [915, 917], [879, 916, 918], [917, 919], [918, 920, 954], [919, 921], [880, 920, 922], [921, 923], [922, 924, 955], [923, 925], [881, 924, 926], [925, 927], [926, 928, 956], [927, 929], [882, 928, 930], [929, 931], [930, 932, 957], [931, 933], [883, 932, 934], [933, 935], [934, 936, 958], [935, 937], [884, 936, 938], [937, 939], [938, 940, 959], [939, 941], [885, 940, 942], [941, 943], [942, 944, 960], [943, 945], [886, 944], [887, 961], [891, 965], [895, 969], [899, 973], [903, 977], [907, 981], [911, 985], [915, 989], [919, 993], [923, 997], [927, 1001], [931, 1005], [935, 1009], [939, 1013], [943, 1017], [946, 962], [961, 963], [962, 964, 1020], [963, 965], [947, 964, 966], [965, 967], [966, 968, 1021], [967, 969], [948, 968, 970], [969, 971], [970, 972, 1022], [971, 973], [949, 972, 974], [973, 975], [974, 976, 1023], [975, 977], [950, 976, 978], [977, 979], [978, 980, 1024], [979, 981], [951, 980, 982], [981, 983], [982, 984, 1025], [983, 985], [952, 984, 986], [985, 987], [986, 988, 1026], [987, 989], [953, 988, 990], [989, 991], [990, 992, 1027], [991, 993], [954, 992, 994], [993, 995], [994, 996, 1028], [995, 997], [955, 996, 998], [997, 999], [998, 1000, 1029], [999, 1001], [956, 1000, 1002], [1001, 1003], [1002, 1004, 1030], [1003, 1005], [957, 1004, 1006], [1005, 1007], [1006, 1008, 1031], [1007, 1009], [958, 1008, 1010], [1009, 1011], [1010, 1012, 1032], [1011, 1013], [959, 1012, 1014], [1013, 1015], [1014, 1016, 1033], [1015, 1017], [960, 1016, 1018], [1017, 1019], [1018, 1034], [963, 1037], [967, 1041], [971, 1045], [975, 1049], [979, 1053], [983, 1057], [987, 1061], [991, 1065], [995, 1069], [999, 1073], [1003, 1077], [1007, 1081], [1011, 1085], [1015, 1089], [1019, 1093], [1036, 1094], [1035, 1037], [1020, 1036, 1038], [1037, 1039], [1038, 1040, 1095], [1039, 1041], [1021, 1040, 1042], [1041, 1043], [1042, 1044, 1096], [1043, 1045], [1022, 1044, 1046], [1045, 1047], [1046, 1048, 1097], [1047, 1049], [1023, 1048, 1050], [1049, 1051], [1050, 1052, 1098], [1051, 1053], [1024, 1052, 1054], [1053, 1055], [1054, 1056, 1099], [1055, 1057], [1025, 1056, 1058], [1057, 1059], [1058, 1060, 1100], [1059, 1061], [1026, 1060, 1062], [1061, 1063], [1062, 1064, 1101], [1063, 1065], [1027, 1064, 1066], [1065, 1067], [1066, 1068, 1102], [1067, 1069], [1028, 1068, 1070], [1069, 1071], [1070, 1072, 1103], [1071, 1073], [1029, 1072, 1074], [1073, 1075], [1074, 1076, 1104], [1075, 1077], [1030, 1076, 1078], [1077, 1079], [1078, 1080, 1105], [1079, 1081], [1031, 1080, 1082], [1081, 1083], [1082, 1084, 1106], [1083, 1085], [1032, 1084, 1086], [1085, 1087], [1086, 1088, 1107], [1087, 1089], [1033, 1088, 1090], [1089, 1091], [1090, 1092, 1108], [1091, 1093], [1034, 1092], [1035, 1109], [1039, 1113], [1043, 1117], [1047, 1121], [1051, 1125], [1055, 1129], [1059, 1133], [1063, 1137], [1067, 1141], [1071, 1145], [1075, 1149], [1079, 1153], [1083, 1157], [1087, 1161], [1091, 1165], [1094, 1110], [1109, 1111], [1110, 1112, 1168], [1111, 1113], [1095, 1112, 1114], [1113, 1115], [1114, 1116, 1169], [1115, 1117], [1096, 1116, 1118], [1117, 1119], [1118, 1120, 1170], [1119, 1121], [1097, 1120, 1122], [1121, 1123], [1122, 1124, 1171], [1123, 1125], [1098, 1124, 1126], [1125, 1127], [1126, 1128, 1172], [1127, 1129], [1099, 1128, 1130], [1129, 1131], [1130, 1132, 1173], [1131, 1133], [1100, 1132, 1134], [1133, 1135], [1134, 1136, 1174], [1135, 1137], [1101, 1136, 1138], [1137, 1139], [1138, 1140, 1175], [1139, 1141], [1102, 1140, 1142], [1141, 1143], [1142, 1144, 1176], [1143, 1145], [1103, 1144, 1146], [1145, 1147], [1146, 1148, 1177], [1147, 1149], [1104, 1148, 1150], [1149, 1151], [1150, 1152, 1178], [1151, 1153], [1105, 1152, 1154], [1153, 1155], [1154, 1156, 1179], [1155, 1157], [1106, 1156, 1158], [1157, 1159], [1158, 1160, 1180], [1159, 1161], [1107, 1160, 1162], [1161, 1163], [1162, 1164, 1181], [1163, 1165], [1108, 1164, 1166], [1165, 1167], [1166, 1182], [1111, 1185], [1115, 1189], [1119, 1193], [1123, 1197], [1127, 1201], [1131, 1205], [1135, 1209], [1139, 1213], [1143, 1217], [1147, 1221], [1151, 1225], [1155, 1229], [1159, 1233], [1163, 1237], [1167, 1241], [1184, 1242], [1183, 1185], [1168, 1184, 1186], [1185, 1187], [1186, 1188, 1243], [1187, 1189], [1169, 1188, 1190], [1189, 1191], [1190, 1192, 1244], [1191, 1193], [1170, 1192, 1194], [1193, 1195], [1194, 1196, 1245], [1195, 1197], [1171, 1196, 1198], [1197, 1199], [1198, 1200, 1246], [1199, 1201], [1172, 1200, 1202], [1201, 1203], [1202, 1204, 1247], [1203, 1205], [1173, 1204, 1206], [1205, 1207], [1206, 1208, 1248], [1207, 1209], [1174, 1208, 1210], [1209, 1211], [1210, 1212, 1249], [1211, 1213], [1175, 1212, 1214], [1213, 1215], [1214, 1216, 1250], [1215, 1217], [1176, 1216, 1218], [1217, 1219], [1218, 1220, 1251], [1219, 1221], [1177, 1220, 1222], [1221, 1223], [1222, 1224, 1252], [1223, 1225], [1178, 1224, 1226], [1225, 1227], [1226, 1228, 1253], [1227, 1229], [1179, 1228, 1230], [1229, 1231], [1230, 1232, 1254], [1231, 1233], [1180, 1232, 1234], [1233, 1235], [1234, 1236, 1255], [1235, 1237], [1181, 1236, 1238], [1237, 1239], [1238, 1240, 1256], [1239, 1241], [1182, 1240], [1183, 1257], [1187, 1261], [1191, 1265], [1195, 1269], [1199, 1273], [1203, 1277], [1207, 1281], [1211, 1285], [1215, 1289], [1219, 1293], [1223, 1297], [1227, 1301], [1231, 1305], [1235, 1309], [1239, 1313], [1242, 1258], [1257, 1259], [1258, 1260, 1316], [1259, 1261], [1243, 1260, 1262], [1261, 1263], [1262, 1264, 1317], [1263, 1265], [1244, 1264, 1266], [1265, 1267], [1266, 1268, 1318], [1267, 1269], [1245, 1268, 1270], [1269, 1271], [1270, 1272, 1319], [1271, 1273], [1246, 1272, 1274], [1273, 1275], [1274, 1276, 1320], [1275, 1277], [1247, 1276, 1278], [1277, 1279], [1278, 1280, 1321], [1279, 1281], [1248, 1280, 1282], [1281, 1283], [1282, 1284, 1322], [1283, 1285], [1249, 1284, 1286], [1285, 1287], [1286, 1288, 1323], [1287, 1289], [1250, 1288, 1290], [1289, 1291], [1290, 1292, 1324], [1291, 1293], [1251, 1292, 1294], [1293, 1295], [1294, 1296, 1325], [1295, 1297], [1252, 1296, 1298], [1297, 1299], [1298, 1300, 1326], [1299, 1301], [1253, 1300, 1302], [1301, 1303], [1302, 1304, 1327], [1303, 1305], [1254, 1304, 1306], [1305, 1307], [1306, 1308, 1328], [1307, 1309], [1255, 1308, 1310], [1309, 1311], [1310, 1312, 1329], [1311, 1313], [1256, 1312, 1314], [1313, 1315], [1314, 1330], [1259, 1333], [1263, 1337], [1267, 1341], [1271, 1345], [1275, 1349], [1279, 1353], [1283, 1357], [1287, 1361], [1291, 1365], [1295, 1369], [1299, 1373], [1303, 1377], [1307, 1381], [1311, 1385], [1315, 1389], [1332, 1390], [1331, 1333], [1316, 1332, 1334], [1333, 1335], [1334, 1336, 1391], [1335, 1337], [1317, 1336, 1338], [1337, 1339], [1338, 1340, 1392], [1339, 1341], [1318, 1340, 1342], [1341, 1343], [1342, 1344, 1393], [1343, 1345], [1319, 1344, 1346], [1345, 1347], [1346, 1348, 1394], [1347, 1349], [1320, 1348, 1350], [1349, 1351], [1350, 1352, 1395], [1351, 1353], [1321, 1352, 1354], [1353, 1355], [1354, 1356, 1396], [1355, 1357], [1322, 1356, 1358], [1357, 1359], [1358, 1360, 1397], [1359, 1361], [1323, 1360, 1362], [1361, 1363], [1362, 1364, 1398], [1363, 1365], [1324, 1364, 1366], [1365, 1367], [1366, 1368, 1399], [1367, 1369], [1325, 1368, 1370], [1369, 1371], [1370, 1372, 1400], [1371, 1373], [1326, 1372, 1374], [1373, 1375], [1374, 1376, 1401], [1375, 1377], [1327, 1376, 1378], [1377, 1379], [1378, 1380, 1402], [1379, 1381], [1328, 1380, 1382], [1381, 1383], [1382, 1384, 1403], [1383, 1385], [1329, 1384, 1386], [1385, 1387], [1386, 1388, 1404], [1387, 1389], [1330, 1388], [1331, 1405], [1335, 1409], [1339, 1413], [1343, 1417], [1347, 1421], [1351, 1425], [1355, 1429], [1359, 1433], [1363, 1437], [1367, 1441], [1371, 1445], [1375, 1449], [1379, 1453], [1383, 1457], [1387, 1461], [1390, 1406], [1405, 1407], [1406, 1408, 1464], [1407, 1409], [1391, 1408, 1410], [1409, 1411], [1410, 1412, 1465], [1411, 1413], [1392, 1412, 1414], [1413, 1415], [1414, 1416, 1466], [1415, 1417], [1393, 1416, 1418], [1417, 1419], [1418, 1420, 1467], [1419, 1421], [1394, 1420, 1422], [1421, 1423], [1422, 1424, 1468], [1423, 1425], [1395, 1424, 1426], [1425, 1427], [1426, 1428, 1469], [1427, 1429], [1396, 1428, 1430], [1429, 1431], [1430, 1432, 1470], [1431, 1433], [1397, 1432, 1434], [1433, 1435], [1434, 1436, 1471], [1435, 1437], [1398, 1436, 1438], [1437, 1439], [1438, 1440, 1472], [1439, 1441], [1399, 1440, 1442], [1441, 1443], [1442, 1444, 1473], [1443, 1445], [1400, 1444, 1446], [1445, 1447], [1446, 1448, 1474], [1447, 1449], [1401, 1448, 1450], [1449, 1451], [1450, 1452, 1475], [1451, 1453], [1402, 1452, 1454], [1453, 1455], [1454, 1456, 1476], [1455, 1457], [1403, 1456, 1458], [1457, 1459], [1458, 1460, 1477], [1459, 1461], [1404, 1460, 1462], [1461, 1463], [1462, 1478], [1407, 1481], [1411, 1485], [1415, 1489], [1419, 1493], [1423, 1497], [1427, 1501], [1431, 1505], [1435, 1509], [1439, 1513], [1443, 1517], [1447, 1521], [1451, 1525], [1455, 1529], [1459, 1533], [1463, 1537], [1480, 1538], [1479, 1481], [1464, 1480, 1482], [1481, 1483], [1482, 1484, 1539], [1483, 1485], [1465, 1484, 1486], [1485, 1487], [1486, 1488, 1540], [1487, 1489], [1466, 1488, 1490], [1489, 1491], [1490, 1492, 1541], [1491, 1493], [1467, 1492, 1494], [1493, 1495], [1494, 1496, 1542], [1495, 1497], [1468, 1496, 1498], [1497, 1499], [1498, 1500, 1543], [1499, 1501], [1469, 1500, 1502], [1501, 1503], [1502, 1504, 1544], [1503, 1505], [1470, 1504, 1506], [1505, 1507], [1506, 1508, 1545], [1507, 1509], [1471, 1508, 1510], [1509, 1511], [1510, 1512, 1546], [1511, 1513], [1472, 1512, 1514], [1513, 1515], [1514, 1516, 1547], [1515, 1517], [1473, 1516, 1518], [1517, 1519], [1518, 1520, 1548], [1519, 1521], [1474, 1520, 1522], [1521, 1523], [1522, 1524, 1549], [1523, 1525], [1475, 1524, 1526], [1525, 1527], [1526, 1528, 1550], [1527, 1529], [1476, 1528, 1530], [1529, 1531], [1530, 1532, 1551], [1531, 1533], [1477, 1532, 1534], [1533, 1535], [1534, 1536, 1552], [1535, 1537], [1478, 1536], [1479, 1553], [1483, 1557], [1487, 1561], [1491, 1565], [1495, 1569], [1499, 1573], [1503, 1577], [1507, 1581], [1511, 1585], [1515, 1589], [1519, 1593], [1523, 1597], [1527, 1601], [1531, 1605], [1535, 1609], [1538, 1554], [1553, 1555], [1554, 1556, 1612], [1555, 1557], [1539, 1556, 1558], [1557, 1559], [1558, 1560, 1613], [1559, 1561], [1540, 1560, 1562], [1561, 1563], [1562, 1564, 1614], [1563, 1565], [1541, 1564, 1566], [1565, 1567], [1566, 1568, 1615], [1567, 1569], [1542, 1568, 1570], [1569, 1571], [1570, 1572, 1616], [1571, 1573], [1543, 1572, 1574], [1573, 1575], [1574, 1576, 1617], [1575, 1577], [1544, 1576, 1578], [1577, 1579], [1578, 1580, 1618], [1579, 1581], [1545, 1580, 1582], [1581, 1583], [1582, 1584, 1619], [1583, 1585], [1546, 1584, 1586], [1585, 1587], [1586, 1588, 1620], [1587, 1589], [1547, 1588, 1590], [1589, 1591], [1590, 1592, 1621], [1591, 1593], [1548, 1592, 1594], [1593, 1595], [1594, 1596, 1622], [1595, 1597], [1549, 1596, 1598], [1597, 1599], [1598, 1600, 1623], [1599, 1601], [1550, 1600, 1602], [1601, 1603], [1602, 1604, 1624], [1603, 1605], [1551, 1604, 1606], [1605, 1607], [1606, 1608, 1625], [1607, 1609], [1552, 1608, 1610], [1609, 1611], [1610, 1626], [1555, 1629], [1559, 1633], [1563, 1637], [1567, 1641], [1571, 1645], [1575, 1649], [1579, 1653], [1583, 1657], [1587, 1661], [1591, 1665], [1595, 1669], [1599, 1673], [1603, 1677], [1607, 1681], [1611, 1685], [1628, 1686], [1627, 1629], [1612, 1628, 1630], [1629, 1631], [1630, 1632, 1687], [1631, 1633], [1613, 1632, 1634], [1633, 1635], [1634, 1636, 1688], [1635, 1637], [1614, 1636, 1638], [1637, 1639], [1638, 1640, 1689], [1639, 1641], [1615, 1640, 1642], [1641, 1643], [1642, 1644, 1690], [1643, 1645], [1616, 1644, 1646], [1645, 1647], [1646, 1648, 1691], [1647, 1649], [1617, 1648, 1650], [1649, 1651], [1650, 1652, 1692], [1651, 1653], [1618, 1652, 1654], [1653, 1655], [1654, 1656, 1693], [1655, 1657], [1619, 1656, 1658], [1657, 1659], [1658, 1660, 1694], [1659, 1661], [1620, 1660, 1662], [1661, 1663], [1662, 1664, 1695], [1663, 1665], [1621, 1664, 1666], [1665, 1667], [1666, 1668, 1696], [1667, 1669], [1622, 1668, 1670], [1669, 1671], [1670, 1672, 1697], [1671, 1673], [1623, 1672, 1674], [1673, 1675], [1674, 1676, 1698], [1675, 1677], [1624, 1676, 1678], [1677, 1679], [1678, 1680, 1699], [1679, 1681], [1625, 1680, 1682], [1681, 1683], [1682, 1684, 1700], [1683, 1685], [1626, 1684], [1627, 1701], [1631, 1705], [1635, 1709], [1639, 1713], [1643, 1717], [1647, 1721], [1651, 1725], [1655, 1729], [1659, 1733], [1663, 1737], [1667, 1741], [1671, 1745], [1675, 1749], [1679, 1753], [1683, 1757], [1686, 1702], [1701, 1703], [1702, 1704, 1760], [1703, 1705], [1687, 1704, 1706], [1705, 1707], [1706, 1708, 1761], [1707, 1709], [1688, 1708, 1710], [1709, 1711], [1710, 1712, 1762], [1711, 1713], [1689, 1712, 1714], [1713, 1715], [1714, 1716, 1763], [1715, 1717], [1690, 1716, 1718], [1717, 1719], [1718, 1720, 1764], [1719, 1721], [1691, 1720, 1722], [1721, 1723], [1722, 1724, 1765], [1723, 1725], [1692, 1724, 1726], [1725, 1727], [1726, 1728, 1766], [1727, 1729], [1693, 1728, 1730], [1729, 1731], [1730, 1732, 1767], [1731, 1733], [1694, 1732, 1734], [1733, 1735], [1734, 1736, 1768], [1735, 1737], [1695, 1736, 1738], [1737, 1739], [1738, 1740, 1769], [1739, 1741], [1696, 1740, 1742], [1741, 1743], [1742, 1744, 1770], [1743, 1745], [1697, 1744, 1746], [1745, 1747], [1746, 1748, 1771], [1747, 1749], [1698, 1748, 1750], [1749, 1751], [1750, 1752, 1772], [1751, 1753], [1699, 1752, 1754], [1753, 1755], [1754, 1756, 1773], [1755, 1757], [1700, 1756, 1758], [1757, 1759], [1758, 1774], [1703, 1777], [1707, 1781], [1711, 1785], [1715, 1789], [1719, 1793], [1723, 1797], [1727, 1801], [1731, 1805], [1735, 1809], [1739, 1813], [1743, 1817], [1747, 1821], [1751, 1825], [1755, 1829], [1759, 1833], [1776, 1834], [1775, 1777], [1760, 1776, 1778], [1777, 1779], [1778, 1780, 1835], [1779, 1781], [1761, 1780, 1782], [1781, 1783], [1782, 1784, 1836], [1783, 1785], [1762, 1784, 1786], [1785, 1787], [1786, 1788, 1837], [1787, 1789], [1763, 1788, 1790], [1789, 1791], [1790, 1792, 1838], [1791, 1793], [1764, 1792, 1794], [1793, 1795], [1794, 1796, 1839], [1795, 1797], [1765, 1796, 1798], [1797, 1799], [1798, 1800, 1840], [1799, 1801], [1766, 1800, 1802], [1801, 1803], [1802, 1804, 1841], [1803, 1805], [1767, 1804, 1806], [1805, 1807], [1806, 1808, 1842], [1807, 1809], [1768, 1808, 1810], [1809, 1811], [1810, 1812, 1843], [1811, 1813], [1769, 1812, 1814], [1813, 1815], [1814, 1816, 1844], [1815, 1817], [1770, 1816, 1818], [1817, 1819], [1818, 1820, 1845], [1819, 1821], [1771, 1820, 1822], [1821, 1823], [1822, 1824, 1846], [1823, 1825], [1772, 1824, 1826], [1825, 1827], [1826, 1828, 1847], [1827, 1829], [1773, 1828, 1830], [1829, 1831], [1830, 1832, 1848], [1831, 1833], [1774, 1832], [1775, 1849], [1779, 1853], [1783, 1857], [1787, 1861], [1791, 1865], [1795, 1869], [1799, 1873], [1803, 1877], [1807, 1881], [1811, 1885], [1815, 1889], [1819, 1893], [1823, 1897], [1827, 1901], [1831, 1905], [1834, 1850], [1849, 1851], [1850, 1852, 1908], [1851, 1853], [1835, 1852, 1854], [1853, 1855], [1854, 1856, 1909], [1855, 1857], [1836, 1856, 1858], [1857, 1859], [1858, 1860, 1910], [1859, 1861], [1837, 1860, 1862], [1861, 1863], [1862, 1864, 1911], [1863, 1865], [1838, 1864, 1866], [1865, 1867], [1866, 1868, 1912], [1867, 1869], [1839, 1868, 1870], [1869, 1871], [1870, 1872, 1913], [1871, 1873], [1840, 1872, 1874], [1873, 1875], [1874, 1876, 1914], [1875, 1877], [1841, 1876, 1878], [1877, 1879], [1878, 1880, 1915], [1879, 1881], [1842, 1880, 1882], [1881, 1883], [1882, 1884, 1916], [1883, 1885], [1843, 1884, 1886], [1885, 1887], [1886, 1888, 1917], [1887, 1889], [1844, 1888, 1890], [1889, 1891], [1890, 1892, 1918], [1891, 1893], [1845, 1892, 1894], [1893, 1895], [1894, 1896, 1919], [1895, 1897], [1846, 1896, 1898], [1897, 1899], [1898, 1900, 1920], [1899, 1901], [1847, 1900, 1902], [1901, 1903], [1902, 1904, 1921], [1903, 1905], [1848, 1904, 1906], [1905, 1907], [1906, 1922], [1851, 1925], [1855, 1929], [1859, 1933], [1863, 1937], [1867, 1941], [1871, 1945], [1875, 1949], [1879, 1953], [1883, 1957], [1887, 1961], [1891, 1965], [1895, 1969], [1899, 1973], [1903, 1977], [1907, 1981], [1924, 1982], [1923, 1925], [1908, 1924, 1926], [1925, 1927], [1926, 1928, 1983], [1927, 1929], [1909, 1928, 1930], [1929, 1931], [1930, 1932, 1984], [1931, 1933], [1910, 1932, 1934], [1933, 1935], [1934, 1936, 1985], [1935, 1937], [1911, 1936, 1938], [1937, 1939], [1938, 1940, 1986], [1939, 1941], [1912, 1940, 1942], [1941, 1943], [1942, 1944, 1987], [1943, 1945], [1913, 1944, 1946], [1945, 1947], [1946, 1948, 1988], [1947, 1949], [1914, 1948, 1950], [1949, 1951], [1950, 1952, 1989], [1951, 1953], [1915, 1952, 1954], [1953, 1955], [1954, 1956, 1990], [1955, 1957], [1916, 1956, 1958], [1957, 1959], [1958, 1960, 1991], [1959, 1961], [1917, 1960, 1962], [1961, 1963], [1962, 1964, 1992], [1963, 1965], [1918, 1964, 1966], [1965, 1967], [1966, 1968, 1993], [1967, 1969], [1919, 1968, 1970], [1969, 1971], [1970, 1972, 1994], [1971, 1973], [1920, 1972, 1974], [1973, 1975], [1974, 1976, 1995], [1975, 1977], [1921, 1976, 1978], [1977, 1979], [1978, 1980, 1996], [1979, 1981], [1922, 1980], [1923, 1997], [1927, 2001], [1931, 2005], [1935, 2009], [1939, 2013], [1943, 2017], [1947, 2021], [1951, 2025], [1955, 2029], [1959, 2033], [1963, 2037], [1967, 2041], [1971, 2045], [1975, 2049], [1979, 2053], [1982, 1998], [1997, 1999], [1998, 2000, 2056], [1999, 2001], [1983, 2000, 2002], [2001, 2003], [2002, 2004, 2057], [2003, 2005], [1984, 2004, 2006], [2005, 2007], [2006, 2008, 2058], [2007, 2009], [1985, 2008, 2010], [2009, 2011], [2010, 2012, 2059], [2011, 2013], [1986, 2012, 2014], [2013, 2015], [2014, 2016, 2060], [2015, 2017], [1987, 2016, 2018], [2017, 2019], [2018, 2020, 2061], [2019, 2021], [1988, 2020, 2022], [2021, 2023], [2022, 2024, 2062], [2023, 2025], [1989, 2024, 2026], [2025, 2027], [2026, 2028, 2063], [2027, 2029], [1990, 2028, 2030], [2029, 2031], [2030, 2032, 2064], [2031, 2033], [1991, 2032, 2034], [2033, 2035], [2034, 2036, 2065], [2035, 2037], [1992, 2036, 2038], [2037, 2039], [2038, 2040, 2066], [2039, 2041], [1993, 2040, 2042], [2041, 2043], [2042, 2044, 2067], [2043, 2045], [1994, 2044, 2046], [2045, 2047], [2046, 2048, 2068], [2047, 2049], [1995, 2048, 2050], [2049, 2051], [2050, 2052, 2069], [2051, 2053], [1996, 2052, 2054], [2053, 2055], [2054, 2070], [1999, 2072], [2003, 2076], [2007, 2080], [2011, 2084], [2015, 2088], [2019, 2092], [2023, 2096], [2027, 2100], [2031, 2104], [2035, 2108], [2039, 2112], [2043, 2116], [2047, 2120], [2051, 2124], [2055, 2128], [2072], [2056, 2071, 2073], [2072, 2074], [2073, 2075], [2074, 2076], [2057, 2075, 2077], [2076, 2078], [2077, 2079], [2078, 2080], [2058, 2079, 2081], [2080, 2082], [2081, 2083], [2082, 2084], [2059, 2083, 2085], [2084, 2086], [2085, 2087], [2086, 2088], [2060, 2087, 2089], [2088, 2090], [2089, 2091], [2090, 2092], [2061, 2091, 2093], [2092, 2094], [2093, 2095], [2094, 2096], [2062, 2095, 2097], [2096, 2098], [2097, 2099], [2098, 2100], [2063, 2099, 2101], [2100, 2102], [2101, 2103], [2102, 2104], [2064, 2103, 2105], [2104, 2106], [2105, 2107], [2106, 2108], [2065, 2107, 2109], [2108, 2110], [2109, 2111], [2110, 2112], [2066, 2111, 2113], [2112, 2114], [2113, 2115], [2114, 2116], [2067, 2115, 2117], [2116, 2118], [2117, 2119], [2118, 2120], [2068, 2119, 2121], [2120, 2122], [2121, 2123], [2122, 2124], [2069, 2123, 2125], [2124, 2126], [2125, 2127], [2126, 2128], [2070, 2127]] -CNOTTIME: [[1, 58], [0, 2], [1, 3], [2, 4], [3, 5, 59], [4, 6], [5, 7], [6, 8], [7, 9, 60], [8, 10], [9, 11], [10, 12], [11, 13, 61], [12, 14], [13, 15], [14, 16], [15, 17, 62], [16, 18], [17, 19], [18, 20], [19, 21, 63], [20, 22], [21, 23], [22, 24], [23, 25, 64], [24, 26], [25, 27], [26, 28], [27, 29, 65], [28, 30], [29, 31], [30, 32], [31, 33, 66], [32, 34], [33, 35], [34, 36], [35, 37, 67], [36, 38], [37, 39], [38, 40], [39, 41, 68], [40, 42], [41, 43], [42, 44], [43, 45, 69], [44, 46], [45, 47], [46, 48], [47, 49, 70], [48, 50], [49, 51], [50, 52], [51, 53, 71], [52, 54], [53, 55], [54, 56], [55, 57, 72], [56], [0, 73], [4, 77], [8, 81], [12, 85], [16, 89], [20, 93], [24, 97], [28, 101], [32, 105], [36, 109], [40, 113], [44, 117], [48, 121], [52, 125], [56, 129], [58, 74], [73, 75], [74, 76, 132], [75, 77], [59, 76, 78], [77, 79], [78, 80, 133], [79, 81], [60, 80, 82], [81, 83], [82, 84, 134], [83, 85], [61, 84, 86], [85, 87], [86, 88, 135], [87, 89], [62, 88, 90], [89, 91], [90, 92, 136], [91, 93], [63, 92, 94], [93, 95], [94, 96, 137], [95, 97], [64, 96, 98], [97, 99], [98, 100, 138], [99, 101], [65, 100, 102], [101, 103], [102, 104, 139], [103, 105], [66, 104, 106], [105, 107], [106, 108, 140], [107, 109], [67, 108, 110], [109, 111], [110, 112, 141], [111, 113], [68, 112, 114], [113, 115], [114, 116, 142], [115, 117], [69, 116, 118], [117, 119], [118, 120, 143], [119, 121], [70, 120, 122], [121, 123], [122, 124, 144], [123, 125], [71, 124, 126], [125, 127], [126, 128, 145], [127, 129], [72, 128, 130], [129, 131], [130, 146], [75, 149], [79, 153], [83, 157], [87, 161], [91, 165], [95, 169], [99, 173], [103, 177], [107, 181], [111, 185], [115, 189], [119, 193], [123, 197], [127, 201], [131, 205], [148, 206], [147, 149], [132, 148, 150], [149, 151], [150, 152, 207], [151, 153], [133, 152, 154], [153, 155], [154, 156, 208], [155, 157], [134, 156, 158], [157, 159], [158, 160, 209], [159, 161], [135, 160, 162], [161, 163], [162, 164, 210], [163, 165], [136, 164, 166], [165, 167], [166, 168, 211], [167, 169], [137, 168, 170], [169, 171], [170, 172, 212], [171, 173], [138, 172, 174], [173, 175], [174, 176, 213], [175, 177], [139, 176, 178], [177, 179], [178, 180, 214], [179, 181], [140, 180, 182], [181, 183], [182, 184, 215], [183, 185], [141, 184, 186], [185, 187], [186, 188, 216], [187, 189], [142, 188, 190], [189, 191], [190, 192, 217], [191, 193], [143, 192, 194], [193, 195], [194, 196, 218], [195, 197], [144, 196, 198], [197, 199], [198, 200, 219], [199, 201], [145, 200, 202], [201, 203], [202, 204, 220], [203, 205], [146, 204], [147, 221], [151, 225], [155, 229], [159, 233], [163, 237], [167, 241], [171, 245], [175, 249], [179, 253], [183, 257], [187, 261], [191, 265], [195, 269], [199, 273], [203, 277], [206, 222], [221, 223], [222, 224, 280], [223, 225], [207, 224, 226], [225, 227], [226, 228, 281], [227, 229], [208, 228, 230], [229, 231], [230, 232, 282], [231, 233], [209, 232, 234], [233, 235], [234, 236, 283], [235, 237], [210, 236, 238], [237, 239], [238, 240, 284], [239, 241], [211, 240, 242], [241, 243], [242, 244, 285], [243, 245], [212, 244, 246], [245, 247], [246, 248, 286], [247, 249], [213, 248, 250], [249, 251], [250, 252, 287], [251, 253], [214, 252, 254], [253, 255], [254, 256, 288], [255, 257], [215, 256, 258], [257, 259], [258, 260, 289], [259, 261], [216, 260, 262], [261, 263], [262, 264, 290], [263, 265], [217, 264, 266], [265, 267], [266, 268, 291], [267, 269], [218, 268, 270], [269, 271], [270, 272, 292], [271, 273], [219, 272, 274], [273, 275], [274, 276, 293], [275, 277], [220, 276, 278], [277, 279], [278, 294], [223, 297], [227, 301], [231, 305], [235, 309], [239, 313], [243, 317], [247, 321], [251, 325], [255, 329], [259, 333], [263, 337], [267, 341], [271, 345], [275, 349], [279, 353], [296, 354], [295, 297], [280, 296, 298], [297, 299], [298, 300, 355], [299, 301], [281, 300, 302], [301, 303], [302, 304, 356], [303, 305], [282, 304, 306], [305, 307], [306, 308, 357], [307, 309], [283, 308, 310], [309, 311], [310, 312, 358], [311, 313], [284, 312, 314], [313, 315], [314, 316, 359], [315, 317], [285, 316, 318], [317, 319], [318, 320, 360], [319, 321], [286, 320, 322], [321, 323], [322, 324, 361], [323, 325], [287, 324, 326], [325, 327], [326, 328, 362], [327, 329], [288, 328, 330], [329, 331], [330, 332, 363], [331, 333], [289, 332, 334], [333, 335], [334, 336, 364], [335, 337], [290, 336, 338], [337, 339], [338, 340, 365], [339, 341], [291, 340, 342], [341, 343], [342, 344, 366], [343, 345], [292, 344, 346], [345, 347], [346, 348, 367], [347, 349], [293, 348, 350], [349, 351], [350, 352, 368], [351, 353], [294, 352], [295, 369], [299, 373], [303, 377], [307, 381], [311, 385], [315, 389], [319, 393], [323, 397], [327, 401], [331, 405], [335, 409], [339, 413], [343, 417], [347, 421], [351, 425], [354, 370], [369, 371], [370, 372, 428], [371, 373], [355, 372, 374], [373, 375], [374, 376, 429], [375, 377], [356, 376, 378], [377, 379], [378, 380, 430], [379, 381], [357, 380, 382], [381, 383], [382, 384, 431], [383, 385], [358, 384, 386], [385, 387], [386, 388, 432], [387, 389], [359, 388, 390], [389, 391], [390, 392, 433], [391, 393], [360, 392, 394], [393, 395], [394, 396, 434], [395, 397], [361, 396, 398], [397, 399], [398, 400, 435], [399, 401], [362, 400, 402], [401, 403], [402, 404, 436], [403, 405], [363, 404, 406], [405, 407], [406, 408, 437], [407, 409], [364, 408, 410], [409, 411], [410, 412, 438], [411, 413], [365, 412, 414], [413, 415], [414, 416, 439], [415, 417], [366, 416, 418], [417, 419], [418, 420, 440], [419, 421], [367, 420, 422], [421, 423], [422, 424, 441], [423, 425], [368, 424, 426], [425, 427], [426, 442], [371, 445], [375, 449], [379, 453], [383, 457], [387, 461], [391, 465], [395, 469], [399, 473], [403, 477], [407, 481], [411, 485], [415, 489], [419, 493], [423, 497], [427, 501], [444, 502], [443, 445], [428, 444, 446], [445, 447], [446, 448, 503], [447, 449], [429, 448, 450], [449, 451], [450, 452, 504], [451, 453], [430, 452, 454], [453, 455], [454, 456, 505], [455, 457], [431, 456, 458], [457, 459], [458, 460, 506], [459, 461], [432, 460, 462], [461, 463], [462, 464, 507], [463, 465], [433, 464, 466], [465, 467], [466, 468, 508], [467, 469], [434, 468, 470], [469, 471], [470, 472, 509], [471, 473], [435, 472, 474], [473, 475], [474, 476, 510], [475, 477], [436, 476, 478], [477, 479], [478, 480, 511], [479, 481], [437, 480, 482], [481, 483], [482, 484, 512], [483, 485], [438, 484, 486], [485, 487], [486, 488, 513], [487, 489], [439, 488, 490], [489, 491], [490, 492, 514], [491, 493], [440, 492, 494], [493, 495], [494, 496, 515], [495, 497], [441, 496, 498], [497, 499], [498, 500, 516], [499, 501], [442, 500], [443, 517], [447, 521], [451, 525], [455, 529], [459, 533], [463, 537], [467, 541], [471, 545], [475, 549], [479, 553], [483, 557], [487, 561], [491, 565], [495, 569], [499, 573], [502, 518], [517, 519], [518, 520, 576], [519, 521], [503, 520, 522], [521, 523], [522, 524, 577], [523, 525], [504, 524, 526], [525, 527], [526, 528, 578], [527, 529], [505, 528, 530], [529, 531], [530, 532, 579], [531, 533], [506, 532, 534], [533, 535], [534, 536, 580], [535, 537], [507, 536, 538], [537, 539], [538, 540, 581], [539, 541], [508, 540, 542], [541, 543], [542, 544, 582], [543, 545], [509, 544, 546], [545, 547], [546, 548, 583], [547, 549], [510, 548, 550], [549, 551], [550, 552, 584], [551, 553], [511, 552, 554], [553, 555], [554, 556, 585], [555, 557], [512, 556, 558], [557, 559], [558, 560, 586], [559, 561], [513, 560, 562], [561, 563], [562, 564, 587], [563, 565], [514, 564, 566], [565, 567], [566, 568, 588], [567, 569], [515, 568, 570], [569, 571], [570, 572, 589], [571, 573], [516, 572, 574], [573, 575], [574, 590], [519, 593], [523, 597], [527, 601], [531, 605], [535, 609], [539, 613], [543, 617], [547, 621], [551, 625], [555, 629], [559, 633], [563, 637], [567, 641], [571, 645], [575, 649], [592, 650], [591, 593], [576, 592, 594], [593, 595], [594, 596, 651], [595, 597], [577, 596, 598], [597, 599], [598, 600, 652], [599, 601], [578, 600, 602], [601, 603], [602, 604, 653], [603, 605], [579, 604, 606], [605, 607], [606, 608, 654], [607, 609], [580, 608, 610], [609, 611], [610, 612, 655], [611, 613], [581, 612, 614], [613, 615], [614, 616, 656], [615, 617], [582, 616, 618], [617, 619], [618, 620, 657], [619, 621], [583, 620, 622], [621, 623], [622, 624, 658], [623, 625], [584, 624, 626], [625, 627], [626, 628, 659], [627, 629], [585, 628, 630], [629, 631], [630, 632, 660], [631, 633], [586, 632, 634], [633, 635], [634, 636, 661], [635, 637], [587, 636, 638], [637, 639], [638, 640, 662], [639, 641], [588, 640, 642], [641, 643], [642, 644, 663], [643, 645], [589, 644, 646], [645, 647], [646, 648, 664], [647, 649], [590, 648], [591, 665], [595, 669], [599, 673], [603, 677], [607, 681], [611, 685], [615, 689], [619, 693], [623, 697], [627, 701], [631, 705], [635, 709], [639, 713], [643, 717], [647, 721], [650, 666], [665, 667], [666, 668, 724], [667, 669], [651, 668, 670], [669, 671], [670, 672, 725], [671, 673], [652, 672, 674], [673, 675], [674, 676, 726], [675, 677], [653, 676, 678], [677, 679], [678, 680, 727], [679, 681], [654, 680, 682], [681, 683], [682, 684, 728], [683, 685], [655, 684, 686], [685, 687], [686, 688, 729], [687, 689], [656, 688, 690], [689, 691], [690, 692, 730], [691, 693], [657, 692, 694], [693, 695], [694, 696, 731], [695, 697], [658, 696, 698], [697, 699], [698, 700, 732], [699, 701], [659, 700, 702], [701, 703], [702, 704, 733], [703, 705], [660, 704, 706], [705, 707], [706, 708, 734], [707, 709], [661, 708, 710], [709, 711], [710, 712, 735], [711, 713], [662, 712, 714], [713, 715], [714, 716, 736], [715, 717], [663, 716, 718], [717, 719], [718, 720, 737], [719, 721], [664, 720, 722], [721, 723], [722, 738], [667, 741], [671, 745], [675, 749], [679, 753], [683, 757], [687, 761], [691, 765], [695, 769], [699, 773], [703, 777], [707, 781], [711, 785], [715, 789], [719, 793], [723, 797], [740, 798], [739, 741], [724, 740, 742], [741, 743], [742, 744, 799], [743, 745], [725, 744, 746], [745, 747], [746, 748, 800], [747, 749], [726, 748, 750], [749, 751], [750, 752, 801], [751, 753], [727, 752, 754], [753, 755], [754, 756, 802], [755, 757], [728, 756, 758], [757, 759], [758, 760, 803], [759, 761], [729, 760, 762], [761, 763], [762, 764, 804], [763, 765], [730, 764, 766], [765, 767], [766, 768, 805], [767, 769], [731, 768, 770], [769, 771], [770, 772, 806], [771, 773], [732, 772, 774], [773, 775], [774, 776, 807], [775, 777], [733, 776, 778], [777, 779], [778, 780, 808], [779, 781], [734, 780, 782], [781, 783], [782, 784, 809], [783, 785], [735, 784, 786], [785, 787], [786, 788, 810], [787, 789], [736, 788, 790], [789, 791], [790, 792, 811], [791, 793], [737, 792, 794], [793, 795], [794, 796, 812], [795, 797], [738, 796], [739, 813], [743, 817], [747, 821], [751, 825], [755, 829], [759, 833], [763, 837], [767, 841], [771, 845], [775, 849], [779, 853], [783, 857], [787, 861], [791, 865], [795, 869], [798, 814], [813, 815], [814, 816, 872], [815, 817], [799, 816, 818], [817, 819], [818, 820, 873], [819, 821], [800, 820, 822], [821, 823], [822, 824, 874], [823, 825], [801, 824, 826], [825, 827], [826, 828, 875], [827, 829], [802, 828, 830], [829, 831], [830, 832, 876], [831, 833], [803, 832, 834], [833, 835], [834, 836, 877], [835, 837], [804, 836, 838], [837, 839], [838, 840, 878], [839, 841], [805, 840, 842], [841, 843], [842, 844, 879], [843, 845], [806, 844, 846], [845, 847], [846, 848, 880], [847, 849], [807, 848, 850], [849, 851], [850, 852, 881], [851, 853], [808, 852, 854], [853, 855], [854, 856, 882], [855, 857], [809, 856, 858], [857, 859], [858, 860, 883], [859, 861], [810, 860, 862], [861, 863], [862, 864, 884], [863, 865], [811, 864, 866], [865, 867], [866, 868, 885], [867, 869], [812, 868, 870], [869, 871], [870, 886], [815, 889], [819, 893], [823, 897], [827, 901], [831, 905], [835, 909], [839, 913], [843, 917], [847, 921], [851, 925], [855, 929], [859, 933], [863, 937], [867, 941], [871, 945], [888, 946], [887, 889], [872, 888, 890], [889, 891], [890, 892, 947], [891, 893], [873, 892, 894], [893, 895], [894, 896, 948], [895, 897], [874, 896, 898], [897, 899], [898, 900, 949], [899, 901], [875, 900, 902], [901, 903], [902, 904, 950], [903, 905], [876, 904, 906], [905, 907], [906, 908, 951], [907, 909], [877, 908, 910], [909, 911], [910, 912, 952], [911, 913], [878, 912, 914], [913, 915], [914, 916, 953], [915, 917], [879, 916, 918], [917, 919], [918, 920, 954], [919, 921], [880, 920, 922], [921, 923], [922, 924, 955], [923, 925], [881, 924, 926], [925, 927], [926, 928, 956], [927, 929], [882, 928, 930], [929, 931], [930, 932, 957], [931, 933], [883, 932, 934], [933, 935], [934, 936, 958], [935, 937], [884, 936, 938], [937, 939], [938, 940, 959], [939, 941], [885, 940, 942], [941, 943], [942, 944, 960], [943, 945], [886, 944], [887, 961], [891, 965], [895, 969], [899, 973], [903, 977], [907, 981], [911, 985], [915, 989], [919, 993], [923, 997], [927, 1001], [931, 1005], [935, 1009], [939, 1013], [943, 1017], [946, 962], [961, 963], [962, 964, 1020], [963, 965], [947, 964, 966], [965, 967], [966, 968, 1021], [967, 969], [948, 968, 970], [969, 971], [970, 972, 1022], [971, 973], [949, 972, 974], [973, 975], [974, 976, 1023], [975, 977], [950, 976, 978], [977, 979], [978, 980, 1024], [979, 981], [951, 980, 982], [981, 983], [982, 984, 1025], [983, 985], [952, 984, 986], [985, 987], [986, 988, 1026], [987, 989], [953, 988, 990], [989, 991], [990, 992, 1027], [991, 993], [954, 992, 994], [993, 995], [994, 996, 1028], [995, 997], [955, 996, 998], [997, 999], [998, 1000, 1029], [999, 1001], [956, 1000, 1002], [1001, 1003], [1002, 1004, 1030], [1003, 1005], [957, 1004, 1006], [1005, 1007], [1006, 1008, 1031], [1007, 1009], [958, 1008, 1010], [1009, 1011], [1010, 1012, 1032], [1011, 1013], [959, 1012, 1014], [1013, 1015], [1014, 1016, 1033], [1015, 1017], [960, 1016, 1018], [1017, 1019], [1018, 1034], [963, 1037], [967, 1041], [971, 1045], [975, 1049], [979, 1053], [983, 1057], [987, 1061], [991, 1065], [995, 1069], [999, 1073], [1003, 1077], [1007, 1081], [1011, 1085], [1015, 1089], [1019, 1093], [1036, 1094], [1035, 1037], [1020, 1036, 1038], [1037, 1039], [1038, 1040, 1095], [1039, 1041], [1021, 1040, 1042], [1041, 1043], [1042, 1044, 1096], [1043, 1045], [1022, 1044, 1046], [1045, 1047], [1046, 1048, 1097], [1047, 1049], [1023, 1048, 1050], [1049, 1051], [1050, 1052, 1098], [1051, 1053], [1024, 1052, 1054], [1053, 1055], [1054, 1056, 1099], [1055, 1057], [1025, 1056, 1058], [1057, 1059], [1058, 1060, 1100], [1059, 1061], [1026, 1060, 1062], [1061, 1063], [1062, 1064, 1101], [1063, 1065], [1027, 1064, 1066], [1065, 1067], [1066, 1068, 1102], [1067, 1069], [1028, 1068, 1070], [1069, 1071], [1070, 1072, 1103], [1071, 1073], [1029, 1072, 1074], [1073, 1075], [1074, 1076, 1104], [1075, 1077], [1030, 1076, 1078], [1077, 1079], [1078, 1080, 1105], [1079, 1081], [1031, 1080, 1082], [1081, 1083], [1082, 1084, 1106], [1083, 1085], [1032, 1084, 1086], [1085, 1087], [1086, 1088, 1107], [1087, 1089], [1033, 1088, 1090], [1089, 1091], [1090, 1092, 1108], [1091, 1093], [1034, 1092], [1035, 1109], [1039, 1113], [1043, 1117], [1047, 1121], [1051, 1125], [1055, 1129], [1059, 1133], [1063, 1137], [1067, 1141], [1071, 1145], [1075, 1149], [1079, 1153], [1083, 1157], [1087, 1161], [1091, 1165], [1094, 1110], [1109, 1111], [1110, 1112, 1168], [1111, 1113], [1095, 1112, 1114], [1113, 1115], [1114, 1116, 1169], [1115, 1117], [1096, 1116, 1118], [1117, 1119], [1118, 1120, 1170], [1119, 1121], [1097, 1120, 1122], [1121, 1123], [1122, 1124, 1171], [1123, 1125], [1098, 1124, 1126], [1125, 1127], [1126, 1128, 1172], [1127, 1129], [1099, 1128, 1130], [1129, 1131], [1130, 1132, 1173], [1131, 1133], [1100, 1132, 1134], [1133, 1135], [1134, 1136, 1174], [1135, 1137], [1101, 1136, 1138], [1137, 1139], [1138, 1140, 1175], [1139, 1141], [1102, 1140, 1142], [1141, 1143], [1142, 1144, 1176], [1143, 1145], [1103, 1144, 1146], [1145, 1147], [1146, 1148, 1177], [1147, 1149], [1104, 1148, 1150], [1149, 1151], [1150, 1152, 1178], [1151, 1153], [1105, 1152, 1154], [1153, 1155], [1154, 1156, 1179], [1155, 1157], [1106, 1156, 1158], [1157, 1159], [1158, 1160, 1180], [1159, 1161], [1107, 1160, 1162], [1161, 1163], [1162, 1164, 1181], [1163, 1165], [1108, 1164, 1166], [1165, 1167], [1166, 1182], [1111, 1185], [1115, 1189], [1119, 1193], [1123, 1197], [1127, 1201], [1131, 1205], [1135, 1209], [1139, 1213], [1143, 1217], [1147, 1221], [1151, 1225], [1155, 1229], [1159, 1233], [1163, 1237], [1167, 1241], [1184, 1242], [1183, 1185], [1168, 1184, 1186], [1185, 1187], [1186, 1188, 1243], [1187, 1189], [1169, 1188, 1190], [1189, 1191], [1190, 1192, 1244], [1191, 1193], [1170, 1192, 1194], [1193, 1195], [1194, 1196, 1245], [1195, 1197], [1171, 1196, 1198], [1197, 1199], [1198, 1200, 1246], [1199, 1201], [1172, 1200, 1202], [1201, 1203], [1202, 1204, 1247], [1203, 1205], [1173, 1204, 1206], [1205, 1207], [1206, 1208, 1248], [1207, 1209], [1174, 1208, 1210], [1209, 1211], [1210, 1212, 1249], [1211, 1213], [1175, 1212, 1214], [1213, 1215], [1214, 1216, 1250], [1215, 1217], [1176, 1216, 1218], [1217, 1219], [1218, 1220, 1251], [1219, 1221], [1177, 1220, 1222], [1221, 1223], [1222, 1224, 1252], [1223, 1225], [1178, 1224, 1226], [1225, 1227], [1226, 1228, 1253], [1227, 1229], [1179, 1228, 1230], [1229, 1231], [1230, 1232, 1254], [1231, 1233], [1180, 1232, 1234], [1233, 1235], [1234, 1236, 1255], [1235, 1237], [1181, 1236, 1238], [1237, 1239], [1238, 1240, 1256], [1239, 1241], [1182, 1240], [1183, 1257], [1187, 1261], [1191, 1265], [1195, 1269], [1199, 1273], [1203, 1277], [1207, 1281], [1211, 1285], [1215, 1289], [1219, 1293], [1223, 1297], [1227, 1301], [1231, 1305], [1235, 1309], [1239, 1313], [1242, 1258], [1257, 1259], [1258, 1260, 1316], [1259, 1261], [1243, 1260, 1262], [1261, 1263], [1262, 1264, 1317], [1263, 1265], [1244, 1264, 1266], [1265, 1267], [1266, 1268, 1318], [1267, 1269], [1245, 1268, 1270], [1269, 1271], [1270, 1272, 1319], [1271, 1273], [1246, 1272, 1274], [1273, 1275], [1274, 1276, 1320], [1275, 1277], [1247, 1276, 1278], [1277, 1279], [1278, 1280, 1321], [1279, 1281], [1248, 1280, 1282], [1281, 1283], [1282, 1284, 1322], [1283, 1285], [1249, 1284, 1286], [1285, 1287], [1286, 1288, 1323], [1287, 1289], [1250, 1288, 1290], [1289, 1291], [1290, 1292, 1324], [1291, 1293], [1251, 1292, 1294], [1293, 1295], [1294, 1296, 1325], [1295, 1297], [1252, 1296, 1298], [1297, 1299], [1298, 1300, 1326], [1299, 1301], [1253, 1300, 1302], [1301, 1303], [1302, 1304, 1327], [1303, 1305], [1254, 1304, 1306], [1305, 1307], [1306, 1308, 1328], [1307, 1309], [1255, 1308, 1310], [1309, 1311], [1310, 1312, 1329], [1311, 1313], [1256, 1312, 1314], [1313, 1315], [1314, 1330], [1259, 1333], [1263, 1337], [1267, 1341], [1271, 1345], [1275, 1349], [1279, 1353], [1283, 1357], [1287, 1361], [1291, 1365], [1295, 1369], [1299, 1373], [1303, 1377], [1307, 1381], [1311, 1385], [1315, 1389], [1332, 1390], [1331, 1333], [1316, 1332, 1334], [1333, 1335], [1334, 1336, 1391], [1335, 1337], [1317, 1336, 1338], [1337, 1339], [1338, 1340, 1392], [1339, 1341], [1318, 1340, 1342], [1341, 1343], [1342, 1344, 1393], [1343, 1345], [1319, 1344, 1346], [1345, 1347], [1346, 1348, 1394], [1347, 1349], [1320, 1348, 1350], [1349, 1351], [1350, 1352, 1395], [1351, 1353], [1321, 1352, 1354], [1353, 1355], [1354, 1356, 1396], [1355, 1357], [1322, 1356, 1358], [1357, 1359], [1358, 1360, 1397], [1359, 1361], [1323, 1360, 1362], [1361, 1363], [1362, 1364, 1398], [1363, 1365], [1324, 1364, 1366], [1365, 1367], [1366, 1368, 1399], [1367, 1369], [1325, 1368, 1370], [1369, 1371], [1370, 1372, 1400], [1371, 1373], [1326, 1372, 1374], [1373, 1375], [1374, 1376, 1401], [1375, 1377], [1327, 1376, 1378], [1377, 1379], [1378, 1380, 1402], [1379, 1381], [1328, 1380, 1382], [1381, 1383], [1382, 1384, 1403], [1383, 1385], [1329, 1384, 1386], [1385, 1387], [1386, 1388, 1404], [1387, 1389], [1330, 1388], [1331, 1405], [1335, 1409], [1339, 1413], [1343, 1417], [1347, 1421], [1351, 1425], [1355, 1429], [1359, 1433], [1363, 1437], [1367, 1441], [1371, 1445], [1375, 1449], [1379, 1453], [1383, 1457], [1387, 1461], [1390, 1406], [1405, 1407], [1406, 1408, 1464], [1407, 1409], [1391, 1408, 1410], [1409, 1411], [1410, 1412, 1465], [1411, 1413], [1392, 1412, 1414], [1413, 1415], [1414, 1416, 1466], [1415, 1417], [1393, 1416, 1418], [1417, 1419], [1418, 1420, 1467], [1419, 1421], [1394, 1420, 1422], [1421, 1423], [1422, 1424, 1468], [1423, 1425], [1395, 1424, 1426], [1425, 1427], [1426, 1428, 1469], [1427, 1429], [1396, 1428, 1430], [1429, 1431], [1430, 1432, 1470], [1431, 1433], [1397, 1432, 1434], [1433, 1435], [1434, 1436, 1471], [1435, 1437], [1398, 1436, 1438], [1437, 1439], [1438, 1440, 1472], [1439, 1441], [1399, 1440, 1442], [1441, 1443], [1442, 1444, 1473], [1443, 1445], [1400, 1444, 1446], [1445, 1447], [1446, 1448, 1474], [1447, 1449], [1401, 1448, 1450], [1449, 1451], [1450, 1452, 1475], [1451, 1453], [1402, 1452, 1454], [1453, 1455], [1454, 1456, 1476], [1455, 1457], [1403, 1456, 1458], [1457, 1459], [1458, 1460, 1477], [1459, 1461], [1404, 1460, 1462], [1461, 1463], [1462, 1478], [1407, 1481], [1411, 1485], [1415, 1489], [1419, 1493], [1423, 1497], [1427, 1501], [1431, 1505], [1435, 1509], [1439, 1513], [1443, 1517], [1447, 1521], [1451, 1525], [1455, 1529], [1459, 1533], [1463, 1537], [1480, 1538], [1479, 1481], [1464, 1480, 1482], [1481, 1483], [1482, 1484, 1539], [1483, 1485], [1465, 1484, 1486], [1485, 1487], [1486, 1488, 1540], [1487, 1489], [1466, 1488, 1490], [1489, 1491], [1490, 1492, 1541], [1491, 1493], [1467, 1492, 1494], [1493, 1495], [1494, 1496, 1542], [1495, 1497], [1468, 1496, 1498], [1497, 1499], [1498, 1500, 1543], [1499, 1501], [1469, 1500, 1502], [1501, 1503], [1502, 1504, 1544], [1503, 1505], [1470, 1504, 1506], [1505, 1507], [1506, 1508, 1545], [1507, 1509], [1471, 1508, 1510], [1509, 1511], [1510, 1512, 1546], [1511, 1513], [1472, 1512, 1514], [1513, 1515], [1514, 1516, 1547], [1515, 1517], [1473, 1516, 1518], [1517, 1519], [1518, 1520, 1548], [1519, 1521], [1474, 1520, 1522], [1521, 1523], [1522, 1524, 1549], [1523, 1525], [1475, 1524, 1526], [1525, 1527], [1526, 1528, 1550], [1527, 1529], [1476, 1528, 1530], [1529, 1531], [1530, 1532, 1551], [1531, 1533], [1477, 1532, 1534], [1533, 1535], [1534, 1536, 1552], [1535, 1537], [1478, 1536], [1479, 1553], [1483, 1557], [1487, 1561], [1491, 1565], [1495, 1569], [1499, 1573], [1503, 1577], [1507, 1581], [1511, 1585], [1515, 1589], [1519, 1593], [1523, 1597], [1527, 1601], [1531, 1605], [1535, 1609], [1538, 1554], [1553, 1555], [1554, 1556, 1612], [1555, 1557], [1539, 1556, 1558], [1557, 1559], [1558, 1560, 1613], [1559, 1561], [1540, 1560, 1562], [1561, 1563], [1562, 1564, 1614], [1563, 1565], [1541, 1564, 1566], [1565, 1567], [1566, 1568, 1615], [1567, 1569], [1542, 1568, 1570], [1569, 1571], [1570, 1572, 1616], [1571, 1573], [1543, 1572, 1574], [1573, 1575], [1574, 1576, 1617], [1575, 1577], [1544, 1576, 1578], [1577, 1579], [1578, 1580, 1618], [1579, 1581], [1545, 1580, 1582], [1581, 1583], [1582, 1584, 1619], [1583, 1585], [1546, 1584, 1586], [1585, 1587], [1586, 1588, 1620], [1587, 1589], [1547, 1588, 1590], [1589, 1591], [1590, 1592, 1621], [1591, 1593], [1548, 1592, 1594], [1593, 1595], [1594, 1596, 1622], [1595, 1597], [1549, 1596, 1598], [1597, 1599], [1598, 1600, 1623], [1599, 1601], [1550, 1600, 1602], [1601, 1603], [1602, 1604, 1624], [1603, 1605], [1551, 1604, 1606], [1605, 1607], [1606, 1608, 1625], [1607, 1609], [1552, 1608, 1610], [1609, 1611], [1610, 1626], [1555, 1629], [1559, 1633], [1563, 1637], [1567, 1641], [1571, 1645], [1575, 1649], [1579, 1653], [1583, 1657], [1587, 1661], [1591, 1665], [1595, 1669], [1599, 1673], [1603, 1677], [1607, 1681], [1611, 1685], [1628, 1686], [1627, 1629], [1612, 1628, 1630], [1629, 1631], [1630, 1632, 1687], [1631, 1633], [1613, 1632, 1634], [1633, 1635], [1634, 1636, 1688], [1635, 1637], [1614, 1636, 1638], [1637, 1639], [1638, 1640, 1689], [1639, 1641], [1615, 1640, 1642], [1641, 1643], [1642, 1644, 1690], [1643, 1645], [1616, 1644, 1646], [1645, 1647], [1646, 1648, 1691], [1647, 1649], [1617, 1648, 1650], [1649, 1651], [1650, 1652, 1692], [1651, 1653], [1618, 1652, 1654], [1653, 1655], [1654, 1656, 1693], [1655, 1657], [1619, 1656, 1658], [1657, 1659], [1658, 1660, 1694], [1659, 1661], [1620, 1660, 1662], [1661, 1663], [1662, 1664, 1695], [1663, 1665], [1621, 1664, 1666], [1665, 1667], [1666, 1668, 1696], [1667, 1669], [1622, 1668, 1670], [1669, 1671], [1670, 1672, 1697], [1671, 1673], [1623, 1672, 1674], [1673, 1675], [1674, 1676, 1698], [1675, 1677], [1624, 1676, 1678], [1677, 1679], [1678, 1680, 1699], [1679, 1681], [1625, 1680, 1682], [1681, 1683], [1682, 1684, 1700], [1683, 1685], [1626, 1684], [1627, 1701], [1631, 1705], [1635, 1709], [1639, 1713], [1643, 1717], [1647, 1721], [1651, 1725], [1655, 1729], [1659, 1733], [1663, 1737], [1667, 1741], [1671, 1745], [1675, 1749], [1679, 1753], [1683, 1757], [1686, 1702], [1701, 1703], [1702, 1704, 1760], [1703, 1705], [1687, 1704, 1706], [1705, 1707], [1706, 1708, 1761], [1707, 1709], [1688, 1708, 1710], [1709, 1711], [1710, 1712, 1762], [1711, 1713], [1689, 1712, 1714], [1713, 1715], [1714, 1716, 1763], [1715, 1717], [1690, 1716, 1718], [1717, 1719], [1718, 1720, 1764], [1719, 1721], [1691, 1720, 1722], [1721, 1723], [1722, 1724, 1765], [1723, 1725], [1692, 1724, 1726], [1725, 1727], [1726, 1728, 1766], [1727, 1729], [1693, 1728, 1730], [1729, 1731], [1730, 1732, 1767], [1731, 1733], [1694, 1732, 1734], [1733, 1735], [1734, 1736, 1768], [1735, 1737], [1695, 1736, 1738], [1737, 1739], [1738, 1740, 1769], [1739, 1741], [1696, 1740, 1742], [1741, 1743], [1742, 1744, 1770], [1743, 1745], [1697, 1744, 1746], [1745, 1747], [1746, 1748, 1771], [1747, 1749], [1698, 1748, 1750], [1749, 1751], [1750, 1752, 1772], [1751, 1753], [1699, 1752, 1754], [1753, 1755], [1754, 1756, 1773], [1755, 1757], [1700, 1756, 1758], [1757, 1759], [1758, 1774], [1703, 1777], [1707, 1781], [1711, 1785], [1715, 1789], [1719, 1793], [1723, 1797], [1727, 1801], [1731, 1805], [1735, 1809], [1739, 1813], [1743, 1817], [1747, 1821], [1751, 1825], [1755, 1829], [1759, 1833], [1776, 1834], [1775, 1777], [1760, 1776, 1778], [1777, 1779], [1778, 1780, 1835], [1779, 1781], [1761, 1780, 1782], [1781, 1783], [1782, 1784, 1836], [1783, 1785], [1762, 1784, 1786], [1785, 1787], [1786, 1788, 1837], [1787, 1789], [1763, 1788, 1790], [1789, 1791], [1790, 1792, 1838], [1791, 1793], [1764, 1792, 1794], [1793, 1795], [1794, 1796, 1839], [1795, 1797], [1765, 1796, 1798], [1797, 1799], [1798, 1800, 1840], [1799, 1801], [1766, 1800, 1802], [1801, 1803], [1802, 1804, 1841], [1803, 1805], [1767, 1804, 1806], [1805, 1807], [1806, 1808, 1842], [1807, 1809], [1768, 1808, 1810], [1809, 1811], [1810, 1812, 1843], [1811, 1813], [1769, 1812, 1814], [1813, 1815], [1814, 1816, 1844], [1815, 1817], [1770, 1816, 1818], [1817, 1819], [1818, 1820, 1845], [1819, 1821], [1771, 1820, 1822], [1821, 1823], [1822, 1824, 1846], [1823, 1825], [1772, 1824, 1826], [1825, 1827], [1826, 1828, 1847], [1827, 1829], [1773, 1828, 1830], [1829, 1831], [1830, 1832, 1848], [1831, 1833], [1774, 1832], [1775, 1849], [1779, 1853], [1783, 1857], [1787, 1861], [1791, 1865], [1795, 1869], [1799, 1873], [1803, 1877], [1807, 1881], [1811, 1885], [1815, 1889], [1819, 1893], [1823, 1897], [1827, 1901], [1831, 1905], [1834, 1850], [1849, 1851], [1850, 1852, 1908], [1851, 1853], [1835, 1852, 1854], [1853, 1855], [1854, 1856, 1909], [1855, 1857], [1836, 1856, 1858], [1857, 1859], [1858, 1860, 1910], [1859, 1861], [1837, 1860, 1862], [1861, 1863], [1862, 1864, 1911], [1863, 1865], [1838, 1864, 1866], [1865, 1867], [1866, 1868, 1912], [1867, 1869], [1839, 1868, 1870], [1869, 1871], [1870, 1872, 1913], [1871, 1873], [1840, 1872, 1874], [1873, 1875], [1874, 1876, 1914], [1875, 1877], [1841, 1876, 1878], [1877, 1879], [1878, 1880, 1915], [1879, 1881], [1842, 1880, 1882], [1881, 1883], [1882, 1884, 1916], [1883, 1885], [1843, 1884, 1886], [1885, 1887], [1886, 1888, 1917], [1887, 1889], [1844, 1888, 1890], [1889, 1891], [1890, 1892, 1918], [1891, 1893], [1845, 1892, 1894], [1893, 1895], [1894, 1896, 1919], [1895, 1897], [1846, 1896, 1898], [1897, 1899], [1898, 1900, 1920], [1899, 1901], [1847, 1900, 1902], [1901, 1903], [1902, 1904, 1921], [1903, 1905], [1848, 1904, 1906], [1905, 1907], [1906, 1922], [1851, 1925], [1855, 1929], [1859, 1933], [1863, 1937], [1867, 1941], [1871, 1945], [1875, 1949], [1879, 1953], [1883, 1957], [1887, 1961], [1891, 1965], [1895, 1969], [1899, 1973], [1903, 1977], [1907, 1981], [1924, 1982], [1923, 1925], [1908, 1924, 1926], [1925, 1927], [1926, 1928, 1983], [1927, 1929], [1909, 1928, 1930], [1929, 1931], [1930, 1932, 1984], [1931, 1933], [1910, 1932, 1934], [1933, 1935], [1934, 1936, 1985], [1935, 1937], [1911, 1936, 1938], [1937, 1939], [1938, 1940, 1986], [1939, 1941], [1912, 1940, 1942], [1941, 1943], [1942, 1944, 1987], [1943, 1945], [1913, 1944, 1946], [1945, 1947], [1946, 1948, 1988], [1947, 1949], [1914, 1948, 1950], [1949, 1951], [1950, 1952, 1989], [1951, 1953], [1915, 1952, 1954], [1953, 1955], [1954, 1956, 1990], [1955, 1957], [1916, 1956, 1958], [1957, 1959], [1958, 1960, 1991], [1959, 1961], [1917, 1960, 1962], [1961, 1963], [1962, 1964, 1992], [1963, 1965], [1918, 1964, 1966], [1965, 1967], [1966, 1968, 1993], [1967, 1969], [1919, 1968, 1970], [1969, 1971], [1970, 1972, 1994], [1971, 1973], [1920, 1972, 1974], [1973, 1975], [1974, 1976, 1995], [1975, 1977], [1921, 1976, 1978], [1977, 1979], [1978, 1980, 1996], [1979, 1981], [1922, 1980], [1923, 1997], [1927, 2001], [1931, 2005], [1935, 2009], [1939, 2013], [1943, 2017], [1947, 2021], [1951, 2025], [1955, 2029], [1959, 2033], [1963, 2037], [1967, 2041], [1971, 2045], [1975, 2049], [1979, 2053], [1982, 1998], [1997, 1999], [1998, 2000, 2056], [1999, 2001], [1983, 2000, 2002], [2001, 2003], [2002, 2004, 2057], [2003, 2005], [1984, 2004, 2006], [2005, 2007], [2006, 2008, 2058], [2007, 2009], [1985, 2008, 2010], [2009, 2011], [2010, 2012, 2059], [2011, 2013], [1986, 2012, 2014], [2013, 2015], [2014, 2016, 2060], [2015, 2017], [1987, 2016, 2018], [2017, 2019], [2018, 2020, 2061], [2019, 2021], [1988, 2020, 2022], [2021, 2023], [2022, 2024, 2062], [2023, 2025], [1989, 2024, 2026], [2025, 2027], [2026, 2028, 2063], [2027, 2029], [1990, 2028, 2030], [2029, 2031], [2030, 2032, 2064], [2031, 2033], [1991, 2032, 2034], [2033, 2035], [2034, 2036, 2065], [2035, 2037], [1992, 2036, 2038], [2037, 2039], [2038, 2040, 2066], [2039, 2041], [1993, 2040, 2042], [2041, 2043], [2042, 2044, 2067], [2043, 2045], [1994, 2044, 2046], [2045, 2047], [2046, 2048, 2068], [2047, 2049], [1995, 2048, 2050], [2049, 2051], [2050, 2052, 2069], [2051, 2053], [1996, 2052, 2054], [2053, 2055], [2054, 2070], [1999, 2072], [2003, 2076], [2007, 2080], [2011, 2084], [2015, 2088], [2019, 2092], [2023, 2096], [2027, 2100], [2031, 2104], [2035, 2108], [2039, 2112], [2043, 2116], [2047, 2120], [2051, 2124], [2055, 2128], [2072], [2056, 2071, 2073], [2072, 2074], [2073, 2075], [2074, 2076], [2057, 2075, 2077], [2076, 2078], [2077, 2079], [2078, 2080], [2058, 2079, 2081], [2080, 2082], [2081, 2083], [2082, 2084], [2059, 2083, 2085], [2084, 2086], [2085, 2087], [2086, 2088], [2060, 2087, 2089], [2088, 2090], [2089, 2091], [2090, 2092], [2061, 2091, 2093], [2092, 2094], [2093, 2095], [2094, 2096], [2062, 2095, 2097], [2096, 2098], [2097, 2099], [2098, 2100], [2063, 2099, 2101], [2100, 2102], [2101, 2103], [2102, 2104], [2064, 2103, 2105], [2104, 2106], [2105, 2107], [2106, 2108], [2065, 2107, 2109], [2108, 2110], [2109, 2111], [2110, 2112], [2066, 2111, 2113], [2112, 2114], [2113, 2115], [2114, 2116], [2067, 2115, 2117], [2116, 2118], [2117, 2119], [2118, 2120], [2068, 2119, 2121], [2120, 2122], [2121, 2123], [2122, 2124], [2069, 2123, 2125], [2124, 2126], [2125, 2127], [2126, 2128], [2070, 2127]] +CNOTERROR: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] +CNOTTIME: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] diff --git a/benchmark/topology/topo_3457.layout b/benchmark/topology/topo_3457.layout index 899a81ffd..02a694601 100644 --- a/benchmark/topology/topo_3457.layout +++ b/benchmark/topology/topo_3457.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1, 74], [0, 2], [1, 3], [2, 4], [3, 5, 75], [4, 6], [5, 7], [6, 8], [7, 9, 76], [8, 10], [9, 11], [10, 12], [11, 13, 77], [12, 14], [13, 15], [14, 16], [15, 17, 78], [16, 18], [17, 19], [18, 20], [19, 21, 79], [20, 22], [21, 23], [22, 24], [23, 25, 80], [24, 26], [25, 27], [26, 28], [27, 29, 81], [28, 30], [29, 31], [30, 32], [31, 33, 82], [32, 34], [33, 35], [34, 36], [35, 37, 83], [36, 38], [37, 39], [38, 40], [39, 41, 84], [40, 42], [41, 43], [42, 44], [43, 45, 85], [44, 46], [45, 47], [46, 48], [47, 49, 86], [48, 50], [49, 51], [50, 52], [51, 53, 87], [52, 54], [53, 55], [54, 56], [55, 57, 88], [56, 58], [57, 59], [58, 60], [59, 61, 89], [60, 62], [61, 63], [62, 64], [63, 65, 90], [64, 66], [65, 67], [66, 68], [67, 69, 91], [68, 70], [69, 71], [70, 72], [71, 73, 92], [72], [0, 93], [4, 97], [8, 101], [12, 105], [16, 109], [20, 113], [24, 117], [28, 121], [32, 125], [36, 129], [40, 133], [44, 137], [48, 141], [52, 145], [56, 149], [60, 153], [64, 157], [68, 161], [72, 165], [74, 94], [93, 95], [94, 96, 168], [95, 97], [75, 96, 98], [97, 99], [98, 100, 169], [99, 101], [76, 100, 102], [101, 103], [102, 104, 170], [103, 105], [77, 104, 106], [105, 107], [106, 108, 171], [107, 109], [78, 108, 110], [109, 111], [110, 112, 172], [111, 113], [79, 112, 114], [113, 115], [114, 116, 173], [115, 117], [80, 116, 118], [117, 119], [118, 120, 174], [119, 121], [81, 120, 122], [121, 123], [122, 124, 175], [123, 125], [82, 124, 126], [125, 127], [126, 128, 176], [127, 129], [83, 128, 130], [129, 131], [130, 132, 177], [131, 133], [84, 132, 134], [133, 135], [134, 136, 178], [135, 137], [85, 136, 138], [137, 139], [138, 140, 179], [139, 141], [86, 140, 142], [141, 143], [142, 144, 180], [143, 145], [87, 144, 146], [145, 147], [146, 148, 181], [147, 149], [88, 148, 150], [149, 151], [150, 152, 182], [151, 153], [89, 152, 154], [153, 155], [154, 156, 183], [155, 157], [90, 156, 158], [157, 159], [158, 160, 184], [159, 161], [91, 160, 162], [161, 163], [162, 164, 185], [163, 165], [92, 164, 166], [165, 167], [166, 186], [95, 189], [99, 193], [103, 197], [107, 201], [111, 205], [115, 209], [119, 213], [123, 217], [127, 221], [131, 225], [135, 229], [139, 233], [143, 237], [147, 241], [151, 245], [155, 249], [159, 253], [163, 257], [167, 261], [188, 262], [187, 189], [168, 188, 190], [189, 191], [190, 192, 263], [191, 193], [169, 192, 194], [193, 195], [194, 196, 264], [195, 197], [170, 196, 198], [197, 199], [198, 200, 265], [199, 201], [171, 200, 202], [201, 203], [202, 204, 266], [203, 205], [172, 204, 206], [205, 207], [206, 208, 267], [207, 209], [173, 208, 210], [209, 211], [210, 212, 268], [211, 213], [174, 212, 214], [213, 215], [214, 216, 269], [215, 217], [175, 216, 218], [217, 219], [218, 220, 270], [219, 221], [176, 220, 222], [221, 223], [222, 224, 271], [223, 225], [177, 224, 226], [225, 227], [226, 228, 272], [227, 229], [178, 228, 230], [229, 231], [230, 232, 273], [231, 233], [179, 232, 234], [233, 235], [234, 236, 274], [235, 237], [180, 236, 238], [237, 239], [238, 240, 275], [239, 241], [181, 240, 242], [241, 243], [242, 244, 276], [243, 245], [182, 244, 246], [245, 247], [246, 248, 277], [247, 249], [183, 248, 250], [249, 251], [250, 252, 278], [251, 253], [184, 252, 254], [253, 255], [254, 256, 279], [255, 257], [185, 256, 258], [257, 259], [258, 260, 280], [259, 261], [186, 260], [187, 281], [191, 285], [195, 289], [199, 293], [203, 297], [207, 301], [211, 305], [215, 309], [219, 313], [223, 317], [227, 321], [231, 325], [235, 329], [239, 333], [243, 337], [247, 341], [251, 345], [255, 349], [259, 353], [262, 282], [281, 283], [282, 284, 356], [283, 285], [263, 284, 286], [285, 287], [286, 288, 357], [287, 289], [264, 288, 290], [289, 291], [290, 292, 358], [291, 293], [265, 292, 294], [293, 295], [294, 296, 359], [295, 297], [266, 296, 298], [297, 299], [298, 300, 360], [299, 301], [267, 300, 302], [301, 303], [302, 304, 361], [303, 305], [268, 304, 306], [305, 307], [306, 308, 362], [307, 309], [269, 308, 310], [309, 311], [310, 312, 363], [311, 313], [270, 312, 314], [313, 315], [314, 316, 364], [315, 317], [271, 316, 318], [317, 319], [318, 320, 365], [319, 321], [272, 320, 322], [321, 323], [322, 324, 366], [323, 325], [273, 324, 326], [325, 327], [326, 328, 367], [327, 329], [274, 328, 330], [329, 331], [330, 332, 368], [331, 333], [275, 332, 334], [333, 335], [334, 336, 369], [335, 337], [276, 336, 338], [337, 339], [338, 340, 370], [339, 341], [277, 340, 342], [341, 343], [342, 344, 371], [343, 345], [278, 344, 346], [345, 347], [346, 348, 372], [347, 349], [279, 348, 350], [349, 351], [350, 352, 373], [351, 353], [280, 352, 354], [353, 355], [354, 374], [283, 377], [287, 381], [291, 385], [295, 389], [299, 393], [303, 397], [307, 401], [311, 405], [315, 409], [319, 413], [323, 417], [327, 421], [331, 425], [335, 429], [339, 433], [343, 437], [347, 441], [351, 445], [355, 449], [376, 450], [375, 377], [356, 376, 378], [377, 379], [378, 380, 451], [379, 381], [357, 380, 382], [381, 383], [382, 384, 452], [383, 385], [358, 384, 386], [385, 387], [386, 388, 453], [387, 389], [359, 388, 390], [389, 391], [390, 392, 454], [391, 393], [360, 392, 394], [393, 395], [394, 396, 455], [395, 397], [361, 396, 398], [397, 399], [398, 400, 456], [399, 401], [362, 400, 402], [401, 403], [402, 404, 457], [403, 405], [363, 404, 406], [405, 407], [406, 408, 458], [407, 409], [364, 408, 410], [409, 411], [410, 412, 459], [411, 413], [365, 412, 414], [413, 415], [414, 416, 460], [415, 417], [366, 416, 418], [417, 419], [418, 420, 461], [419, 421], [367, 420, 422], [421, 423], [422, 424, 462], [423, 425], [368, 424, 426], [425, 427], [426, 428, 463], [427, 429], [369, 428, 430], [429, 431], [430, 432, 464], [431, 433], [370, 432, 434], [433, 435], [434, 436, 465], [435, 437], [371, 436, 438], [437, 439], [438, 440, 466], [439, 441], [372, 440, 442], [441, 443], [442, 444, 467], [443, 445], [373, 444, 446], [445, 447], [446, 448, 468], [447, 449], [374, 448], [375, 469], [379, 473], [383, 477], [387, 481], [391, 485], [395, 489], [399, 493], [403, 497], [407, 501], [411, 505], [415, 509], [419, 513], [423, 517], [427, 521], [431, 525], [435, 529], [439, 533], [443, 537], [447, 541], [450, 470], [469, 471], [470, 472, 544], [471, 473], [451, 472, 474], [473, 475], [474, 476, 545], [475, 477], [452, 476, 478], [477, 479], [478, 480, 546], [479, 481], [453, 480, 482], [481, 483], [482, 484, 547], [483, 485], [454, 484, 486], [485, 487], [486, 488, 548], [487, 489], [455, 488, 490], [489, 491], [490, 492, 549], [491, 493], [456, 492, 494], [493, 495], [494, 496, 550], [495, 497], [457, 496, 498], [497, 499], [498, 500, 551], [499, 501], [458, 500, 502], [501, 503], [502, 504, 552], [503, 505], [459, 504, 506], [505, 507], [506, 508, 553], [507, 509], [460, 508, 510], [509, 511], [510, 512, 554], [511, 513], [461, 512, 514], [513, 515], [514, 516, 555], [515, 517], [462, 516, 518], [517, 519], [518, 520, 556], [519, 521], [463, 520, 522], [521, 523], [522, 524, 557], [523, 525], [464, 524, 526], [525, 527], [526, 528, 558], [527, 529], [465, 528, 530], [529, 531], [530, 532, 559], [531, 533], [466, 532, 534], [533, 535], [534, 536, 560], [535, 537], [467, 536, 538], [537, 539], [538, 540, 561], [539, 541], [468, 540, 542], [541, 543], [542, 562], [471, 565], [475, 569], [479, 573], [483, 577], [487, 581], [491, 585], [495, 589], [499, 593], [503, 597], [507, 601], [511, 605], [515, 609], [519, 613], [523, 617], [527, 621], [531, 625], [535, 629], [539, 633], [543, 637], [564, 638], [563, 565], [544, 564, 566], [565, 567], [566, 568, 639], [567, 569], [545, 568, 570], [569, 571], [570, 572, 640], [571, 573], [546, 572, 574], [573, 575], [574, 576, 641], [575, 577], [547, 576, 578], [577, 579], [578, 580, 642], [579, 581], [548, 580, 582], [581, 583], [582, 584, 643], [583, 585], [549, 584, 586], [585, 587], [586, 588, 644], [587, 589], [550, 588, 590], [589, 591], [590, 592, 645], [591, 593], [551, 592, 594], [593, 595], [594, 596, 646], [595, 597], [552, 596, 598], [597, 599], [598, 600, 647], [599, 601], [553, 600, 602], [601, 603], [602, 604, 648], [603, 605], [554, 604, 606], [605, 607], [606, 608, 649], [607, 609], [555, 608, 610], [609, 611], [610, 612, 650], [611, 613], [556, 612, 614], [613, 615], [614, 616, 651], [615, 617], [557, 616, 618], [617, 619], [618, 620, 652], [619, 621], [558, 620, 622], [621, 623], [622, 624, 653], [623, 625], [559, 624, 626], [625, 627], [626, 628, 654], [627, 629], [560, 628, 630], [629, 631], [630, 632, 655], [631, 633], [561, 632, 634], [633, 635], [634, 636, 656], [635, 637], [562, 636], [563, 657], [567, 661], [571, 665], [575, 669], [579, 673], [583, 677], [587, 681], [591, 685], [595, 689], [599, 693], [603, 697], [607, 701], [611, 705], [615, 709], [619, 713], [623, 717], [627, 721], [631, 725], [635, 729], [638, 658], [657, 659], [658, 660, 732], [659, 661], [639, 660, 662], [661, 663], [662, 664, 733], [663, 665], [640, 664, 666], [665, 667], [666, 668, 734], [667, 669], [641, 668, 670], [669, 671], [670, 672, 735], [671, 673], [642, 672, 674], [673, 675], [674, 676, 736], [675, 677], [643, 676, 678], [677, 679], [678, 680, 737], [679, 681], [644, 680, 682], [681, 683], [682, 684, 738], [683, 685], [645, 684, 686], [685, 687], [686, 688, 739], [687, 689], [646, 688, 690], [689, 691], [690, 692, 740], [691, 693], [647, 692, 694], [693, 695], [694, 696, 741], [695, 697], [648, 696, 698], [697, 699], [698, 700, 742], [699, 701], [649, 700, 702], [701, 703], [702, 704, 743], [703, 705], [650, 704, 706], [705, 707], [706, 708, 744], [707, 709], [651, 708, 710], [709, 711], [710, 712, 745], [711, 713], [652, 712, 714], [713, 715], [714, 716, 746], [715, 717], [653, 716, 718], [717, 719], [718, 720, 747], [719, 721], [654, 720, 722], [721, 723], [722, 724, 748], [723, 725], [655, 724, 726], [725, 727], [726, 728, 749], [727, 729], [656, 728, 730], [729, 731], [730, 750], [659, 753], [663, 757], [667, 761], [671, 765], [675, 769], [679, 773], [683, 777], [687, 781], [691, 785], [695, 789], [699, 793], [703, 797], [707, 801], [711, 805], [715, 809], [719, 813], [723, 817], [727, 821], [731, 825], [752, 826], [751, 753], [732, 752, 754], [753, 755], [754, 756, 827], [755, 757], [733, 756, 758], [757, 759], [758, 760, 828], [759, 761], [734, 760, 762], [761, 763], [762, 764, 829], [763, 765], [735, 764, 766], [765, 767], [766, 768, 830], [767, 769], [736, 768, 770], [769, 771], [770, 772, 831], [771, 773], [737, 772, 774], [773, 775], [774, 776, 832], [775, 777], [738, 776, 778], [777, 779], [778, 780, 833], [779, 781], [739, 780, 782], [781, 783], [782, 784, 834], [783, 785], [740, 784, 786], [785, 787], [786, 788, 835], [787, 789], [741, 788, 790], [789, 791], [790, 792, 836], [791, 793], [742, 792, 794], [793, 795], [794, 796, 837], [795, 797], [743, 796, 798], [797, 799], [798, 800, 838], [799, 801], [744, 800, 802], [801, 803], [802, 804, 839], [803, 805], [745, 804, 806], [805, 807], [806, 808, 840], [807, 809], [746, 808, 810], [809, 811], [810, 812, 841], [811, 813], [747, 812, 814], [813, 815], [814, 816, 842], [815, 817], [748, 816, 818], [817, 819], [818, 820, 843], [819, 821], [749, 820, 822], [821, 823], [822, 824, 844], [823, 825], [750, 824], [751, 845], [755, 849], [759, 853], [763, 857], [767, 861], [771, 865], [775, 869], [779, 873], [783, 877], [787, 881], [791, 885], [795, 889], [799, 893], [803, 897], [807, 901], [811, 905], [815, 909], [819, 913], [823, 917], [826, 846], [845, 847], [846, 848, 920], [847, 849], [827, 848, 850], [849, 851], [850, 852, 921], [851, 853], [828, 852, 854], [853, 855], [854, 856, 922], [855, 857], [829, 856, 858], [857, 859], [858, 860, 923], [859, 861], [830, 860, 862], [861, 863], [862, 864, 924], [863, 865], [831, 864, 866], [865, 867], [866, 868, 925], [867, 869], [832, 868, 870], [869, 871], [870, 872, 926], [871, 873], [833, 872, 874], [873, 875], [874, 876, 927], [875, 877], [834, 876, 878], [877, 879], [878, 880, 928], [879, 881], [835, 880, 882], [881, 883], [882, 884, 929], [883, 885], [836, 884, 886], [885, 887], [886, 888, 930], [887, 889], [837, 888, 890], [889, 891], [890, 892, 931], [891, 893], [838, 892, 894], [893, 895], [894, 896, 932], [895, 897], [839, 896, 898], [897, 899], [898, 900, 933], [899, 901], [840, 900, 902], [901, 903], [902, 904, 934], [903, 905], [841, 904, 906], [905, 907], [906, 908, 935], [907, 909], [842, 908, 910], [909, 911], [910, 912, 936], [911, 913], [843, 912, 914], [913, 915], [914, 916, 937], [915, 917], [844, 916, 918], [917, 919], [918, 938], [847, 941], [851, 945], [855, 949], [859, 953], [863, 957], [867, 961], [871, 965], [875, 969], [879, 973], [883, 977], [887, 981], [891, 985], [895, 989], [899, 993], [903, 997], [907, 1001], [911, 1005], [915, 1009], [919, 1013], [940, 1014], [939, 941], [920, 940, 942], [941, 943], [942, 944, 1015], [943, 945], [921, 944, 946], [945, 947], [946, 948, 1016], [947, 949], [922, 948, 950], [949, 951], [950, 952, 1017], [951, 953], [923, 952, 954], [953, 955], [954, 956, 1018], [955, 957], [924, 956, 958], [957, 959], [958, 960, 1019], [959, 961], [925, 960, 962], [961, 963], [962, 964, 1020], [963, 965], [926, 964, 966], [965, 967], [966, 968, 1021], [967, 969], [927, 968, 970], [969, 971], [970, 972, 1022], [971, 973], [928, 972, 974], [973, 975], [974, 976, 1023], [975, 977], [929, 976, 978], [977, 979], [978, 980, 1024], [979, 981], [930, 980, 982], [981, 983], [982, 984, 1025], [983, 985], [931, 984, 986], [985, 987], [986, 988, 1026], [987, 989], [932, 988, 990], [989, 991], [990, 992, 1027], [991, 993], [933, 992, 994], [993, 995], [994, 996, 1028], [995, 997], [934, 996, 998], [997, 999], [998, 1000, 1029], [999, 1001], [935, 1000, 1002], [1001, 1003], [1002, 1004, 1030], [1003, 1005], [936, 1004, 1006], [1005, 1007], [1006, 1008, 1031], [1007, 1009], [937, 1008, 1010], [1009, 1011], [1010, 1012, 1032], [1011, 1013], [938, 1012], [939, 1033], [943, 1037], [947, 1041], [951, 1045], [955, 1049], [959, 1053], [963, 1057], [967, 1061], [971, 1065], [975, 1069], [979, 1073], [983, 1077], [987, 1081], [991, 1085], [995, 1089], [999, 1093], [1003, 1097], [1007, 1101], [1011, 1105], [1014, 1034], [1033, 1035], [1034, 1036, 1108], [1035, 1037], [1015, 1036, 1038], [1037, 1039], [1038, 1040, 1109], [1039, 1041], [1016, 1040, 1042], [1041, 1043], [1042, 1044, 1110], [1043, 1045], [1017, 1044, 1046], [1045, 1047], [1046, 1048, 1111], [1047, 1049], [1018, 1048, 1050], [1049, 1051], [1050, 1052, 1112], [1051, 1053], [1019, 1052, 1054], [1053, 1055], [1054, 1056, 1113], [1055, 1057], [1020, 1056, 1058], [1057, 1059], [1058, 1060, 1114], [1059, 1061], [1021, 1060, 1062], [1061, 1063], [1062, 1064, 1115], [1063, 1065], [1022, 1064, 1066], [1065, 1067], [1066, 1068, 1116], [1067, 1069], [1023, 1068, 1070], [1069, 1071], [1070, 1072, 1117], [1071, 1073], [1024, 1072, 1074], [1073, 1075], [1074, 1076, 1118], [1075, 1077], [1025, 1076, 1078], [1077, 1079], [1078, 1080, 1119], [1079, 1081], [1026, 1080, 1082], [1081, 1083], [1082, 1084, 1120], [1083, 1085], [1027, 1084, 1086], [1085, 1087], [1086, 1088, 1121], [1087, 1089], [1028, 1088, 1090], [1089, 1091], [1090, 1092, 1122], [1091, 1093], [1029, 1092, 1094], [1093, 1095], [1094, 1096, 1123], [1095, 1097], [1030, 1096, 1098], [1097, 1099], [1098, 1100, 1124], [1099, 1101], [1031, 1100, 1102], [1101, 1103], [1102, 1104, 1125], [1103, 1105], [1032, 1104, 1106], [1105, 1107], [1106, 1126], [1035, 1129], [1039, 1133], [1043, 1137], [1047, 1141], [1051, 1145], [1055, 1149], [1059, 1153], [1063, 1157], [1067, 1161], [1071, 1165], [1075, 1169], [1079, 1173], [1083, 1177], [1087, 1181], [1091, 1185], [1095, 1189], [1099, 1193], [1103, 1197], [1107, 1201], [1128, 1202], [1127, 1129], [1108, 1128, 1130], [1129, 1131], [1130, 1132, 1203], [1131, 1133], [1109, 1132, 1134], [1133, 1135], [1134, 1136, 1204], [1135, 1137], [1110, 1136, 1138], [1137, 1139], [1138, 1140, 1205], [1139, 1141], [1111, 1140, 1142], [1141, 1143], [1142, 1144, 1206], [1143, 1145], [1112, 1144, 1146], [1145, 1147], [1146, 1148, 1207], [1147, 1149], [1113, 1148, 1150], [1149, 1151], [1150, 1152, 1208], [1151, 1153], [1114, 1152, 1154], [1153, 1155], [1154, 1156, 1209], [1155, 1157], [1115, 1156, 1158], [1157, 1159], [1158, 1160, 1210], [1159, 1161], [1116, 1160, 1162], [1161, 1163], [1162, 1164, 1211], [1163, 1165], [1117, 1164, 1166], [1165, 1167], [1166, 1168, 1212], [1167, 1169], [1118, 1168, 1170], [1169, 1171], [1170, 1172, 1213], [1171, 1173], [1119, 1172, 1174], [1173, 1175], [1174, 1176, 1214], [1175, 1177], [1120, 1176, 1178], [1177, 1179], [1178, 1180, 1215], [1179, 1181], [1121, 1180, 1182], [1181, 1183], [1182, 1184, 1216], [1183, 1185], [1122, 1184, 1186], [1185, 1187], [1186, 1188, 1217], [1187, 1189], [1123, 1188, 1190], [1189, 1191], [1190, 1192, 1218], [1191, 1193], [1124, 1192, 1194], [1193, 1195], [1194, 1196, 1219], [1195, 1197], [1125, 1196, 1198], [1197, 1199], [1198, 1200, 1220], [1199, 1201], [1126, 1200], [1127, 1221], [1131, 1225], [1135, 1229], [1139, 1233], [1143, 1237], [1147, 1241], [1151, 1245], [1155, 1249], [1159, 1253], [1163, 1257], [1167, 1261], [1171, 1265], [1175, 1269], [1179, 1273], [1183, 1277], [1187, 1281], [1191, 1285], [1195, 1289], [1199, 1293], [1202, 1222], [1221, 1223], [1222, 1224, 1296], [1223, 1225], [1203, 1224, 1226], [1225, 1227], [1226, 1228, 1297], [1227, 1229], [1204, 1228, 1230], [1229, 1231], [1230, 1232, 1298], [1231, 1233], [1205, 1232, 1234], [1233, 1235], [1234, 1236, 1299], [1235, 1237], [1206, 1236, 1238], [1237, 1239], [1238, 1240, 1300], [1239, 1241], [1207, 1240, 1242], [1241, 1243], [1242, 1244, 1301], [1243, 1245], [1208, 1244, 1246], [1245, 1247], [1246, 1248, 1302], [1247, 1249], [1209, 1248, 1250], [1249, 1251], [1250, 1252, 1303], [1251, 1253], [1210, 1252, 1254], [1253, 1255], [1254, 1256, 1304], [1255, 1257], [1211, 1256, 1258], [1257, 1259], [1258, 1260, 1305], [1259, 1261], [1212, 1260, 1262], [1261, 1263], [1262, 1264, 1306], [1263, 1265], [1213, 1264, 1266], [1265, 1267], [1266, 1268, 1307], [1267, 1269], [1214, 1268, 1270], [1269, 1271], [1270, 1272, 1308], [1271, 1273], [1215, 1272, 1274], [1273, 1275], [1274, 1276, 1309], [1275, 1277], [1216, 1276, 1278], [1277, 1279], [1278, 1280, 1310], [1279, 1281], [1217, 1280, 1282], [1281, 1283], [1282, 1284, 1311], [1283, 1285], [1218, 1284, 1286], [1285, 1287], [1286, 1288, 1312], [1287, 1289], [1219, 1288, 1290], [1289, 1291], [1290, 1292, 1313], [1291, 1293], [1220, 1292, 1294], [1293, 1295], [1294, 1314], [1223, 1317], [1227, 1321], [1231, 1325], [1235, 1329], [1239, 1333], [1243, 1337], [1247, 1341], [1251, 1345], [1255, 1349], [1259, 1353], [1263, 1357], [1267, 1361], [1271, 1365], [1275, 1369], [1279, 1373], [1283, 1377], [1287, 1381], [1291, 1385], [1295, 1389], [1316, 1390], [1315, 1317], [1296, 1316, 1318], [1317, 1319], [1318, 1320, 1391], [1319, 1321], [1297, 1320, 1322], [1321, 1323], [1322, 1324, 1392], [1323, 1325], [1298, 1324, 1326], [1325, 1327], [1326, 1328, 1393], [1327, 1329], [1299, 1328, 1330], [1329, 1331], [1330, 1332, 1394], [1331, 1333], [1300, 1332, 1334], [1333, 1335], [1334, 1336, 1395], [1335, 1337], [1301, 1336, 1338], [1337, 1339], [1338, 1340, 1396], [1339, 1341], [1302, 1340, 1342], [1341, 1343], [1342, 1344, 1397], [1343, 1345], [1303, 1344, 1346], [1345, 1347], [1346, 1348, 1398], [1347, 1349], [1304, 1348, 1350], [1349, 1351], [1350, 1352, 1399], [1351, 1353], [1305, 1352, 1354], [1353, 1355], [1354, 1356, 1400], [1355, 1357], [1306, 1356, 1358], [1357, 1359], [1358, 1360, 1401], [1359, 1361], [1307, 1360, 1362], [1361, 1363], [1362, 1364, 1402], [1363, 1365], [1308, 1364, 1366], [1365, 1367], [1366, 1368, 1403], [1367, 1369], [1309, 1368, 1370], [1369, 1371], [1370, 1372, 1404], [1371, 1373], [1310, 1372, 1374], [1373, 1375], [1374, 1376, 1405], [1375, 1377], [1311, 1376, 1378], [1377, 1379], [1378, 1380, 1406], [1379, 1381], [1312, 1380, 1382], [1381, 1383], [1382, 1384, 1407], [1383, 1385], [1313, 1384, 1386], [1385, 1387], [1386, 1388, 1408], [1387, 1389], [1314, 1388], [1315, 1409], [1319, 1413], [1323, 1417], [1327, 1421], [1331, 1425], [1335, 1429], [1339, 1433], [1343, 1437], [1347, 1441], [1351, 1445], [1355, 1449], [1359, 1453], [1363, 1457], [1367, 1461], [1371, 1465], [1375, 1469], [1379, 1473], [1383, 1477], [1387, 1481], [1390, 1410], [1409, 1411], [1410, 1412, 1484], [1411, 1413], [1391, 1412, 1414], [1413, 1415], [1414, 1416, 1485], [1415, 1417], [1392, 1416, 1418], [1417, 1419], [1418, 1420, 1486], [1419, 1421], [1393, 1420, 1422], [1421, 1423], [1422, 1424, 1487], [1423, 1425], [1394, 1424, 1426], [1425, 1427], [1426, 1428, 1488], [1427, 1429], [1395, 1428, 1430], [1429, 1431], [1430, 1432, 1489], [1431, 1433], [1396, 1432, 1434], [1433, 1435], [1434, 1436, 1490], [1435, 1437], [1397, 1436, 1438], [1437, 1439], [1438, 1440, 1491], [1439, 1441], [1398, 1440, 1442], [1441, 1443], [1442, 1444, 1492], [1443, 1445], [1399, 1444, 1446], [1445, 1447], [1446, 1448, 1493], [1447, 1449], [1400, 1448, 1450], [1449, 1451], [1450, 1452, 1494], [1451, 1453], [1401, 1452, 1454], [1453, 1455], [1454, 1456, 1495], [1455, 1457], [1402, 1456, 1458], [1457, 1459], [1458, 1460, 1496], [1459, 1461], [1403, 1460, 1462], [1461, 1463], [1462, 1464, 1497], [1463, 1465], [1404, 1464, 1466], [1465, 1467], [1466, 1468, 1498], [1467, 1469], [1405, 1468, 1470], [1469, 1471], [1470, 1472, 1499], [1471, 1473], [1406, 1472, 1474], [1473, 1475], [1474, 1476, 1500], [1475, 1477], [1407, 1476, 1478], [1477, 1479], [1478, 1480, 1501], [1479, 1481], [1408, 1480, 1482], [1481, 1483], [1482, 1502], [1411, 1505], [1415, 1509], [1419, 1513], [1423, 1517], [1427, 1521], [1431, 1525], [1435, 1529], [1439, 1533], [1443, 1537], [1447, 1541], [1451, 1545], [1455, 1549], [1459, 1553], [1463, 1557], [1467, 1561], [1471, 1565], [1475, 1569], [1479, 1573], [1483, 1577], [1504, 1578], [1503, 1505], [1484, 1504, 1506], [1505, 1507], [1506, 1508, 1579], [1507, 1509], [1485, 1508, 1510], [1509, 1511], [1510, 1512, 1580], [1511, 1513], [1486, 1512, 1514], [1513, 1515], [1514, 1516, 1581], [1515, 1517], [1487, 1516, 1518], [1517, 1519], [1518, 1520, 1582], [1519, 1521], [1488, 1520, 1522], [1521, 1523], [1522, 1524, 1583], [1523, 1525], [1489, 1524, 1526], [1525, 1527], [1526, 1528, 1584], [1527, 1529], [1490, 1528, 1530], [1529, 1531], [1530, 1532, 1585], [1531, 1533], [1491, 1532, 1534], [1533, 1535], [1534, 1536, 1586], [1535, 1537], [1492, 1536, 1538], [1537, 1539], [1538, 1540, 1587], [1539, 1541], [1493, 1540, 1542], [1541, 1543], [1542, 1544, 1588], [1543, 1545], [1494, 1544, 1546], [1545, 1547], [1546, 1548, 1589], [1547, 1549], [1495, 1548, 1550], [1549, 1551], [1550, 1552, 1590], [1551, 1553], [1496, 1552, 1554], [1553, 1555], [1554, 1556, 1591], [1555, 1557], [1497, 1556, 1558], [1557, 1559], [1558, 1560, 1592], [1559, 1561], [1498, 1560, 1562], [1561, 1563], [1562, 1564, 1593], [1563, 1565], [1499, 1564, 1566], [1565, 1567], [1566, 1568, 1594], [1567, 1569], [1500, 1568, 1570], [1569, 1571], [1570, 1572, 1595], [1571, 1573], [1501, 1572, 1574], [1573, 1575], [1574, 1576, 1596], [1575, 1577], [1502, 1576], [1503, 1597], [1507, 1601], [1511, 1605], [1515, 1609], [1519, 1613], [1523, 1617], [1527, 1621], [1531, 1625], [1535, 1629], [1539, 1633], [1543, 1637], [1547, 1641], [1551, 1645], [1555, 1649], [1559, 1653], [1563, 1657], [1567, 1661], [1571, 1665], [1575, 1669], [1578, 1598], [1597, 1599], [1598, 1600, 1672], [1599, 1601], [1579, 1600, 1602], [1601, 1603], [1602, 1604, 1673], [1603, 1605], [1580, 1604, 1606], [1605, 1607], [1606, 1608, 1674], [1607, 1609], [1581, 1608, 1610], [1609, 1611], [1610, 1612, 1675], [1611, 1613], [1582, 1612, 1614], [1613, 1615], [1614, 1616, 1676], [1615, 1617], [1583, 1616, 1618], [1617, 1619], [1618, 1620, 1677], [1619, 1621], [1584, 1620, 1622], [1621, 1623], [1622, 1624, 1678], [1623, 1625], [1585, 1624, 1626], [1625, 1627], [1626, 1628, 1679], [1627, 1629], [1586, 1628, 1630], [1629, 1631], [1630, 1632, 1680], [1631, 1633], [1587, 1632, 1634], [1633, 1635], [1634, 1636, 1681], [1635, 1637], [1588, 1636, 1638], [1637, 1639], [1638, 1640, 1682], [1639, 1641], [1589, 1640, 1642], [1641, 1643], [1642, 1644, 1683], [1643, 1645], [1590, 1644, 1646], [1645, 1647], [1646, 1648, 1684], [1647, 1649], [1591, 1648, 1650], [1649, 1651], [1650, 1652, 1685], [1651, 1653], [1592, 1652, 1654], [1653, 1655], [1654, 1656, 1686], [1655, 1657], [1593, 1656, 1658], [1657, 1659], [1658, 1660, 1687], [1659, 1661], [1594, 1660, 1662], [1661, 1663], [1662, 1664, 1688], [1663, 1665], [1595, 1664, 1666], [1665, 1667], [1666, 1668, 1689], [1667, 1669], [1596, 1668, 1670], [1669, 1671], [1670, 1690], [1599, 1693], [1603, 1697], [1607, 1701], [1611, 1705], [1615, 1709], [1619, 1713], [1623, 1717], [1627, 1721], [1631, 1725], [1635, 1729], [1639, 1733], [1643, 1737], [1647, 1741], [1651, 1745], [1655, 1749], [1659, 1753], [1663, 1757], [1667, 1761], [1671, 1765], [1692, 1766], [1691, 1693], [1672, 1692, 1694], [1693, 1695], [1694, 1696, 1767], [1695, 1697], [1673, 1696, 1698], [1697, 1699], [1698, 1700, 1768], [1699, 1701], [1674, 1700, 1702], [1701, 1703], [1702, 1704, 1769], [1703, 1705], [1675, 1704, 1706], [1705, 1707], [1706, 1708, 1770], [1707, 1709], [1676, 1708, 1710], [1709, 1711], [1710, 1712, 1771], [1711, 1713], [1677, 1712, 1714], [1713, 1715], [1714, 1716, 1772], [1715, 1717], [1678, 1716, 1718], [1717, 1719], [1718, 1720, 1773], [1719, 1721], [1679, 1720, 1722], [1721, 1723], [1722, 1724, 1774], [1723, 1725], [1680, 1724, 1726], [1725, 1727], [1726, 1728, 1775], [1727, 1729], [1681, 1728, 1730], [1729, 1731], [1730, 1732, 1776], [1731, 1733], [1682, 1732, 1734], [1733, 1735], [1734, 1736, 1777], [1735, 1737], [1683, 1736, 1738], [1737, 1739], [1738, 1740, 1778], [1739, 1741], [1684, 1740, 1742], [1741, 1743], [1742, 1744, 1779], [1743, 1745], [1685, 1744, 1746], [1745, 1747], [1746, 1748, 1780], [1747, 1749], [1686, 1748, 1750], [1749, 1751], [1750, 1752, 1781], [1751, 1753], [1687, 1752, 1754], [1753, 1755], [1754, 1756, 1782], [1755, 1757], [1688, 1756, 1758], [1757, 1759], [1758, 1760, 1783], [1759, 1761], [1689, 1760, 1762], [1761, 1763], [1762, 1764, 1784], [1763, 1765], [1690, 1764], [1691, 1785], [1695, 1789], [1699, 1793], [1703, 1797], [1707, 1801], [1711, 1805], [1715, 1809], [1719, 1813], [1723, 1817], [1727, 1821], [1731, 1825], [1735, 1829], [1739, 1833], [1743, 1837], [1747, 1841], [1751, 1845], [1755, 1849], [1759, 1853], [1763, 1857], [1766, 1786], [1785, 1787], [1786, 1788, 1860], [1787, 1789], [1767, 1788, 1790], [1789, 1791], [1790, 1792, 1861], [1791, 1793], [1768, 1792, 1794], [1793, 1795], [1794, 1796, 1862], [1795, 1797], [1769, 1796, 1798], [1797, 1799], [1798, 1800, 1863], [1799, 1801], [1770, 1800, 1802], [1801, 1803], [1802, 1804, 1864], [1803, 1805], [1771, 1804, 1806], [1805, 1807], [1806, 1808, 1865], [1807, 1809], [1772, 1808, 1810], [1809, 1811], [1810, 1812, 1866], [1811, 1813], [1773, 1812, 1814], [1813, 1815], [1814, 1816, 1867], [1815, 1817], [1774, 1816, 1818], [1817, 1819], [1818, 1820, 1868], [1819, 1821], [1775, 1820, 1822], [1821, 1823], [1822, 1824, 1869], [1823, 1825], [1776, 1824, 1826], [1825, 1827], [1826, 1828, 1870], [1827, 1829], [1777, 1828, 1830], [1829, 1831], [1830, 1832, 1871], [1831, 1833], [1778, 1832, 1834], [1833, 1835], [1834, 1836, 1872], [1835, 1837], [1779, 1836, 1838], [1837, 1839], [1838, 1840, 1873], [1839, 1841], [1780, 1840, 1842], [1841, 1843], [1842, 1844, 1874], [1843, 1845], [1781, 1844, 1846], [1845, 1847], [1846, 1848, 1875], [1847, 1849], [1782, 1848, 1850], [1849, 1851], [1850, 1852, 1876], [1851, 1853], [1783, 1852, 1854], [1853, 1855], [1854, 1856, 1877], [1855, 1857], [1784, 1856, 1858], [1857, 1859], [1858, 1878], [1787, 1881], [1791, 1885], [1795, 1889], [1799, 1893], [1803, 1897], [1807, 1901], [1811, 1905], [1815, 1909], [1819, 1913], [1823, 1917], [1827, 1921], [1831, 1925], [1835, 1929], [1839, 1933], [1843, 1937], [1847, 1941], [1851, 1945], [1855, 1949], [1859, 1953], [1880, 1954], [1879, 1881], [1860, 1880, 1882], [1881, 1883], [1882, 1884, 1955], [1883, 1885], [1861, 1884, 1886], [1885, 1887], [1886, 1888, 1956], [1887, 1889], [1862, 1888, 1890], [1889, 1891], [1890, 1892, 1957], [1891, 1893], [1863, 1892, 1894], [1893, 1895], [1894, 1896, 1958], [1895, 1897], [1864, 1896, 1898], [1897, 1899], [1898, 1900, 1959], [1899, 1901], [1865, 1900, 1902], [1901, 1903], [1902, 1904, 1960], [1903, 1905], [1866, 1904, 1906], [1905, 1907], [1906, 1908, 1961], [1907, 1909], [1867, 1908, 1910], [1909, 1911], [1910, 1912, 1962], [1911, 1913], [1868, 1912, 1914], [1913, 1915], [1914, 1916, 1963], [1915, 1917], [1869, 1916, 1918], [1917, 1919], [1918, 1920, 1964], [1919, 1921], [1870, 1920, 1922], [1921, 1923], [1922, 1924, 1965], [1923, 1925], [1871, 1924, 1926], [1925, 1927], [1926, 1928, 1966], [1927, 1929], [1872, 1928, 1930], [1929, 1931], [1930, 1932, 1967], [1931, 1933], [1873, 1932, 1934], [1933, 1935], [1934, 1936, 1968], [1935, 1937], [1874, 1936, 1938], [1937, 1939], [1938, 1940, 1969], [1939, 1941], [1875, 1940, 1942], [1941, 1943], [1942, 1944, 1970], [1943, 1945], [1876, 1944, 1946], [1945, 1947], [1946, 1948, 1971], [1947, 1949], [1877, 1948, 1950], [1949, 1951], [1950, 1952, 1972], [1951, 1953], [1878, 1952], [1879, 1973], [1883, 1977], [1887, 1981], [1891, 1985], [1895, 1989], [1899, 1993], [1903, 1997], [1907, 2001], [1911, 2005], [1915, 2009], [1919, 2013], [1923, 2017], [1927, 2021], [1931, 2025], [1935, 2029], [1939, 2033], [1943, 2037], [1947, 2041], [1951, 2045], [1954, 1974], [1973, 1975], [1974, 1976, 2048], [1975, 1977], [1955, 1976, 1978], [1977, 1979], [1978, 1980, 2049], [1979, 1981], [1956, 1980, 1982], [1981, 1983], [1982, 1984, 2050], [1983, 1985], [1957, 1984, 1986], [1985, 1987], [1986, 1988, 2051], [1987, 1989], [1958, 1988, 1990], [1989, 1991], [1990, 1992, 2052], [1991, 1993], [1959, 1992, 1994], [1993, 1995], [1994, 1996, 2053], [1995, 1997], [1960, 1996, 1998], [1997, 1999], [1998, 2000, 2054], [1999, 2001], [1961, 2000, 2002], [2001, 2003], [2002, 2004, 2055], [2003, 2005], [1962, 2004, 2006], [2005, 2007], [2006, 2008, 2056], [2007, 2009], [1963, 2008, 2010], [2009, 2011], [2010, 2012, 2057], [2011, 2013], [1964, 2012, 2014], [2013, 2015], [2014, 2016, 2058], [2015, 2017], [1965, 2016, 2018], [2017, 2019], [2018, 2020, 2059], [2019, 2021], [1966, 2020, 2022], [2021, 2023], [2022, 2024, 2060], [2023, 2025], [1967, 2024, 2026], [2025, 2027], [2026, 2028, 2061], [2027, 2029], [1968, 2028, 2030], [2029, 2031], [2030, 2032, 2062], [2031, 2033], [1969, 2032, 2034], [2033, 2035], [2034, 2036, 2063], [2035, 2037], [1970, 2036, 2038], [2037, 2039], [2038, 2040, 2064], [2039, 2041], [1971, 2040, 2042], [2041, 2043], [2042, 2044, 2065], [2043, 2045], [1972, 2044, 2046], [2045, 2047], [2046, 2066], [1975, 2069], [1979, 2073], [1983, 2077], [1987, 2081], [1991, 2085], [1995, 2089], [1999, 2093], [2003, 2097], [2007, 2101], [2011, 2105], [2015, 2109], [2019, 2113], [2023, 2117], [2027, 2121], [2031, 2125], [2035, 2129], [2039, 2133], [2043, 2137], [2047, 2141], [2068, 2142], [2067, 2069], [2048, 2068, 2070], [2069, 2071], [2070, 2072, 2143], [2071, 2073], [2049, 2072, 2074], [2073, 2075], [2074, 2076, 2144], [2075, 2077], [2050, 2076, 2078], [2077, 2079], [2078, 2080, 2145], [2079, 2081], [2051, 2080, 2082], [2081, 2083], [2082, 2084, 2146], [2083, 2085], [2052, 2084, 2086], [2085, 2087], [2086, 2088, 2147], [2087, 2089], [2053, 2088, 2090], [2089, 2091], [2090, 2092, 2148], [2091, 2093], [2054, 2092, 2094], [2093, 2095], [2094, 2096, 2149], [2095, 2097], [2055, 2096, 2098], [2097, 2099], [2098, 2100, 2150], [2099, 2101], [2056, 2100, 2102], [2101, 2103], [2102, 2104, 2151], [2103, 2105], [2057, 2104, 2106], [2105, 2107], [2106, 2108, 2152], [2107, 2109], [2058, 2108, 2110], [2109, 2111], [2110, 2112, 2153], [2111, 2113], [2059, 2112, 2114], [2113, 2115], [2114, 2116, 2154], [2115, 2117], [2060, 2116, 2118], [2117, 2119], [2118, 2120, 2155], [2119, 2121], [2061, 2120, 2122], [2121, 2123], [2122, 2124, 2156], [2123, 2125], [2062, 2124, 2126], [2125, 2127], [2126, 2128, 2157], [2127, 2129], [2063, 2128, 2130], [2129, 2131], [2130, 2132, 2158], [2131, 2133], [2064, 2132, 2134], [2133, 2135], [2134, 2136, 2159], [2135, 2137], [2065, 2136, 2138], [2137, 2139], [2138, 2140, 2160], [2139, 2141], [2066, 2140], [2067, 2161], [2071, 2165], [2075, 2169], [2079, 2173], [2083, 2177], [2087, 2181], [2091, 2185], [2095, 2189], [2099, 2193], [2103, 2197], [2107, 2201], [2111, 2205], [2115, 2209], [2119, 2213], [2123, 2217], [2127, 2221], [2131, 2225], [2135, 2229], [2139, 2233], [2142, 2162], [2161, 2163], [2162, 2164, 2236], [2163, 2165], [2143, 2164, 2166], [2165, 2167], [2166, 2168, 2237], [2167, 2169], [2144, 2168, 2170], [2169, 2171], [2170, 2172, 2238], [2171, 2173], [2145, 2172, 2174], [2173, 2175], [2174, 2176, 2239], [2175, 2177], [2146, 2176, 2178], [2177, 2179], [2178, 2180, 2240], [2179, 2181], [2147, 2180, 2182], [2181, 2183], [2182, 2184, 2241], [2183, 2185], [2148, 2184, 2186], [2185, 2187], [2186, 2188, 2242], [2187, 2189], [2149, 2188, 2190], [2189, 2191], [2190, 2192, 2243], [2191, 2193], [2150, 2192, 2194], [2193, 2195], [2194, 2196, 2244], [2195, 2197], [2151, 2196, 2198], [2197, 2199], [2198, 2200, 2245], [2199, 2201], [2152, 2200, 2202], [2201, 2203], [2202, 2204, 2246], [2203, 2205], [2153, 2204, 2206], [2205, 2207], [2206, 2208, 2247], [2207, 2209], [2154, 2208, 2210], [2209, 2211], [2210, 2212, 2248], [2211, 2213], [2155, 2212, 2214], [2213, 2215], [2214, 2216, 2249], [2215, 2217], [2156, 2216, 2218], [2217, 2219], [2218, 2220, 2250], [2219, 2221], [2157, 2220, 2222], [2221, 2223], [2222, 2224, 2251], [2223, 2225], [2158, 2224, 2226], [2225, 2227], [2226, 2228, 2252], [2227, 2229], [2159, 2228, 2230], [2229, 2231], [2230, 2232, 2253], [2231, 2233], [2160, 2232, 2234], [2233, 2235], [2234, 2254], [2163, 2257], [2167, 2261], [2171, 2265], [2175, 2269], [2179, 2273], [2183, 2277], [2187, 2281], [2191, 2285], [2195, 2289], [2199, 2293], [2203, 2297], [2207, 2301], [2211, 2305], [2215, 2309], [2219, 2313], [2223, 2317], [2227, 2321], [2231, 2325], [2235, 2329], [2256, 2330], [2255, 2257], [2236, 2256, 2258], [2257, 2259], [2258, 2260, 2331], [2259, 2261], [2237, 2260, 2262], [2261, 2263], [2262, 2264, 2332], [2263, 2265], [2238, 2264, 2266], [2265, 2267], [2266, 2268, 2333], [2267, 2269], [2239, 2268, 2270], [2269, 2271], [2270, 2272, 2334], [2271, 2273], [2240, 2272, 2274], [2273, 2275], [2274, 2276, 2335], [2275, 2277], [2241, 2276, 2278], [2277, 2279], [2278, 2280, 2336], [2279, 2281], [2242, 2280, 2282], [2281, 2283], [2282, 2284, 2337], [2283, 2285], [2243, 2284, 2286], [2285, 2287], [2286, 2288, 2338], [2287, 2289], [2244, 2288, 2290], [2289, 2291], [2290, 2292, 2339], [2291, 2293], [2245, 2292, 2294], [2293, 2295], [2294, 2296, 2340], [2295, 2297], [2246, 2296, 2298], [2297, 2299], [2298, 2300, 2341], [2299, 2301], [2247, 2300, 2302], [2301, 2303], [2302, 2304, 2342], [2303, 2305], [2248, 2304, 2306], [2305, 2307], [2306, 2308, 2343], [2307, 2309], [2249, 2308, 2310], [2309, 2311], [2310, 2312, 2344], [2311, 2313], [2250, 2312, 2314], [2313, 2315], [2314, 2316, 2345], [2315, 2317], [2251, 2316, 2318], [2317, 2319], [2318, 2320, 2346], [2319, 2321], [2252, 2320, 2322], [2321, 2323], [2322, 2324, 2347], [2323, 2325], [2253, 2324, 2326], [2325, 2327], [2326, 2328, 2348], [2327, 2329], [2254, 2328], [2255, 2349], [2259, 2353], [2263, 2357], [2267, 2361], [2271, 2365], [2275, 2369], [2279, 2373], [2283, 2377], [2287, 2381], [2291, 2385], [2295, 2389], [2299, 2393], [2303, 2397], [2307, 2401], [2311, 2405], [2315, 2409], [2319, 2413], [2323, 2417], [2327, 2421], [2330, 2350], [2349, 2351], [2350, 2352, 2424], [2351, 2353], [2331, 2352, 2354], [2353, 2355], [2354, 2356, 2425], [2355, 2357], [2332, 2356, 2358], [2357, 2359], [2358, 2360, 2426], [2359, 2361], [2333, 2360, 2362], [2361, 2363], [2362, 2364, 2427], [2363, 2365], [2334, 2364, 2366], [2365, 2367], [2366, 2368, 2428], [2367, 2369], [2335, 2368, 2370], [2369, 2371], [2370, 2372, 2429], [2371, 2373], [2336, 2372, 2374], [2373, 2375], [2374, 2376, 2430], [2375, 2377], [2337, 2376, 2378], [2377, 2379], [2378, 2380, 2431], [2379, 2381], [2338, 2380, 2382], [2381, 2383], [2382, 2384, 2432], [2383, 2385], [2339, 2384, 2386], [2385, 2387], [2386, 2388, 2433], [2387, 2389], [2340, 2388, 2390], [2389, 2391], [2390, 2392, 2434], [2391, 2393], [2341, 2392, 2394], [2393, 2395], [2394, 2396, 2435], [2395, 2397], [2342, 2396, 2398], [2397, 2399], [2398, 2400, 2436], [2399, 2401], [2343, 2400, 2402], [2401, 2403], [2402, 2404, 2437], [2403, 2405], [2344, 2404, 2406], [2405, 2407], [2406, 2408, 2438], [2407, 2409], [2345, 2408, 2410], [2409, 2411], [2410, 2412, 2439], [2411, 2413], [2346, 2412, 2414], [2413, 2415], [2414, 2416, 2440], [2415, 2417], [2347, 2416, 2418], [2417, 2419], [2418, 2420, 2441], [2419, 2421], [2348, 2420, 2422], [2421, 2423], [2422, 2442], [2351, 2445], [2355, 2449], [2359, 2453], [2363, 2457], [2367, 2461], [2371, 2465], [2375, 2469], [2379, 2473], [2383, 2477], [2387, 2481], [2391, 2485], [2395, 2489], [2399, 2493], [2403, 2497], [2407, 2501], [2411, 2505], [2415, 2509], [2419, 2513], [2423, 2517], [2444, 2518], [2443, 2445], [2424, 2444, 2446], [2445, 2447], [2446, 2448, 2519], [2447, 2449], [2425, 2448, 2450], [2449, 2451], [2450, 2452, 2520], [2451, 2453], [2426, 2452, 2454], [2453, 2455], [2454, 2456, 2521], [2455, 2457], [2427, 2456, 2458], [2457, 2459], [2458, 2460, 2522], [2459, 2461], [2428, 2460, 2462], [2461, 2463], [2462, 2464, 2523], [2463, 2465], [2429, 2464, 2466], [2465, 2467], [2466, 2468, 2524], [2467, 2469], [2430, 2468, 2470], [2469, 2471], [2470, 2472, 2525], [2471, 2473], [2431, 2472, 2474], [2473, 2475], [2474, 2476, 2526], [2475, 2477], [2432, 2476, 2478], [2477, 2479], [2478, 2480, 2527], [2479, 2481], [2433, 2480, 2482], [2481, 2483], [2482, 2484, 2528], [2483, 2485], [2434, 2484, 2486], [2485, 2487], [2486, 2488, 2529], [2487, 2489], [2435, 2488, 2490], [2489, 2491], [2490, 2492, 2530], [2491, 2493], [2436, 2492, 2494], [2493, 2495], [2494, 2496, 2531], [2495, 2497], [2437, 2496, 2498], [2497, 2499], [2498, 2500, 2532], [2499, 2501], [2438, 2500, 2502], [2501, 2503], [2502, 2504, 2533], [2503, 2505], [2439, 2504, 2506], [2505, 2507], [2506, 2508, 2534], [2507, 2509], [2440, 2508, 2510], [2509, 2511], [2510, 2512, 2535], [2511, 2513], [2441, 2512, 2514], [2513, 2515], [2514, 2516, 2536], [2515, 2517], [2442, 2516], [2443, 2537], [2447, 2541], [2451, 2545], [2455, 2549], [2459, 2553], [2463, 2557], [2467, 2561], [2471, 2565], [2475, 2569], [2479, 2573], [2483, 2577], [2487, 2581], [2491, 2585], [2495, 2589], [2499, 2593], [2503, 2597], [2507, 2601], [2511, 2605], [2515, 2609], [2518, 2538], [2537, 2539], [2538, 2540, 2612], [2539, 2541], [2519, 2540, 2542], [2541, 2543], [2542, 2544, 2613], [2543, 2545], [2520, 2544, 2546], [2545, 2547], [2546, 2548, 2614], [2547, 2549], [2521, 2548, 2550], [2549, 2551], [2550, 2552, 2615], [2551, 2553], [2522, 2552, 2554], [2553, 2555], [2554, 2556, 2616], [2555, 2557], [2523, 2556, 2558], [2557, 2559], [2558, 2560, 2617], [2559, 2561], [2524, 2560, 2562], [2561, 2563], [2562, 2564, 2618], [2563, 2565], [2525, 2564, 2566], [2565, 2567], [2566, 2568, 2619], [2567, 2569], [2526, 2568, 2570], [2569, 2571], [2570, 2572, 2620], [2571, 2573], [2527, 2572, 2574], [2573, 2575], [2574, 2576, 2621], [2575, 2577], [2528, 2576, 2578], [2577, 2579], [2578, 2580, 2622], [2579, 2581], [2529, 2580, 2582], [2581, 2583], [2582, 2584, 2623], [2583, 2585], [2530, 2584, 2586], [2585, 2587], [2586, 2588, 2624], [2587, 2589], [2531, 2588, 2590], [2589, 2591], [2590, 2592, 2625], [2591, 2593], [2532, 2592, 2594], [2593, 2595], [2594, 2596, 2626], [2595, 2597], [2533, 2596, 2598], [2597, 2599], [2598, 2600, 2627], [2599, 2601], [2534, 2600, 2602], [2601, 2603], [2602, 2604, 2628], [2603, 2605], [2535, 2604, 2606], [2605, 2607], [2606, 2608, 2629], [2607, 2609], [2536, 2608, 2610], [2609, 2611], [2610, 2630], [2539, 2633], [2543, 2637], [2547, 2641], [2551, 2645], [2555, 2649], [2559, 2653], [2563, 2657], [2567, 2661], [2571, 2665], [2575, 2669], [2579, 2673], [2583, 2677], [2587, 2681], [2591, 2685], [2595, 2689], [2599, 2693], [2603, 2697], [2607, 2701], [2611, 2705], [2632, 2706], [2631, 2633], [2612, 2632, 2634], [2633, 2635], [2634, 2636, 2707], [2635, 2637], [2613, 2636, 2638], [2637, 2639], [2638, 2640, 2708], [2639, 2641], [2614, 2640, 2642], [2641, 2643], [2642, 2644, 2709], [2643, 2645], [2615, 2644, 2646], [2645, 2647], [2646, 2648, 2710], [2647, 2649], [2616, 2648, 2650], [2649, 2651], [2650, 2652, 2711], [2651, 2653], [2617, 2652, 2654], [2653, 2655], [2654, 2656, 2712], [2655, 2657], [2618, 2656, 2658], [2657, 2659], [2658, 2660, 2713], [2659, 2661], [2619, 2660, 2662], [2661, 2663], [2662, 2664, 2714], [2663, 2665], [2620, 2664, 2666], [2665, 2667], [2666, 2668, 2715], [2667, 2669], [2621, 2668, 2670], [2669, 2671], [2670, 2672, 2716], [2671, 2673], [2622, 2672, 2674], [2673, 2675], [2674, 2676, 2717], [2675, 2677], [2623, 2676, 2678], [2677, 2679], [2678, 2680, 2718], [2679, 2681], [2624, 2680, 2682], [2681, 2683], [2682, 2684, 2719], [2683, 2685], [2625, 2684, 2686], [2685, 2687], [2686, 2688, 2720], [2687, 2689], [2626, 2688, 2690], [2689, 2691], [2690, 2692, 2721], [2691, 2693], [2627, 2692, 2694], [2693, 2695], [2694, 2696, 2722], [2695, 2697], [2628, 2696, 2698], [2697, 2699], [2698, 2700, 2723], [2699, 2701], [2629, 2700, 2702], [2701, 2703], [2702, 2704, 2724], [2703, 2705], [2630, 2704], [2631, 2725], [2635, 2729], [2639, 2733], [2643, 2737], [2647, 2741], [2651, 2745], [2655, 2749], [2659, 2753], [2663, 2757], [2667, 2761], [2671, 2765], [2675, 2769], [2679, 2773], [2683, 2777], [2687, 2781], [2691, 2785], [2695, 2789], [2699, 2793], [2703, 2797], [2706, 2726], [2725, 2727], [2726, 2728, 2800], [2727, 2729], [2707, 2728, 2730], [2729, 2731], [2730, 2732, 2801], [2731, 2733], [2708, 2732, 2734], [2733, 2735], [2734, 2736, 2802], [2735, 2737], [2709, 2736, 2738], [2737, 2739], [2738, 2740, 2803], [2739, 2741], [2710, 2740, 2742], [2741, 2743], [2742, 2744, 2804], [2743, 2745], [2711, 2744, 2746], [2745, 2747], [2746, 2748, 2805], [2747, 2749], [2712, 2748, 2750], [2749, 2751], [2750, 2752, 2806], [2751, 2753], [2713, 2752, 2754], [2753, 2755], [2754, 2756, 2807], [2755, 2757], [2714, 2756, 2758], [2757, 2759], [2758, 2760, 2808], [2759, 2761], [2715, 2760, 2762], [2761, 2763], [2762, 2764, 2809], [2763, 2765], [2716, 2764, 2766], [2765, 2767], [2766, 2768, 2810], [2767, 2769], [2717, 2768, 2770], [2769, 2771], [2770, 2772, 2811], [2771, 2773], [2718, 2772, 2774], [2773, 2775], [2774, 2776, 2812], [2775, 2777], [2719, 2776, 2778], [2777, 2779], [2778, 2780, 2813], [2779, 2781], [2720, 2780, 2782], [2781, 2783], [2782, 2784, 2814], [2783, 2785], [2721, 2784, 2786], [2785, 2787], [2786, 2788, 2815], [2787, 2789], [2722, 2788, 2790], [2789, 2791], [2790, 2792, 2816], [2791, 2793], [2723, 2792, 2794], [2793, 2795], [2794, 2796, 2817], [2795, 2797], [2724, 2796, 2798], [2797, 2799], [2798, 2818], [2727, 2821], [2731, 2825], [2735, 2829], [2739, 2833], [2743, 2837], [2747, 2841], [2751, 2845], [2755, 2849], [2759, 2853], [2763, 2857], [2767, 2861], [2771, 2865], [2775, 2869], [2779, 2873], [2783, 2877], [2787, 2881], [2791, 2885], [2795, 2889], [2799, 2893], [2820, 2894], [2819, 2821], [2800, 2820, 2822], [2821, 2823], [2822, 2824, 2895], [2823, 2825], [2801, 2824, 2826], [2825, 2827], [2826, 2828, 2896], [2827, 2829], [2802, 2828, 2830], [2829, 2831], [2830, 2832, 2897], [2831, 2833], [2803, 2832, 2834], [2833, 2835], [2834, 2836, 2898], [2835, 2837], [2804, 2836, 2838], [2837, 2839], [2838, 2840, 2899], [2839, 2841], [2805, 2840, 2842], [2841, 2843], [2842, 2844, 2900], [2843, 2845], [2806, 2844, 2846], [2845, 2847], [2846, 2848, 2901], [2847, 2849], [2807, 2848, 2850], [2849, 2851], [2850, 2852, 2902], [2851, 2853], [2808, 2852, 2854], [2853, 2855], [2854, 2856, 2903], [2855, 2857], [2809, 2856, 2858], [2857, 2859], [2858, 2860, 2904], [2859, 2861], [2810, 2860, 2862], [2861, 2863], [2862, 2864, 2905], [2863, 2865], [2811, 2864, 2866], [2865, 2867], [2866, 2868, 2906], [2867, 2869], [2812, 2868, 2870], [2869, 2871], [2870, 2872, 2907], [2871, 2873], [2813, 2872, 2874], [2873, 2875], [2874, 2876, 2908], [2875, 2877], [2814, 2876, 2878], [2877, 2879], [2878, 2880, 2909], [2879, 2881], [2815, 2880, 2882], [2881, 2883], [2882, 2884, 2910], [2883, 2885], [2816, 2884, 2886], [2885, 2887], [2886, 2888, 2911], [2887, 2889], [2817, 2888, 2890], [2889, 2891], [2890, 2892, 2912], [2891, 2893], [2818, 2892], [2819, 2913], [2823, 2917], [2827, 2921], [2831, 2925], [2835, 2929], [2839, 2933], [2843, 2937], [2847, 2941], [2851, 2945], [2855, 2949], [2859, 2953], [2863, 2957], [2867, 2961], [2871, 2965], [2875, 2969], [2879, 2973], [2883, 2977], [2887, 2981], [2891, 2985], [2894, 2914], [2913, 2915], [2914, 2916, 2988], [2915, 2917], [2895, 2916, 2918], [2917, 2919], [2918, 2920, 2989], [2919, 2921], [2896, 2920, 2922], [2921, 2923], [2922, 2924, 2990], [2923, 2925], [2897, 2924, 2926], [2925, 2927], [2926, 2928, 2991], [2927, 2929], [2898, 2928, 2930], [2929, 2931], [2930, 2932, 2992], [2931, 2933], [2899, 2932, 2934], [2933, 2935], [2934, 2936, 2993], [2935, 2937], [2900, 2936, 2938], [2937, 2939], [2938, 2940, 2994], [2939, 2941], [2901, 2940, 2942], [2941, 2943], [2942, 2944, 2995], [2943, 2945], [2902, 2944, 2946], [2945, 2947], [2946, 2948, 2996], [2947, 2949], [2903, 2948, 2950], [2949, 2951], [2950, 2952, 2997], [2951, 2953], [2904, 2952, 2954], [2953, 2955], [2954, 2956, 2998], [2955, 2957], [2905, 2956, 2958], [2957, 2959], [2958, 2960, 2999], [2959, 2961], [2906, 2960, 2962], [2961, 2963], [2962, 2964, 3000], [2963, 2965], [2907, 2964, 2966], [2965, 2967], [2966, 2968, 3001], [2967, 2969], [2908, 2968, 2970], [2969, 2971], [2970, 2972, 3002], [2971, 2973], [2909, 2972, 2974], [2973, 2975], [2974, 2976, 3003], [2975, 2977], [2910, 2976, 2978], [2977, 2979], [2978, 2980, 3004], [2979, 2981], [2911, 2980, 2982], [2981, 2983], [2982, 2984, 3005], [2983, 2985], [2912, 2984, 2986], [2985, 2987], [2986, 3006], [2915, 3009], [2919, 3013], [2923, 3017], [2927, 3021], [2931, 3025], [2935, 3029], [2939, 3033], [2943, 3037], [2947, 3041], [2951, 3045], [2955, 3049], [2959, 3053], [2963, 3057], [2967, 3061], [2971, 3065], [2975, 3069], [2979, 3073], [2983, 3077], [2987, 3081], [3008, 3082], [3007, 3009], [2988, 3008, 3010], [3009, 3011], [3010, 3012, 3083], [3011, 3013], [2989, 3012, 3014], [3013, 3015], [3014, 3016, 3084], [3015, 3017], [2990, 3016, 3018], [3017, 3019], [3018, 3020, 3085], [3019, 3021], [2991, 3020, 3022], [3021, 3023], [3022, 3024, 3086], [3023, 3025], [2992, 3024, 3026], [3025, 3027], [3026, 3028, 3087], [3027, 3029], [2993, 3028, 3030], [3029, 3031], [3030, 3032, 3088], [3031, 3033], [2994, 3032, 3034], [3033, 3035], [3034, 3036, 3089], [3035, 3037], [2995, 3036, 3038], [3037, 3039], [3038, 3040, 3090], [3039, 3041], [2996, 3040, 3042], [3041, 3043], [3042, 3044, 3091], [3043, 3045], [2997, 3044, 3046], [3045, 3047], [3046, 3048, 3092], [3047, 3049], [2998, 3048, 3050], [3049, 3051], [3050, 3052, 3093], [3051, 3053], [2999, 3052, 3054], [3053, 3055], [3054, 3056, 3094], [3055, 3057], [3000, 3056, 3058], [3057, 3059], [3058, 3060, 3095], [3059, 3061], [3001, 3060, 3062], [3061, 3063], [3062, 3064, 3096], [3063, 3065], [3002, 3064, 3066], [3065, 3067], [3066, 3068, 3097], [3067, 3069], [3003, 3068, 3070], [3069, 3071], [3070, 3072, 3098], [3071, 3073], [3004, 3072, 3074], [3073, 3075], [3074, 3076, 3099], [3075, 3077], [3005, 3076, 3078], [3077, 3079], [3078, 3080, 3100], [3079, 3081], [3006, 3080], [3007, 3101], [3011, 3105], [3015, 3109], [3019, 3113], [3023, 3117], [3027, 3121], [3031, 3125], [3035, 3129], [3039, 3133], [3043, 3137], [3047, 3141], [3051, 3145], [3055, 3149], [3059, 3153], [3063, 3157], [3067, 3161], [3071, 3165], [3075, 3169], [3079, 3173], [3082, 3102], [3101, 3103], [3102, 3104, 3176], [3103, 3105], [3083, 3104, 3106], [3105, 3107], [3106, 3108, 3177], [3107, 3109], [3084, 3108, 3110], [3109, 3111], [3110, 3112, 3178], [3111, 3113], [3085, 3112, 3114], [3113, 3115], [3114, 3116, 3179], [3115, 3117], [3086, 3116, 3118], [3117, 3119], [3118, 3120, 3180], [3119, 3121], [3087, 3120, 3122], [3121, 3123], [3122, 3124, 3181], [3123, 3125], [3088, 3124, 3126], [3125, 3127], [3126, 3128, 3182], [3127, 3129], [3089, 3128, 3130], [3129, 3131], [3130, 3132, 3183], [3131, 3133], [3090, 3132, 3134], [3133, 3135], [3134, 3136, 3184], [3135, 3137], [3091, 3136, 3138], [3137, 3139], [3138, 3140, 3185], [3139, 3141], [3092, 3140, 3142], [3141, 3143], [3142, 3144, 3186], [3143, 3145], [3093, 3144, 3146], [3145, 3147], [3146, 3148, 3187], [3147, 3149], [3094, 3148, 3150], [3149, 3151], [3150, 3152, 3188], [3151, 3153], [3095, 3152, 3154], [3153, 3155], [3154, 3156, 3189], [3155, 3157], [3096, 3156, 3158], [3157, 3159], [3158, 3160, 3190], [3159, 3161], [3097, 3160, 3162], [3161, 3163], [3162, 3164, 3191], [3163, 3165], [3098, 3164, 3166], [3165, 3167], [3166, 3168, 3192], [3167, 3169], [3099, 3168, 3170], [3169, 3171], [3170, 3172, 3193], [3171, 3173], [3100, 3172, 3174], [3173, 3175], [3174, 3194], [3103, 3197], [3107, 3201], [3111, 3205], [3115, 3209], [3119, 3213], [3123, 3217], [3127, 3221], [3131, 3225], [3135, 3229], [3139, 3233], [3143, 3237], [3147, 3241], [3151, 3245], [3155, 3249], [3159, 3253], [3163, 3257], [3167, 3261], [3171, 3265], [3175, 3269], [3196, 3270], [3195, 3197], [3176, 3196, 3198], [3197, 3199], [3198, 3200, 3271], [3199, 3201], [3177, 3200, 3202], [3201, 3203], [3202, 3204, 3272], [3203, 3205], [3178, 3204, 3206], [3205, 3207], [3206, 3208, 3273], [3207, 3209], [3179, 3208, 3210], [3209, 3211], [3210, 3212, 3274], [3211, 3213], [3180, 3212, 3214], [3213, 3215], [3214, 3216, 3275], [3215, 3217], [3181, 3216, 3218], [3217, 3219], [3218, 3220, 3276], [3219, 3221], [3182, 3220, 3222], [3221, 3223], [3222, 3224, 3277], [3223, 3225], [3183, 3224, 3226], [3225, 3227], [3226, 3228, 3278], [3227, 3229], [3184, 3228, 3230], [3229, 3231], [3230, 3232, 3279], [3231, 3233], [3185, 3232, 3234], [3233, 3235], [3234, 3236, 3280], [3235, 3237], [3186, 3236, 3238], [3237, 3239], [3238, 3240, 3281], [3239, 3241], [3187, 3240, 3242], [3241, 3243], [3242, 3244, 3282], [3243, 3245], [3188, 3244, 3246], [3245, 3247], [3246, 3248, 3283], [3247, 3249], [3189, 3248, 3250], [3249, 3251], [3250, 3252, 3284], [3251, 3253], [3190, 3252, 3254], [3253, 3255], [3254, 3256, 3285], [3255, 3257], [3191, 3256, 3258], [3257, 3259], [3258, 3260, 3286], [3259, 3261], [3192, 3260, 3262], [3261, 3263], [3262, 3264, 3287], [3263, 3265], [3193, 3264, 3266], [3265, 3267], [3266, 3268, 3288], [3267, 3269], [3194, 3268], [3195, 3289], [3199, 3293], [3203, 3297], [3207, 3301], [3211, 3305], [3215, 3309], [3219, 3313], [3223, 3317], [3227, 3321], [3231, 3325], [3235, 3329], [3239, 3333], [3243, 3337], [3247, 3341], [3251, 3345], [3255, 3349], [3259, 3353], [3263, 3357], [3267, 3361], [3270, 3290], [3289, 3291], [3290, 3292, 3364], [3291, 3293], [3271, 3292, 3294], [3293, 3295], [3294, 3296, 3365], [3295, 3297], [3272, 3296, 3298], [3297, 3299], [3298, 3300, 3366], [3299, 3301], [3273, 3300, 3302], [3301, 3303], [3302, 3304, 3367], [3303, 3305], [3274, 3304, 3306], [3305, 3307], [3306, 3308, 3368], [3307, 3309], [3275, 3308, 3310], [3309, 3311], [3310, 3312, 3369], [3311, 3313], [3276, 3312, 3314], [3313, 3315], [3314, 3316, 3370], [3315, 3317], [3277, 3316, 3318], [3317, 3319], [3318, 3320, 3371], [3319, 3321], [3278, 3320, 3322], [3321, 3323], [3322, 3324, 3372], [3323, 3325], [3279, 3324, 3326], [3325, 3327], [3326, 3328, 3373], [3327, 3329], [3280, 3328, 3330], [3329, 3331], [3330, 3332, 3374], [3331, 3333], [3281, 3332, 3334], [3333, 3335], [3334, 3336, 3375], [3335, 3337], [3282, 3336, 3338], [3337, 3339], [3338, 3340, 3376], [3339, 3341], [3283, 3340, 3342], [3341, 3343], [3342, 3344, 3377], [3343, 3345], [3284, 3344, 3346], [3345, 3347], [3346, 3348, 3378], [3347, 3349], [3285, 3348, 3350], [3349, 3351], [3350, 3352, 3379], [3351, 3353], [3286, 3352, 3354], [3353, 3355], [3354, 3356, 3380], [3355, 3357], [3287, 3356, 3358], [3357, 3359], [3358, 3360, 3381], [3359, 3361], [3288, 3360, 3362], [3361, 3363], [3362, 3382], [3291, 3384], [3295, 3388], [3299, 3392], [3303, 3396], [3307, 3400], [3311, 3404], [3315, 3408], [3319, 3412], [3323, 3416], [3327, 3420], [3331, 3424], [3335, 3428], [3339, 3432], [3343, 3436], [3347, 3440], [3351, 3444], [3355, 3448], [3359, 3452], [3363, 3456], [3384], [3364, 3383, 3385], [3384, 3386], [3385, 3387], [3386, 3388], [3365, 3387, 3389], [3388, 3390], [3389, 3391], [3390, 3392], [3366, 3391, 3393], [3392, 3394], [3393, 3395], [3394, 3396], [3367, 3395, 3397], [3396, 3398], [3397, 3399], [3398, 3400], [3368, 3399, 3401], [3400, 3402], [3401, 3403], [3402, 3404], [3369, 3403, 3405], [3404, 3406], [3405, 3407], [3406, 3408], [3370, 3407, 3409], [3408, 3410], [3409, 3411], [3410, 3412], [3371, 3411, 3413], [3412, 3414], [3413, 3415], [3414, 3416], [3372, 3415, 3417], [3416, 3418], [3417, 3419], [3418, 3420], [3373, 3419, 3421], [3420, 3422], [3421, 3423], [3422, 3424], [3374, 3423, 3425], [3424, 3426], [3425, 3427], [3426, 3428], [3375, 3427, 3429], [3428, 3430], [3429, 3431], [3430, 3432], [3376, 3431, 3433], [3432, 3434], [3433, 3435], [3434, 3436], [3377, 3435, 3437], [3436, 3438], [3437, 3439], [3438, 3440], [3378, 3439, 3441], [3440, 3442], [3441, 3443], [3442, 3444], [3379, 3443, 3445], [3444, 3446], [3445, 3447], [3446, 3448], [3380, 3447, 3449], [3448, 3450], [3449, 3451], [3450, 3452], [3381, 3451, 3453], [3452, 3454], [3453, 3455], [3454, 3456], [3382, 3455]] SGERROR: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1, 74], [0, 2], [1, 3], [2, 4], [3, 5, 75], [4, 6], [5, 7], [6, 8], [7, 9, 76], [8, 10], [9, 11], [10, 12], [11, 13, 77], [12, 14], [13, 15], [14, 16], [15, 17, 78], [16, 18], [17, 19], [18, 20], [19, 21, 79], [20, 22], [21, 23], [22, 24], [23, 25, 80], [24, 26], [25, 27], [26, 28], [27, 29, 81], [28, 30], [29, 31], [30, 32], [31, 33, 82], [32, 34], [33, 35], [34, 36], [35, 37, 83], [36, 38], [37, 39], [38, 40], [39, 41, 84], [40, 42], [41, 43], [42, 44], [43, 45, 85], [44, 46], [45, 47], [46, 48], [47, 49, 86], [48, 50], [49, 51], [50, 52], [51, 53, 87], [52, 54], [53, 55], [54, 56], [55, 57, 88], [56, 58], [57, 59], [58, 60], [59, 61, 89], [60, 62], [61, 63], [62, 64], [63, 65, 90], [64, 66], [65, 67], [66, 68], [67, 69, 91], [68, 70], [69, 71], [70, 72], [71, 73, 92], [72], [0, 93], [4, 97], [8, 101], [12, 105], [16, 109], [20, 113], [24, 117], [28, 121], [32, 125], [36, 129], [40, 133], [44, 137], [48, 141], [52, 145], [56, 149], [60, 153], [64, 157], [68, 161], [72, 165], [74, 94], [93, 95], [94, 96, 168], [95, 97], [75, 96, 98], [97, 99], [98, 100, 169], [99, 101], [76, 100, 102], [101, 103], [102, 104, 170], [103, 105], [77, 104, 106], [105, 107], [106, 108, 171], [107, 109], [78, 108, 110], [109, 111], [110, 112, 172], [111, 113], [79, 112, 114], [113, 115], [114, 116, 173], [115, 117], [80, 116, 118], [117, 119], [118, 120, 174], [119, 121], [81, 120, 122], [121, 123], [122, 124, 175], [123, 125], [82, 124, 126], [125, 127], [126, 128, 176], [127, 129], [83, 128, 130], [129, 131], [130, 132, 177], [131, 133], [84, 132, 134], [133, 135], [134, 136, 178], [135, 137], [85, 136, 138], [137, 139], [138, 140, 179], [139, 141], [86, 140, 142], [141, 143], [142, 144, 180], [143, 145], [87, 144, 146], [145, 147], [146, 148, 181], [147, 149], [88, 148, 150], [149, 151], [150, 152, 182], [151, 153], [89, 152, 154], [153, 155], [154, 156, 183], [155, 157], [90, 156, 158], [157, 159], [158, 160, 184], [159, 161], [91, 160, 162], [161, 163], [162, 164, 185], [163, 165], [92, 164, 166], [165, 167], [166, 186], [95, 189], [99, 193], [103, 197], [107, 201], [111, 205], [115, 209], [119, 213], [123, 217], [127, 221], [131, 225], [135, 229], [139, 233], [143, 237], [147, 241], [151, 245], [155, 249], [159, 253], [163, 257], [167, 261], [188, 262], [187, 189], [168, 188, 190], [189, 191], [190, 192, 263], [191, 193], [169, 192, 194], [193, 195], [194, 196, 264], [195, 197], [170, 196, 198], [197, 199], [198, 200, 265], [199, 201], [171, 200, 202], [201, 203], [202, 204, 266], [203, 205], [172, 204, 206], [205, 207], [206, 208, 267], [207, 209], [173, 208, 210], [209, 211], [210, 212, 268], [211, 213], [174, 212, 214], [213, 215], [214, 216, 269], [215, 217], [175, 216, 218], [217, 219], [218, 220, 270], [219, 221], [176, 220, 222], [221, 223], [222, 224, 271], [223, 225], [177, 224, 226], [225, 227], [226, 228, 272], [227, 229], [178, 228, 230], [229, 231], [230, 232, 273], [231, 233], [179, 232, 234], [233, 235], [234, 236, 274], [235, 237], [180, 236, 238], [237, 239], [238, 240, 275], [239, 241], [181, 240, 242], [241, 243], [242, 244, 276], [243, 245], [182, 244, 246], [245, 247], [246, 248, 277], [247, 249], [183, 248, 250], [249, 251], [250, 252, 278], [251, 253], [184, 252, 254], [253, 255], [254, 256, 279], [255, 257], [185, 256, 258], [257, 259], [258, 260, 280], [259, 261], [186, 260], [187, 281], [191, 285], [195, 289], [199, 293], [203, 297], [207, 301], [211, 305], [215, 309], [219, 313], [223, 317], [227, 321], [231, 325], [235, 329], [239, 333], [243, 337], [247, 341], [251, 345], [255, 349], [259, 353], [262, 282], [281, 283], [282, 284, 356], [283, 285], [263, 284, 286], [285, 287], [286, 288, 357], [287, 289], [264, 288, 290], [289, 291], [290, 292, 358], [291, 293], [265, 292, 294], [293, 295], [294, 296, 359], [295, 297], [266, 296, 298], [297, 299], [298, 300, 360], [299, 301], [267, 300, 302], [301, 303], [302, 304, 361], [303, 305], [268, 304, 306], [305, 307], [306, 308, 362], [307, 309], [269, 308, 310], [309, 311], [310, 312, 363], [311, 313], [270, 312, 314], [313, 315], [314, 316, 364], [315, 317], [271, 316, 318], [317, 319], [318, 320, 365], [319, 321], [272, 320, 322], [321, 323], [322, 324, 366], [323, 325], [273, 324, 326], [325, 327], [326, 328, 367], [327, 329], [274, 328, 330], [329, 331], [330, 332, 368], [331, 333], [275, 332, 334], [333, 335], [334, 336, 369], [335, 337], [276, 336, 338], [337, 339], [338, 340, 370], [339, 341], [277, 340, 342], [341, 343], [342, 344, 371], [343, 345], [278, 344, 346], [345, 347], [346, 348, 372], [347, 349], [279, 348, 350], [349, 351], [350, 352, 373], [351, 353], [280, 352, 354], [353, 355], [354, 374], [283, 377], [287, 381], [291, 385], [295, 389], [299, 393], [303, 397], [307, 401], [311, 405], [315, 409], [319, 413], [323, 417], [327, 421], [331, 425], [335, 429], [339, 433], [343, 437], [347, 441], [351, 445], [355, 449], [376, 450], [375, 377], [356, 376, 378], [377, 379], [378, 380, 451], [379, 381], [357, 380, 382], [381, 383], [382, 384, 452], [383, 385], [358, 384, 386], [385, 387], [386, 388, 453], [387, 389], [359, 388, 390], [389, 391], [390, 392, 454], [391, 393], [360, 392, 394], [393, 395], [394, 396, 455], [395, 397], [361, 396, 398], [397, 399], [398, 400, 456], [399, 401], [362, 400, 402], [401, 403], [402, 404, 457], [403, 405], [363, 404, 406], [405, 407], [406, 408, 458], [407, 409], [364, 408, 410], [409, 411], [410, 412, 459], [411, 413], [365, 412, 414], [413, 415], [414, 416, 460], [415, 417], [366, 416, 418], [417, 419], [418, 420, 461], [419, 421], [367, 420, 422], [421, 423], [422, 424, 462], [423, 425], [368, 424, 426], [425, 427], [426, 428, 463], [427, 429], [369, 428, 430], [429, 431], [430, 432, 464], [431, 433], [370, 432, 434], [433, 435], [434, 436, 465], [435, 437], [371, 436, 438], [437, 439], [438, 440, 466], [439, 441], [372, 440, 442], [441, 443], [442, 444, 467], [443, 445], [373, 444, 446], [445, 447], [446, 448, 468], [447, 449], [374, 448], [375, 469], [379, 473], [383, 477], [387, 481], [391, 485], [395, 489], [399, 493], [403, 497], [407, 501], [411, 505], [415, 509], [419, 513], [423, 517], [427, 521], [431, 525], [435, 529], [439, 533], [443, 537], [447, 541], [450, 470], [469, 471], [470, 472, 544], [471, 473], [451, 472, 474], [473, 475], [474, 476, 545], [475, 477], [452, 476, 478], [477, 479], [478, 480, 546], [479, 481], [453, 480, 482], [481, 483], [482, 484, 547], [483, 485], [454, 484, 486], [485, 487], [486, 488, 548], [487, 489], [455, 488, 490], [489, 491], [490, 492, 549], [491, 493], [456, 492, 494], [493, 495], [494, 496, 550], [495, 497], [457, 496, 498], [497, 499], [498, 500, 551], [499, 501], [458, 500, 502], [501, 503], [502, 504, 552], [503, 505], [459, 504, 506], [505, 507], [506, 508, 553], [507, 509], [460, 508, 510], [509, 511], [510, 512, 554], [511, 513], [461, 512, 514], [513, 515], [514, 516, 555], [515, 517], [462, 516, 518], [517, 519], [518, 520, 556], [519, 521], [463, 520, 522], [521, 523], [522, 524, 557], [523, 525], [464, 524, 526], [525, 527], [526, 528, 558], [527, 529], [465, 528, 530], [529, 531], [530, 532, 559], [531, 533], [466, 532, 534], [533, 535], [534, 536, 560], [535, 537], [467, 536, 538], [537, 539], [538, 540, 561], [539, 541], [468, 540, 542], [541, 543], [542, 562], [471, 565], [475, 569], [479, 573], [483, 577], [487, 581], [491, 585], [495, 589], [499, 593], [503, 597], [507, 601], [511, 605], [515, 609], [519, 613], [523, 617], [527, 621], [531, 625], [535, 629], [539, 633], [543, 637], [564, 638], [563, 565], [544, 564, 566], [565, 567], [566, 568, 639], [567, 569], [545, 568, 570], [569, 571], [570, 572, 640], [571, 573], [546, 572, 574], [573, 575], [574, 576, 641], [575, 577], [547, 576, 578], [577, 579], [578, 580, 642], [579, 581], [548, 580, 582], [581, 583], [582, 584, 643], [583, 585], [549, 584, 586], [585, 587], [586, 588, 644], [587, 589], [550, 588, 590], [589, 591], [590, 592, 645], [591, 593], [551, 592, 594], [593, 595], [594, 596, 646], [595, 597], [552, 596, 598], [597, 599], [598, 600, 647], [599, 601], [553, 600, 602], [601, 603], [602, 604, 648], [603, 605], [554, 604, 606], [605, 607], [606, 608, 649], [607, 609], [555, 608, 610], [609, 611], [610, 612, 650], [611, 613], [556, 612, 614], [613, 615], [614, 616, 651], [615, 617], [557, 616, 618], [617, 619], [618, 620, 652], [619, 621], [558, 620, 622], [621, 623], [622, 624, 653], [623, 625], [559, 624, 626], [625, 627], [626, 628, 654], [627, 629], [560, 628, 630], [629, 631], [630, 632, 655], [631, 633], [561, 632, 634], [633, 635], [634, 636, 656], [635, 637], [562, 636], [563, 657], [567, 661], [571, 665], [575, 669], [579, 673], [583, 677], [587, 681], [591, 685], [595, 689], [599, 693], [603, 697], [607, 701], [611, 705], [615, 709], [619, 713], [623, 717], [627, 721], [631, 725], [635, 729], [638, 658], [657, 659], [658, 660, 732], [659, 661], [639, 660, 662], [661, 663], [662, 664, 733], [663, 665], [640, 664, 666], [665, 667], [666, 668, 734], [667, 669], [641, 668, 670], [669, 671], [670, 672, 735], [671, 673], [642, 672, 674], [673, 675], [674, 676, 736], [675, 677], [643, 676, 678], [677, 679], [678, 680, 737], [679, 681], [644, 680, 682], [681, 683], [682, 684, 738], [683, 685], [645, 684, 686], [685, 687], [686, 688, 739], [687, 689], [646, 688, 690], [689, 691], [690, 692, 740], [691, 693], [647, 692, 694], [693, 695], [694, 696, 741], [695, 697], [648, 696, 698], [697, 699], [698, 700, 742], [699, 701], [649, 700, 702], [701, 703], [702, 704, 743], [703, 705], [650, 704, 706], [705, 707], [706, 708, 744], [707, 709], [651, 708, 710], [709, 711], [710, 712, 745], [711, 713], [652, 712, 714], [713, 715], [714, 716, 746], [715, 717], [653, 716, 718], [717, 719], [718, 720, 747], [719, 721], [654, 720, 722], [721, 723], [722, 724, 748], [723, 725], [655, 724, 726], [725, 727], [726, 728, 749], [727, 729], [656, 728, 730], [729, 731], [730, 750], [659, 753], [663, 757], [667, 761], [671, 765], [675, 769], [679, 773], [683, 777], [687, 781], [691, 785], [695, 789], [699, 793], [703, 797], [707, 801], [711, 805], [715, 809], [719, 813], [723, 817], [727, 821], [731, 825], [752, 826], [751, 753], [732, 752, 754], [753, 755], [754, 756, 827], [755, 757], [733, 756, 758], [757, 759], [758, 760, 828], [759, 761], [734, 760, 762], [761, 763], [762, 764, 829], [763, 765], [735, 764, 766], [765, 767], [766, 768, 830], [767, 769], [736, 768, 770], [769, 771], [770, 772, 831], [771, 773], [737, 772, 774], [773, 775], [774, 776, 832], [775, 777], [738, 776, 778], [777, 779], [778, 780, 833], [779, 781], [739, 780, 782], [781, 783], [782, 784, 834], [783, 785], [740, 784, 786], [785, 787], [786, 788, 835], [787, 789], [741, 788, 790], [789, 791], [790, 792, 836], [791, 793], [742, 792, 794], [793, 795], [794, 796, 837], [795, 797], [743, 796, 798], [797, 799], [798, 800, 838], [799, 801], [744, 800, 802], [801, 803], [802, 804, 839], [803, 805], [745, 804, 806], [805, 807], [806, 808, 840], [807, 809], [746, 808, 810], [809, 811], [810, 812, 841], [811, 813], [747, 812, 814], [813, 815], [814, 816, 842], [815, 817], [748, 816, 818], [817, 819], [818, 820, 843], [819, 821], [749, 820, 822], [821, 823], [822, 824, 844], [823, 825], [750, 824], [751, 845], [755, 849], [759, 853], [763, 857], [767, 861], [771, 865], [775, 869], [779, 873], [783, 877], [787, 881], [791, 885], [795, 889], [799, 893], [803, 897], [807, 901], [811, 905], [815, 909], [819, 913], [823, 917], [826, 846], [845, 847], [846, 848, 920], [847, 849], [827, 848, 850], [849, 851], [850, 852, 921], [851, 853], [828, 852, 854], [853, 855], [854, 856, 922], [855, 857], [829, 856, 858], [857, 859], [858, 860, 923], [859, 861], [830, 860, 862], [861, 863], [862, 864, 924], [863, 865], [831, 864, 866], [865, 867], [866, 868, 925], [867, 869], [832, 868, 870], [869, 871], [870, 872, 926], [871, 873], [833, 872, 874], [873, 875], [874, 876, 927], [875, 877], [834, 876, 878], [877, 879], [878, 880, 928], [879, 881], [835, 880, 882], [881, 883], [882, 884, 929], [883, 885], [836, 884, 886], [885, 887], [886, 888, 930], [887, 889], [837, 888, 890], [889, 891], [890, 892, 931], [891, 893], [838, 892, 894], [893, 895], [894, 896, 932], [895, 897], [839, 896, 898], [897, 899], [898, 900, 933], [899, 901], [840, 900, 902], [901, 903], [902, 904, 934], [903, 905], [841, 904, 906], [905, 907], [906, 908, 935], [907, 909], [842, 908, 910], [909, 911], [910, 912, 936], [911, 913], [843, 912, 914], [913, 915], [914, 916, 937], [915, 917], [844, 916, 918], [917, 919], [918, 938], [847, 941], [851, 945], [855, 949], [859, 953], [863, 957], [867, 961], [871, 965], [875, 969], [879, 973], [883, 977], [887, 981], [891, 985], [895, 989], [899, 993], [903, 997], [907, 1001], [911, 1005], [915, 1009], [919, 1013], [940, 1014], [939, 941], [920, 940, 942], [941, 943], [942, 944, 1015], [943, 945], [921, 944, 946], [945, 947], [946, 948, 1016], [947, 949], [922, 948, 950], [949, 951], [950, 952, 1017], [951, 953], [923, 952, 954], [953, 955], [954, 956, 1018], [955, 957], [924, 956, 958], [957, 959], [958, 960, 1019], [959, 961], [925, 960, 962], [961, 963], [962, 964, 1020], [963, 965], [926, 964, 966], [965, 967], [966, 968, 1021], [967, 969], [927, 968, 970], [969, 971], [970, 972, 1022], [971, 973], [928, 972, 974], [973, 975], [974, 976, 1023], [975, 977], [929, 976, 978], [977, 979], [978, 980, 1024], [979, 981], [930, 980, 982], [981, 983], [982, 984, 1025], [983, 985], [931, 984, 986], [985, 987], [986, 988, 1026], [987, 989], [932, 988, 990], [989, 991], [990, 992, 1027], [991, 993], [933, 992, 994], [993, 995], [994, 996, 1028], [995, 997], [934, 996, 998], [997, 999], [998, 1000, 1029], [999, 1001], [935, 1000, 1002], [1001, 1003], [1002, 1004, 1030], [1003, 1005], [936, 1004, 1006], [1005, 1007], [1006, 1008, 1031], [1007, 1009], [937, 1008, 1010], [1009, 1011], [1010, 1012, 1032], [1011, 1013], [938, 1012], [939, 1033], [943, 1037], [947, 1041], [951, 1045], [955, 1049], [959, 1053], [963, 1057], [967, 1061], [971, 1065], [975, 1069], [979, 1073], [983, 1077], [987, 1081], [991, 1085], [995, 1089], [999, 1093], [1003, 1097], [1007, 1101], [1011, 1105], [1014, 1034], [1033, 1035], [1034, 1036, 1108], [1035, 1037], [1015, 1036, 1038], [1037, 1039], [1038, 1040, 1109], [1039, 1041], [1016, 1040, 1042], [1041, 1043], [1042, 1044, 1110], [1043, 1045], [1017, 1044, 1046], [1045, 1047], [1046, 1048, 1111], [1047, 1049], [1018, 1048, 1050], [1049, 1051], [1050, 1052, 1112], [1051, 1053], [1019, 1052, 1054], [1053, 1055], [1054, 1056, 1113], [1055, 1057], [1020, 1056, 1058], [1057, 1059], [1058, 1060, 1114], [1059, 1061], [1021, 1060, 1062], [1061, 1063], [1062, 1064, 1115], [1063, 1065], [1022, 1064, 1066], [1065, 1067], [1066, 1068, 1116], [1067, 1069], [1023, 1068, 1070], [1069, 1071], [1070, 1072, 1117], [1071, 1073], [1024, 1072, 1074], [1073, 1075], [1074, 1076, 1118], [1075, 1077], [1025, 1076, 1078], [1077, 1079], [1078, 1080, 1119], [1079, 1081], [1026, 1080, 1082], [1081, 1083], [1082, 1084, 1120], [1083, 1085], [1027, 1084, 1086], [1085, 1087], [1086, 1088, 1121], [1087, 1089], [1028, 1088, 1090], [1089, 1091], [1090, 1092, 1122], [1091, 1093], [1029, 1092, 1094], [1093, 1095], [1094, 1096, 1123], [1095, 1097], [1030, 1096, 1098], [1097, 1099], [1098, 1100, 1124], [1099, 1101], [1031, 1100, 1102], [1101, 1103], [1102, 1104, 1125], [1103, 1105], [1032, 1104, 1106], [1105, 1107], [1106, 1126], [1035, 1129], [1039, 1133], [1043, 1137], [1047, 1141], [1051, 1145], [1055, 1149], [1059, 1153], [1063, 1157], [1067, 1161], [1071, 1165], [1075, 1169], [1079, 1173], [1083, 1177], [1087, 1181], [1091, 1185], [1095, 1189], [1099, 1193], [1103, 1197], [1107, 1201], [1128, 1202], [1127, 1129], [1108, 1128, 1130], [1129, 1131], [1130, 1132, 1203], [1131, 1133], [1109, 1132, 1134], [1133, 1135], [1134, 1136, 1204], [1135, 1137], [1110, 1136, 1138], [1137, 1139], [1138, 1140, 1205], [1139, 1141], [1111, 1140, 1142], [1141, 1143], [1142, 1144, 1206], [1143, 1145], [1112, 1144, 1146], [1145, 1147], [1146, 1148, 1207], [1147, 1149], [1113, 1148, 1150], [1149, 1151], [1150, 1152, 1208], [1151, 1153], [1114, 1152, 1154], [1153, 1155], [1154, 1156, 1209], [1155, 1157], [1115, 1156, 1158], [1157, 1159], [1158, 1160, 1210], [1159, 1161], [1116, 1160, 1162], [1161, 1163], [1162, 1164, 1211], [1163, 1165], [1117, 1164, 1166], [1165, 1167], [1166, 1168, 1212], [1167, 1169], [1118, 1168, 1170], [1169, 1171], [1170, 1172, 1213], [1171, 1173], [1119, 1172, 1174], [1173, 1175], [1174, 1176, 1214], [1175, 1177], [1120, 1176, 1178], [1177, 1179], [1178, 1180, 1215], [1179, 1181], [1121, 1180, 1182], [1181, 1183], [1182, 1184, 1216], [1183, 1185], [1122, 1184, 1186], [1185, 1187], [1186, 1188, 1217], [1187, 1189], [1123, 1188, 1190], [1189, 1191], [1190, 1192, 1218], [1191, 1193], [1124, 1192, 1194], [1193, 1195], [1194, 1196, 1219], [1195, 1197], [1125, 1196, 1198], [1197, 1199], [1198, 1200, 1220], [1199, 1201], [1126, 1200], [1127, 1221], [1131, 1225], [1135, 1229], [1139, 1233], [1143, 1237], [1147, 1241], [1151, 1245], [1155, 1249], [1159, 1253], [1163, 1257], [1167, 1261], [1171, 1265], [1175, 1269], [1179, 1273], [1183, 1277], [1187, 1281], [1191, 1285], [1195, 1289], [1199, 1293], [1202, 1222], [1221, 1223], [1222, 1224, 1296], [1223, 1225], [1203, 1224, 1226], [1225, 1227], [1226, 1228, 1297], [1227, 1229], [1204, 1228, 1230], [1229, 1231], [1230, 1232, 1298], [1231, 1233], [1205, 1232, 1234], [1233, 1235], [1234, 1236, 1299], [1235, 1237], [1206, 1236, 1238], [1237, 1239], [1238, 1240, 1300], [1239, 1241], [1207, 1240, 1242], [1241, 1243], [1242, 1244, 1301], [1243, 1245], [1208, 1244, 1246], [1245, 1247], [1246, 1248, 1302], [1247, 1249], [1209, 1248, 1250], [1249, 1251], [1250, 1252, 1303], [1251, 1253], [1210, 1252, 1254], [1253, 1255], [1254, 1256, 1304], [1255, 1257], [1211, 1256, 1258], [1257, 1259], [1258, 1260, 1305], [1259, 1261], [1212, 1260, 1262], [1261, 1263], [1262, 1264, 1306], [1263, 1265], [1213, 1264, 1266], [1265, 1267], [1266, 1268, 1307], [1267, 1269], [1214, 1268, 1270], [1269, 1271], [1270, 1272, 1308], [1271, 1273], [1215, 1272, 1274], [1273, 1275], [1274, 1276, 1309], [1275, 1277], [1216, 1276, 1278], [1277, 1279], [1278, 1280, 1310], [1279, 1281], [1217, 1280, 1282], [1281, 1283], [1282, 1284, 1311], [1283, 1285], [1218, 1284, 1286], [1285, 1287], [1286, 1288, 1312], [1287, 1289], [1219, 1288, 1290], [1289, 1291], [1290, 1292, 1313], [1291, 1293], [1220, 1292, 1294], [1293, 1295], [1294, 1314], [1223, 1317], [1227, 1321], [1231, 1325], [1235, 1329], [1239, 1333], [1243, 1337], [1247, 1341], [1251, 1345], [1255, 1349], [1259, 1353], [1263, 1357], [1267, 1361], [1271, 1365], [1275, 1369], [1279, 1373], [1283, 1377], [1287, 1381], [1291, 1385], [1295, 1389], [1316, 1390], [1315, 1317], [1296, 1316, 1318], [1317, 1319], [1318, 1320, 1391], [1319, 1321], [1297, 1320, 1322], [1321, 1323], [1322, 1324, 1392], [1323, 1325], [1298, 1324, 1326], [1325, 1327], [1326, 1328, 1393], [1327, 1329], [1299, 1328, 1330], [1329, 1331], [1330, 1332, 1394], [1331, 1333], [1300, 1332, 1334], [1333, 1335], [1334, 1336, 1395], [1335, 1337], [1301, 1336, 1338], [1337, 1339], [1338, 1340, 1396], [1339, 1341], [1302, 1340, 1342], [1341, 1343], [1342, 1344, 1397], [1343, 1345], [1303, 1344, 1346], [1345, 1347], [1346, 1348, 1398], [1347, 1349], [1304, 1348, 1350], [1349, 1351], [1350, 1352, 1399], [1351, 1353], [1305, 1352, 1354], [1353, 1355], [1354, 1356, 1400], [1355, 1357], [1306, 1356, 1358], [1357, 1359], [1358, 1360, 1401], [1359, 1361], [1307, 1360, 1362], [1361, 1363], [1362, 1364, 1402], [1363, 1365], [1308, 1364, 1366], [1365, 1367], [1366, 1368, 1403], [1367, 1369], [1309, 1368, 1370], [1369, 1371], [1370, 1372, 1404], [1371, 1373], [1310, 1372, 1374], [1373, 1375], [1374, 1376, 1405], [1375, 1377], [1311, 1376, 1378], [1377, 1379], [1378, 1380, 1406], [1379, 1381], [1312, 1380, 1382], [1381, 1383], [1382, 1384, 1407], [1383, 1385], [1313, 1384, 1386], [1385, 1387], [1386, 1388, 1408], [1387, 1389], [1314, 1388], [1315, 1409], [1319, 1413], [1323, 1417], [1327, 1421], [1331, 1425], [1335, 1429], [1339, 1433], [1343, 1437], [1347, 1441], [1351, 1445], [1355, 1449], [1359, 1453], [1363, 1457], [1367, 1461], [1371, 1465], [1375, 1469], [1379, 1473], [1383, 1477], [1387, 1481], [1390, 1410], [1409, 1411], [1410, 1412, 1484], [1411, 1413], [1391, 1412, 1414], [1413, 1415], [1414, 1416, 1485], [1415, 1417], [1392, 1416, 1418], [1417, 1419], [1418, 1420, 1486], [1419, 1421], [1393, 1420, 1422], [1421, 1423], [1422, 1424, 1487], [1423, 1425], [1394, 1424, 1426], [1425, 1427], [1426, 1428, 1488], [1427, 1429], [1395, 1428, 1430], [1429, 1431], [1430, 1432, 1489], [1431, 1433], [1396, 1432, 1434], [1433, 1435], [1434, 1436, 1490], [1435, 1437], [1397, 1436, 1438], [1437, 1439], [1438, 1440, 1491], [1439, 1441], [1398, 1440, 1442], [1441, 1443], [1442, 1444, 1492], [1443, 1445], [1399, 1444, 1446], [1445, 1447], [1446, 1448, 1493], [1447, 1449], [1400, 1448, 1450], [1449, 1451], [1450, 1452, 1494], [1451, 1453], [1401, 1452, 1454], [1453, 1455], [1454, 1456, 1495], [1455, 1457], [1402, 1456, 1458], [1457, 1459], [1458, 1460, 1496], [1459, 1461], [1403, 1460, 1462], [1461, 1463], [1462, 1464, 1497], [1463, 1465], [1404, 1464, 1466], [1465, 1467], [1466, 1468, 1498], [1467, 1469], [1405, 1468, 1470], [1469, 1471], [1470, 1472, 1499], [1471, 1473], [1406, 1472, 1474], [1473, 1475], [1474, 1476, 1500], [1475, 1477], [1407, 1476, 1478], [1477, 1479], [1478, 1480, 1501], [1479, 1481], [1408, 1480, 1482], [1481, 1483], [1482, 1502], [1411, 1505], [1415, 1509], [1419, 1513], [1423, 1517], [1427, 1521], [1431, 1525], [1435, 1529], [1439, 1533], [1443, 1537], [1447, 1541], [1451, 1545], [1455, 1549], [1459, 1553], [1463, 1557], [1467, 1561], [1471, 1565], [1475, 1569], [1479, 1573], [1483, 1577], [1504, 1578], [1503, 1505], [1484, 1504, 1506], [1505, 1507], [1506, 1508, 1579], [1507, 1509], [1485, 1508, 1510], [1509, 1511], [1510, 1512, 1580], [1511, 1513], [1486, 1512, 1514], [1513, 1515], [1514, 1516, 1581], [1515, 1517], [1487, 1516, 1518], [1517, 1519], [1518, 1520, 1582], [1519, 1521], [1488, 1520, 1522], [1521, 1523], [1522, 1524, 1583], [1523, 1525], [1489, 1524, 1526], [1525, 1527], [1526, 1528, 1584], [1527, 1529], [1490, 1528, 1530], [1529, 1531], [1530, 1532, 1585], [1531, 1533], [1491, 1532, 1534], [1533, 1535], [1534, 1536, 1586], [1535, 1537], [1492, 1536, 1538], [1537, 1539], [1538, 1540, 1587], [1539, 1541], [1493, 1540, 1542], [1541, 1543], [1542, 1544, 1588], [1543, 1545], [1494, 1544, 1546], [1545, 1547], [1546, 1548, 1589], [1547, 1549], [1495, 1548, 1550], [1549, 1551], [1550, 1552, 1590], [1551, 1553], [1496, 1552, 1554], [1553, 1555], [1554, 1556, 1591], [1555, 1557], [1497, 1556, 1558], [1557, 1559], [1558, 1560, 1592], [1559, 1561], [1498, 1560, 1562], [1561, 1563], [1562, 1564, 1593], [1563, 1565], [1499, 1564, 1566], [1565, 1567], [1566, 1568, 1594], [1567, 1569], [1500, 1568, 1570], [1569, 1571], [1570, 1572, 1595], [1571, 1573], [1501, 1572, 1574], [1573, 1575], [1574, 1576, 1596], [1575, 1577], [1502, 1576], [1503, 1597], [1507, 1601], [1511, 1605], [1515, 1609], [1519, 1613], [1523, 1617], [1527, 1621], [1531, 1625], [1535, 1629], [1539, 1633], [1543, 1637], [1547, 1641], [1551, 1645], [1555, 1649], [1559, 1653], [1563, 1657], [1567, 1661], [1571, 1665], [1575, 1669], [1578, 1598], [1597, 1599], [1598, 1600, 1672], [1599, 1601], [1579, 1600, 1602], [1601, 1603], [1602, 1604, 1673], [1603, 1605], [1580, 1604, 1606], [1605, 1607], [1606, 1608, 1674], [1607, 1609], [1581, 1608, 1610], [1609, 1611], [1610, 1612, 1675], [1611, 1613], [1582, 1612, 1614], [1613, 1615], [1614, 1616, 1676], [1615, 1617], [1583, 1616, 1618], [1617, 1619], [1618, 1620, 1677], [1619, 1621], [1584, 1620, 1622], [1621, 1623], [1622, 1624, 1678], [1623, 1625], [1585, 1624, 1626], [1625, 1627], [1626, 1628, 1679], [1627, 1629], [1586, 1628, 1630], [1629, 1631], [1630, 1632, 1680], [1631, 1633], [1587, 1632, 1634], [1633, 1635], [1634, 1636, 1681], [1635, 1637], [1588, 1636, 1638], [1637, 1639], [1638, 1640, 1682], [1639, 1641], [1589, 1640, 1642], [1641, 1643], [1642, 1644, 1683], [1643, 1645], [1590, 1644, 1646], [1645, 1647], [1646, 1648, 1684], [1647, 1649], [1591, 1648, 1650], [1649, 1651], [1650, 1652, 1685], [1651, 1653], [1592, 1652, 1654], [1653, 1655], [1654, 1656, 1686], [1655, 1657], [1593, 1656, 1658], [1657, 1659], [1658, 1660, 1687], [1659, 1661], [1594, 1660, 1662], [1661, 1663], [1662, 1664, 1688], [1663, 1665], [1595, 1664, 1666], [1665, 1667], [1666, 1668, 1689], [1667, 1669], [1596, 1668, 1670], [1669, 1671], [1670, 1690], [1599, 1693], [1603, 1697], [1607, 1701], [1611, 1705], [1615, 1709], [1619, 1713], [1623, 1717], [1627, 1721], [1631, 1725], [1635, 1729], [1639, 1733], [1643, 1737], [1647, 1741], [1651, 1745], [1655, 1749], [1659, 1753], [1663, 1757], [1667, 1761], [1671, 1765], [1692, 1766], [1691, 1693], [1672, 1692, 1694], [1693, 1695], [1694, 1696, 1767], [1695, 1697], [1673, 1696, 1698], [1697, 1699], [1698, 1700, 1768], [1699, 1701], [1674, 1700, 1702], [1701, 1703], [1702, 1704, 1769], [1703, 1705], [1675, 1704, 1706], [1705, 1707], [1706, 1708, 1770], [1707, 1709], [1676, 1708, 1710], [1709, 1711], [1710, 1712, 1771], [1711, 1713], [1677, 1712, 1714], [1713, 1715], [1714, 1716, 1772], [1715, 1717], [1678, 1716, 1718], [1717, 1719], [1718, 1720, 1773], [1719, 1721], [1679, 1720, 1722], [1721, 1723], [1722, 1724, 1774], [1723, 1725], [1680, 1724, 1726], [1725, 1727], [1726, 1728, 1775], [1727, 1729], [1681, 1728, 1730], [1729, 1731], [1730, 1732, 1776], [1731, 1733], [1682, 1732, 1734], [1733, 1735], [1734, 1736, 1777], [1735, 1737], [1683, 1736, 1738], [1737, 1739], [1738, 1740, 1778], [1739, 1741], [1684, 1740, 1742], [1741, 1743], [1742, 1744, 1779], [1743, 1745], [1685, 1744, 1746], [1745, 1747], [1746, 1748, 1780], [1747, 1749], [1686, 1748, 1750], [1749, 1751], [1750, 1752, 1781], [1751, 1753], [1687, 1752, 1754], [1753, 1755], [1754, 1756, 1782], [1755, 1757], [1688, 1756, 1758], [1757, 1759], [1758, 1760, 1783], [1759, 1761], [1689, 1760, 1762], [1761, 1763], [1762, 1764, 1784], [1763, 1765], [1690, 1764], [1691, 1785], [1695, 1789], [1699, 1793], [1703, 1797], [1707, 1801], [1711, 1805], [1715, 1809], [1719, 1813], [1723, 1817], [1727, 1821], [1731, 1825], [1735, 1829], [1739, 1833], [1743, 1837], [1747, 1841], [1751, 1845], [1755, 1849], [1759, 1853], [1763, 1857], [1766, 1786], [1785, 1787], [1786, 1788, 1860], [1787, 1789], [1767, 1788, 1790], [1789, 1791], [1790, 1792, 1861], [1791, 1793], [1768, 1792, 1794], [1793, 1795], [1794, 1796, 1862], [1795, 1797], [1769, 1796, 1798], [1797, 1799], [1798, 1800, 1863], [1799, 1801], [1770, 1800, 1802], [1801, 1803], [1802, 1804, 1864], [1803, 1805], [1771, 1804, 1806], [1805, 1807], [1806, 1808, 1865], [1807, 1809], [1772, 1808, 1810], [1809, 1811], [1810, 1812, 1866], [1811, 1813], [1773, 1812, 1814], [1813, 1815], [1814, 1816, 1867], [1815, 1817], [1774, 1816, 1818], [1817, 1819], [1818, 1820, 1868], [1819, 1821], [1775, 1820, 1822], [1821, 1823], [1822, 1824, 1869], [1823, 1825], [1776, 1824, 1826], [1825, 1827], [1826, 1828, 1870], [1827, 1829], [1777, 1828, 1830], [1829, 1831], [1830, 1832, 1871], [1831, 1833], [1778, 1832, 1834], [1833, 1835], [1834, 1836, 1872], [1835, 1837], [1779, 1836, 1838], [1837, 1839], [1838, 1840, 1873], [1839, 1841], [1780, 1840, 1842], [1841, 1843], [1842, 1844, 1874], [1843, 1845], [1781, 1844, 1846], [1845, 1847], [1846, 1848, 1875], [1847, 1849], [1782, 1848, 1850], [1849, 1851], [1850, 1852, 1876], [1851, 1853], [1783, 1852, 1854], [1853, 1855], [1854, 1856, 1877], [1855, 1857], [1784, 1856, 1858], [1857, 1859], [1858, 1878], [1787, 1881], [1791, 1885], [1795, 1889], [1799, 1893], [1803, 1897], [1807, 1901], [1811, 1905], [1815, 1909], [1819, 1913], [1823, 1917], [1827, 1921], [1831, 1925], [1835, 1929], [1839, 1933], [1843, 1937], [1847, 1941], [1851, 1945], [1855, 1949], [1859, 1953], [1880, 1954], [1879, 1881], [1860, 1880, 1882], [1881, 1883], [1882, 1884, 1955], [1883, 1885], [1861, 1884, 1886], [1885, 1887], [1886, 1888, 1956], [1887, 1889], [1862, 1888, 1890], [1889, 1891], [1890, 1892, 1957], [1891, 1893], [1863, 1892, 1894], [1893, 1895], [1894, 1896, 1958], [1895, 1897], [1864, 1896, 1898], [1897, 1899], [1898, 1900, 1959], [1899, 1901], [1865, 1900, 1902], [1901, 1903], [1902, 1904, 1960], [1903, 1905], [1866, 1904, 1906], [1905, 1907], [1906, 1908, 1961], [1907, 1909], [1867, 1908, 1910], [1909, 1911], [1910, 1912, 1962], [1911, 1913], [1868, 1912, 1914], [1913, 1915], [1914, 1916, 1963], [1915, 1917], [1869, 1916, 1918], [1917, 1919], [1918, 1920, 1964], [1919, 1921], [1870, 1920, 1922], [1921, 1923], [1922, 1924, 1965], [1923, 1925], [1871, 1924, 1926], [1925, 1927], [1926, 1928, 1966], [1927, 1929], [1872, 1928, 1930], [1929, 1931], [1930, 1932, 1967], [1931, 1933], [1873, 1932, 1934], [1933, 1935], [1934, 1936, 1968], [1935, 1937], [1874, 1936, 1938], [1937, 1939], [1938, 1940, 1969], [1939, 1941], [1875, 1940, 1942], [1941, 1943], [1942, 1944, 1970], [1943, 1945], [1876, 1944, 1946], [1945, 1947], [1946, 1948, 1971], [1947, 1949], [1877, 1948, 1950], [1949, 1951], [1950, 1952, 1972], [1951, 1953], [1878, 1952], [1879, 1973], [1883, 1977], [1887, 1981], [1891, 1985], [1895, 1989], [1899, 1993], [1903, 1997], [1907, 2001], [1911, 2005], [1915, 2009], [1919, 2013], [1923, 2017], [1927, 2021], [1931, 2025], [1935, 2029], [1939, 2033], [1943, 2037], [1947, 2041], [1951, 2045], [1954, 1974], [1973, 1975], [1974, 1976, 2048], [1975, 1977], [1955, 1976, 1978], [1977, 1979], [1978, 1980, 2049], [1979, 1981], [1956, 1980, 1982], [1981, 1983], [1982, 1984, 2050], [1983, 1985], [1957, 1984, 1986], [1985, 1987], [1986, 1988, 2051], [1987, 1989], [1958, 1988, 1990], [1989, 1991], [1990, 1992, 2052], [1991, 1993], [1959, 1992, 1994], [1993, 1995], [1994, 1996, 2053], [1995, 1997], [1960, 1996, 1998], [1997, 1999], [1998, 2000, 2054], [1999, 2001], [1961, 2000, 2002], [2001, 2003], [2002, 2004, 2055], [2003, 2005], [1962, 2004, 2006], [2005, 2007], [2006, 2008, 2056], [2007, 2009], [1963, 2008, 2010], [2009, 2011], [2010, 2012, 2057], [2011, 2013], [1964, 2012, 2014], [2013, 2015], [2014, 2016, 2058], [2015, 2017], [1965, 2016, 2018], [2017, 2019], [2018, 2020, 2059], [2019, 2021], [1966, 2020, 2022], [2021, 2023], [2022, 2024, 2060], [2023, 2025], [1967, 2024, 2026], [2025, 2027], [2026, 2028, 2061], [2027, 2029], [1968, 2028, 2030], [2029, 2031], [2030, 2032, 2062], [2031, 2033], [1969, 2032, 2034], [2033, 2035], [2034, 2036, 2063], [2035, 2037], [1970, 2036, 2038], [2037, 2039], [2038, 2040, 2064], [2039, 2041], [1971, 2040, 2042], [2041, 2043], [2042, 2044, 2065], [2043, 2045], [1972, 2044, 2046], [2045, 2047], [2046, 2066], [1975, 2069], [1979, 2073], [1983, 2077], [1987, 2081], [1991, 2085], [1995, 2089], [1999, 2093], [2003, 2097], [2007, 2101], [2011, 2105], [2015, 2109], [2019, 2113], [2023, 2117], [2027, 2121], [2031, 2125], [2035, 2129], [2039, 2133], [2043, 2137], [2047, 2141], [2068, 2142], [2067, 2069], [2048, 2068, 2070], [2069, 2071], [2070, 2072, 2143], [2071, 2073], [2049, 2072, 2074], [2073, 2075], [2074, 2076, 2144], [2075, 2077], [2050, 2076, 2078], [2077, 2079], [2078, 2080, 2145], [2079, 2081], [2051, 2080, 2082], [2081, 2083], [2082, 2084, 2146], [2083, 2085], [2052, 2084, 2086], [2085, 2087], [2086, 2088, 2147], [2087, 2089], [2053, 2088, 2090], [2089, 2091], [2090, 2092, 2148], [2091, 2093], [2054, 2092, 2094], [2093, 2095], [2094, 2096, 2149], [2095, 2097], [2055, 2096, 2098], [2097, 2099], [2098, 2100, 2150], [2099, 2101], [2056, 2100, 2102], [2101, 2103], [2102, 2104, 2151], [2103, 2105], [2057, 2104, 2106], [2105, 2107], [2106, 2108, 2152], [2107, 2109], [2058, 2108, 2110], [2109, 2111], [2110, 2112, 2153], [2111, 2113], [2059, 2112, 2114], [2113, 2115], [2114, 2116, 2154], [2115, 2117], [2060, 2116, 2118], [2117, 2119], [2118, 2120, 2155], [2119, 2121], [2061, 2120, 2122], [2121, 2123], [2122, 2124, 2156], [2123, 2125], [2062, 2124, 2126], [2125, 2127], [2126, 2128, 2157], [2127, 2129], [2063, 2128, 2130], [2129, 2131], [2130, 2132, 2158], [2131, 2133], [2064, 2132, 2134], [2133, 2135], [2134, 2136, 2159], [2135, 2137], [2065, 2136, 2138], [2137, 2139], [2138, 2140, 2160], [2139, 2141], [2066, 2140], [2067, 2161], [2071, 2165], [2075, 2169], [2079, 2173], [2083, 2177], [2087, 2181], [2091, 2185], [2095, 2189], [2099, 2193], [2103, 2197], [2107, 2201], [2111, 2205], [2115, 2209], [2119, 2213], [2123, 2217], [2127, 2221], [2131, 2225], [2135, 2229], [2139, 2233], [2142, 2162], [2161, 2163], [2162, 2164, 2236], [2163, 2165], [2143, 2164, 2166], [2165, 2167], [2166, 2168, 2237], [2167, 2169], [2144, 2168, 2170], [2169, 2171], [2170, 2172, 2238], [2171, 2173], [2145, 2172, 2174], [2173, 2175], [2174, 2176, 2239], [2175, 2177], [2146, 2176, 2178], [2177, 2179], [2178, 2180, 2240], [2179, 2181], [2147, 2180, 2182], [2181, 2183], [2182, 2184, 2241], [2183, 2185], [2148, 2184, 2186], [2185, 2187], [2186, 2188, 2242], [2187, 2189], [2149, 2188, 2190], [2189, 2191], [2190, 2192, 2243], [2191, 2193], [2150, 2192, 2194], [2193, 2195], [2194, 2196, 2244], [2195, 2197], [2151, 2196, 2198], [2197, 2199], [2198, 2200, 2245], [2199, 2201], [2152, 2200, 2202], [2201, 2203], [2202, 2204, 2246], [2203, 2205], [2153, 2204, 2206], [2205, 2207], [2206, 2208, 2247], [2207, 2209], [2154, 2208, 2210], [2209, 2211], [2210, 2212, 2248], [2211, 2213], [2155, 2212, 2214], [2213, 2215], [2214, 2216, 2249], [2215, 2217], [2156, 2216, 2218], [2217, 2219], [2218, 2220, 2250], [2219, 2221], [2157, 2220, 2222], [2221, 2223], [2222, 2224, 2251], [2223, 2225], [2158, 2224, 2226], [2225, 2227], [2226, 2228, 2252], [2227, 2229], [2159, 2228, 2230], [2229, 2231], [2230, 2232, 2253], [2231, 2233], [2160, 2232, 2234], [2233, 2235], [2234, 2254], [2163, 2257], [2167, 2261], [2171, 2265], [2175, 2269], [2179, 2273], [2183, 2277], [2187, 2281], [2191, 2285], [2195, 2289], [2199, 2293], [2203, 2297], [2207, 2301], [2211, 2305], [2215, 2309], [2219, 2313], [2223, 2317], [2227, 2321], [2231, 2325], [2235, 2329], [2256, 2330], [2255, 2257], [2236, 2256, 2258], [2257, 2259], [2258, 2260, 2331], [2259, 2261], [2237, 2260, 2262], [2261, 2263], [2262, 2264, 2332], [2263, 2265], [2238, 2264, 2266], [2265, 2267], [2266, 2268, 2333], [2267, 2269], [2239, 2268, 2270], [2269, 2271], [2270, 2272, 2334], [2271, 2273], [2240, 2272, 2274], [2273, 2275], [2274, 2276, 2335], [2275, 2277], [2241, 2276, 2278], [2277, 2279], [2278, 2280, 2336], [2279, 2281], [2242, 2280, 2282], [2281, 2283], [2282, 2284, 2337], [2283, 2285], [2243, 2284, 2286], [2285, 2287], [2286, 2288, 2338], [2287, 2289], [2244, 2288, 2290], [2289, 2291], [2290, 2292, 2339], [2291, 2293], [2245, 2292, 2294], [2293, 2295], [2294, 2296, 2340], [2295, 2297], [2246, 2296, 2298], [2297, 2299], [2298, 2300, 2341], [2299, 2301], [2247, 2300, 2302], [2301, 2303], [2302, 2304, 2342], [2303, 2305], [2248, 2304, 2306], [2305, 2307], [2306, 2308, 2343], [2307, 2309], [2249, 2308, 2310], [2309, 2311], [2310, 2312, 2344], [2311, 2313], [2250, 2312, 2314], [2313, 2315], [2314, 2316, 2345], [2315, 2317], [2251, 2316, 2318], [2317, 2319], [2318, 2320, 2346], [2319, 2321], [2252, 2320, 2322], [2321, 2323], [2322, 2324, 2347], [2323, 2325], [2253, 2324, 2326], [2325, 2327], [2326, 2328, 2348], [2327, 2329], [2254, 2328], [2255, 2349], [2259, 2353], [2263, 2357], [2267, 2361], [2271, 2365], [2275, 2369], [2279, 2373], [2283, 2377], [2287, 2381], [2291, 2385], [2295, 2389], [2299, 2393], [2303, 2397], [2307, 2401], [2311, 2405], [2315, 2409], [2319, 2413], [2323, 2417], [2327, 2421], [2330, 2350], [2349, 2351], [2350, 2352, 2424], [2351, 2353], [2331, 2352, 2354], [2353, 2355], [2354, 2356, 2425], [2355, 2357], [2332, 2356, 2358], [2357, 2359], [2358, 2360, 2426], [2359, 2361], [2333, 2360, 2362], [2361, 2363], [2362, 2364, 2427], [2363, 2365], [2334, 2364, 2366], [2365, 2367], [2366, 2368, 2428], [2367, 2369], [2335, 2368, 2370], [2369, 2371], [2370, 2372, 2429], [2371, 2373], [2336, 2372, 2374], [2373, 2375], [2374, 2376, 2430], [2375, 2377], [2337, 2376, 2378], [2377, 2379], [2378, 2380, 2431], [2379, 2381], [2338, 2380, 2382], [2381, 2383], [2382, 2384, 2432], [2383, 2385], [2339, 2384, 2386], [2385, 2387], [2386, 2388, 2433], [2387, 2389], [2340, 2388, 2390], [2389, 2391], [2390, 2392, 2434], [2391, 2393], [2341, 2392, 2394], [2393, 2395], [2394, 2396, 2435], [2395, 2397], [2342, 2396, 2398], [2397, 2399], [2398, 2400, 2436], [2399, 2401], [2343, 2400, 2402], [2401, 2403], [2402, 2404, 2437], [2403, 2405], [2344, 2404, 2406], [2405, 2407], [2406, 2408, 2438], [2407, 2409], [2345, 2408, 2410], [2409, 2411], [2410, 2412, 2439], [2411, 2413], [2346, 2412, 2414], [2413, 2415], [2414, 2416, 2440], [2415, 2417], [2347, 2416, 2418], [2417, 2419], [2418, 2420, 2441], [2419, 2421], [2348, 2420, 2422], [2421, 2423], [2422, 2442], [2351, 2445], [2355, 2449], [2359, 2453], [2363, 2457], [2367, 2461], [2371, 2465], [2375, 2469], [2379, 2473], [2383, 2477], [2387, 2481], [2391, 2485], [2395, 2489], [2399, 2493], [2403, 2497], [2407, 2501], [2411, 2505], [2415, 2509], [2419, 2513], [2423, 2517], [2444, 2518], [2443, 2445], [2424, 2444, 2446], [2445, 2447], [2446, 2448, 2519], [2447, 2449], [2425, 2448, 2450], [2449, 2451], [2450, 2452, 2520], [2451, 2453], [2426, 2452, 2454], [2453, 2455], [2454, 2456, 2521], [2455, 2457], [2427, 2456, 2458], [2457, 2459], [2458, 2460, 2522], [2459, 2461], [2428, 2460, 2462], [2461, 2463], [2462, 2464, 2523], [2463, 2465], [2429, 2464, 2466], [2465, 2467], [2466, 2468, 2524], [2467, 2469], [2430, 2468, 2470], [2469, 2471], [2470, 2472, 2525], [2471, 2473], [2431, 2472, 2474], [2473, 2475], [2474, 2476, 2526], [2475, 2477], [2432, 2476, 2478], [2477, 2479], [2478, 2480, 2527], [2479, 2481], [2433, 2480, 2482], [2481, 2483], [2482, 2484, 2528], [2483, 2485], [2434, 2484, 2486], [2485, 2487], [2486, 2488, 2529], [2487, 2489], [2435, 2488, 2490], [2489, 2491], [2490, 2492, 2530], [2491, 2493], [2436, 2492, 2494], [2493, 2495], [2494, 2496, 2531], [2495, 2497], [2437, 2496, 2498], [2497, 2499], [2498, 2500, 2532], [2499, 2501], [2438, 2500, 2502], [2501, 2503], [2502, 2504, 2533], [2503, 2505], [2439, 2504, 2506], [2505, 2507], [2506, 2508, 2534], [2507, 2509], [2440, 2508, 2510], [2509, 2511], [2510, 2512, 2535], [2511, 2513], [2441, 2512, 2514], [2513, 2515], [2514, 2516, 2536], [2515, 2517], [2442, 2516], [2443, 2537], [2447, 2541], [2451, 2545], [2455, 2549], [2459, 2553], [2463, 2557], [2467, 2561], [2471, 2565], [2475, 2569], [2479, 2573], [2483, 2577], [2487, 2581], [2491, 2585], [2495, 2589], [2499, 2593], [2503, 2597], [2507, 2601], [2511, 2605], [2515, 2609], [2518, 2538], [2537, 2539], [2538, 2540, 2612], [2539, 2541], [2519, 2540, 2542], [2541, 2543], [2542, 2544, 2613], [2543, 2545], [2520, 2544, 2546], [2545, 2547], [2546, 2548, 2614], [2547, 2549], [2521, 2548, 2550], [2549, 2551], [2550, 2552, 2615], [2551, 2553], [2522, 2552, 2554], [2553, 2555], [2554, 2556, 2616], [2555, 2557], [2523, 2556, 2558], [2557, 2559], [2558, 2560, 2617], [2559, 2561], [2524, 2560, 2562], [2561, 2563], [2562, 2564, 2618], [2563, 2565], [2525, 2564, 2566], [2565, 2567], [2566, 2568, 2619], [2567, 2569], [2526, 2568, 2570], [2569, 2571], [2570, 2572, 2620], [2571, 2573], [2527, 2572, 2574], [2573, 2575], [2574, 2576, 2621], [2575, 2577], [2528, 2576, 2578], [2577, 2579], [2578, 2580, 2622], [2579, 2581], [2529, 2580, 2582], [2581, 2583], [2582, 2584, 2623], [2583, 2585], [2530, 2584, 2586], [2585, 2587], [2586, 2588, 2624], [2587, 2589], [2531, 2588, 2590], [2589, 2591], [2590, 2592, 2625], [2591, 2593], [2532, 2592, 2594], [2593, 2595], [2594, 2596, 2626], [2595, 2597], [2533, 2596, 2598], [2597, 2599], [2598, 2600, 2627], [2599, 2601], [2534, 2600, 2602], [2601, 2603], [2602, 2604, 2628], [2603, 2605], [2535, 2604, 2606], [2605, 2607], [2606, 2608, 2629], [2607, 2609], [2536, 2608, 2610], [2609, 2611], [2610, 2630], [2539, 2633], [2543, 2637], [2547, 2641], [2551, 2645], [2555, 2649], [2559, 2653], [2563, 2657], [2567, 2661], [2571, 2665], [2575, 2669], [2579, 2673], [2583, 2677], [2587, 2681], [2591, 2685], [2595, 2689], [2599, 2693], [2603, 2697], [2607, 2701], [2611, 2705], [2632, 2706], [2631, 2633], [2612, 2632, 2634], [2633, 2635], [2634, 2636, 2707], [2635, 2637], [2613, 2636, 2638], [2637, 2639], [2638, 2640, 2708], [2639, 2641], [2614, 2640, 2642], [2641, 2643], [2642, 2644, 2709], [2643, 2645], [2615, 2644, 2646], [2645, 2647], [2646, 2648, 2710], [2647, 2649], [2616, 2648, 2650], [2649, 2651], [2650, 2652, 2711], [2651, 2653], [2617, 2652, 2654], [2653, 2655], [2654, 2656, 2712], [2655, 2657], [2618, 2656, 2658], [2657, 2659], [2658, 2660, 2713], [2659, 2661], [2619, 2660, 2662], [2661, 2663], [2662, 2664, 2714], [2663, 2665], [2620, 2664, 2666], [2665, 2667], [2666, 2668, 2715], [2667, 2669], [2621, 2668, 2670], [2669, 2671], [2670, 2672, 2716], [2671, 2673], [2622, 2672, 2674], [2673, 2675], [2674, 2676, 2717], [2675, 2677], [2623, 2676, 2678], [2677, 2679], [2678, 2680, 2718], [2679, 2681], [2624, 2680, 2682], [2681, 2683], [2682, 2684, 2719], [2683, 2685], [2625, 2684, 2686], [2685, 2687], [2686, 2688, 2720], [2687, 2689], [2626, 2688, 2690], [2689, 2691], [2690, 2692, 2721], [2691, 2693], [2627, 2692, 2694], [2693, 2695], [2694, 2696, 2722], [2695, 2697], [2628, 2696, 2698], [2697, 2699], [2698, 2700, 2723], [2699, 2701], [2629, 2700, 2702], [2701, 2703], [2702, 2704, 2724], [2703, 2705], [2630, 2704], [2631, 2725], [2635, 2729], [2639, 2733], [2643, 2737], [2647, 2741], [2651, 2745], [2655, 2749], [2659, 2753], [2663, 2757], [2667, 2761], [2671, 2765], [2675, 2769], [2679, 2773], [2683, 2777], [2687, 2781], [2691, 2785], [2695, 2789], [2699, 2793], [2703, 2797], [2706, 2726], [2725, 2727], [2726, 2728, 2800], [2727, 2729], [2707, 2728, 2730], [2729, 2731], [2730, 2732, 2801], [2731, 2733], [2708, 2732, 2734], [2733, 2735], [2734, 2736, 2802], [2735, 2737], [2709, 2736, 2738], [2737, 2739], [2738, 2740, 2803], [2739, 2741], [2710, 2740, 2742], [2741, 2743], [2742, 2744, 2804], [2743, 2745], [2711, 2744, 2746], [2745, 2747], [2746, 2748, 2805], [2747, 2749], [2712, 2748, 2750], [2749, 2751], [2750, 2752, 2806], [2751, 2753], [2713, 2752, 2754], [2753, 2755], [2754, 2756, 2807], [2755, 2757], [2714, 2756, 2758], [2757, 2759], [2758, 2760, 2808], [2759, 2761], [2715, 2760, 2762], [2761, 2763], [2762, 2764, 2809], [2763, 2765], [2716, 2764, 2766], [2765, 2767], [2766, 2768, 2810], [2767, 2769], [2717, 2768, 2770], [2769, 2771], [2770, 2772, 2811], [2771, 2773], [2718, 2772, 2774], [2773, 2775], [2774, 2776, 2812], [2775, 2777], [2719, 2776, 2778], [2777, 2779], [2778, 2780, 2813], [2779, 2781], [2720, 2780, 2782], [2781, 2783], [2782, 2784, 2814], [2783, 2785], [2721, 2784, 2786], [2785, 2787], [2786, 2788, 2815], [2787, 2789], [2722, 2788, 2790], [2789, 2791], [2790, 2792, 2816], [2791, 2793], [2723, 2792, 2794], [2793, 2795], [2794, 2796, 2817], [2795, 2797], [2724, 2796, 2798], [2797, 2799], [2798, 2818], [2727, 2821], [2731, 2825], [2735, 2829], [2739, 2833], [2743, 2837], [2747, 2841], [2751, 2845], [2755, 2849], [2759, 2853], [2763, 2857], [2767, 2861], [2771, 2865], [2775, 2869], [2779, 2873], [2783, 2877], [2787, 2881], [2791, 2885], [2795, 2889], [2799, 2893], [2820, 2894], [2819, 2821], [2800, 2820, 2822], [2821, 2823], [2822, 2824, 2895], [2823, 2825], [2801, 2824, 2826], [2825, 2827], [2826, 2828, 2896], [2827, 2829], [2802, 2828, 2830], [2829, 2831], [2830, 2832, 2897], [2831, 2833], [2803, 2832, 2834], [2833, 2835], [2834, 2836, 2898], [2835, 2837], [2804, 2836, 2838], [2837, 2839], [2838, 2840, 2899], [2839, 2841], [2805, 2840, 2842], [2841, 2843], [2842, 2844, 2900], [2843, 2845], [2806, 2844, 2846], [2845, 2847], [2846, 2848, 2901], [2847, 2849], [2807, 2848, 2850], [2849, 2851], [2850, 2852, 2902], [2851, 2853], [2808, 2852, 2854], [2853, 2855], [2854, 2856, 2903], [2855, 2857], [2809, 2856, 2858], [2857, 2859], [2858, 2860, 2904], [2859, 2861], [2810, 2860, 2862], [2861, 2863], [2862, 2864, 2905], [2863, 2865], [2811, 2864, 2866], [2865, 2867], [2866, 2868, 2906], [2867, 2869], [2812, 2868, 2870], [2869, 2871], [2870, 2872, 2907], [2871, 2873], [2813, 2872, 2874], [2873, 2875], [2874, 2876, 2908], [2875, 2877], [2814, 2876, 2878], [2877, 2879], [2878, 2880, 2909], [2879, 2881], [2815, 2880, 2882], [2881, 2883], [2882, 2884, 2910], [2883, 2885], [2816, 2884, 2886], [2885, 2887], [2886, 2888, 2911], [2887, 2889], [2817, 2888, 2890], [2889, 2891], [2890, 2892, 2912], [2891, 2893], [2818, 2892], [2819, 2913], [2823, 2917], [2827, 2921], [2831, 2925], [2835, 2929], [2839, 2933], [2843, 2937], [2847, 2941], [2851, 2945], [2855, 2949], [2859, 2953], [2863, 2957], [2867, 2961], [2871, 2965], [2875, 2969], [2879, 2973], [2883, 2977], [2887, 2981], [2891, 2985], [2894, 2914], [2913, 2915], [2914, 2916, 2988], [2915, 2917], [2895, 2916, 2918], [2917, 2919], [2918, 2920, 2989], [2919, 2921], [2896, 2920, 2922], [2921, 2923], [2922, 2924, 2990], [2923, 2925], [2897, 2924, 2926], [2925, 2927], [2926, 2928, 2991], [2927, 2929], [2898, 2928, 2930], [2929, 2931], [2930, 2932, 2992], [2931, 2933], [2899, 2932, 2934], [2933, 2935], [2934, 2936, 2993], [2935, 2937], [2900, 2936, 2938], [2937, 2939], [2938, 2940, 2994], [2939, 2941], [2901, 2940, 2942], [2941, 2943], [2942, 2944, 2995], [2943, 2945], [2902, 2944, 2946], [2945, 2947], [2946, 2948, 2996], [2947, 2949], [2903, 2948, 2950], [2949, 2951], [2950, 2952, 2997], [2951, 2953], [2904, 2952, 2954], [2953, 2955], [2954, 2956, 2998], [2955, 2957], [2905, 2956, 2958], [2957, 2959], [2958, 2960, 2999], [2959, 2961], [2906, 2960, 2962], [2961, 2963], [2962, 2964, 3000], [2963, 2965], [2907, 2964, 2966], [2965, 2967], [2966, 2968, 3001], [2967, 2969], [2908, 2968, 2970], [2969, 2971], [2970, 2972, 3002], [2971, 2973], [2909, 2972, 2974], [2973, 2975], [2974, 2976, 3003], [2975, 2977], [2910, 2976, 2978], [2977, 2979], [2978, 2980, 3004], [2979, 2981], [2911, 2980, 2982], [2981, 2983], [2982, 2984, 3005], [2983, 2985], [2912, 2984, 2986], [2985, 2987], [2986, 3006], [2915, 3009], [2919, 3013], [2923, 3017], [2927, 3021], [2931, 3025], [2935, 3029], [2939, 3033], [2943, 3037], [2947, 3041], [2951, 3045], [2955, 3049], [2959, 3053], [2963, 3057], [2967, 3061], [2971, 3065], [2975, 3069], [2979, 3073], [2983, 3077], [2987, 3081], [3008, 3082], [3007, 3009], [2988, 3008, 3010], [3009, 3011], [3010, 3012, 3083], [3011, 3013], [2989, 3012, 3014], [3013, 3015], [3014, 3016, 3084], [3015, 3017], [2990, 3016, 3018], [3017, 3019], [3018, 3020, 3085], [3019, 3021], [2991, 3020, 3022], [3021, 3023], [3022, 3024, 3086], [3023, 3025], [2992, 3024, 3026], [3025, 3027], [3026, 3028, 3087], [3027, 3029], [2993, 3028, 3030], [3029, 3031], [3030, 3032, 3088], [3031, 3033], [2994, 3032, 3034], [3033, 3035], [3034, 3036, 3089], [3035, 3037], [2995, 3036, 3038], [3037, 3039], [3038, 3040, 3090], [3039, 3041], [2996, 3040, 3042], [3041, 3043], [3042, 3044, 3091], [3043, 3045], [2997, 3044, 3046], [3045, 3047], [3046, 3048, 3092], [3047, 3049], [2998, 3048, 3050], [3049, 3051], [3050, 3052, 3093], [3051, 3053], [2999, 3052, 3054], [3053, 3055], [3054, 3056, 3094], [3055, 3057], [3000, 3056, 3058], [3057, 3059], [3058, 3060, 3095], [3059, 3061], [3001, 3060, 3062], [3061, 3063], [3062, 3064, 3096], [3063, 3065], [3002, 3064, 3066], [3065, 3067], [3066, 3068, 3097], [3067, 3069], [3003, 3068, 3070], [3069, 3071], [3070, 3072, 3098], [3071, 3073], [3004, 3072, 3074], [3073, 3075], [3074, 3076, 3099], [3075, 3077], [3005, 3076, 3078], [3077, 3079], [3078, 3080, 3100], [3079, 3081], [3006, 3080], [3007, 3101], [3011, 3105], [3015, 3109], [3019, 3113], [3023, 3117], [3027, 3121], [3031, 3125], [3035, 3129], [3039, 3133], [3043, 3137], [3047, 3141], [3051, 3145], [3055, 3149], [3059, 3153], [3063, 3157], [3067, 3161], [3071, 3165], [3075, 3169], [3079, 3173], [3082, 3102], [3101, 3103], [3102, 3104, 3176], [3103, 3105], [3083, 3104, 3106], [3105, 3107], [3106, 3108, 3177], [3107, 3109], [3084, 3108, 3110], [3109, 3111], [3110, 3112, 3178], [3111, 3113], [3085, 3112, 3114], [3113, 3115], [3114, 3116, 3179], [3115, 3117], [3086, 3116, 3118], [3117, 3119], [3118, 3120, 3180], [3119, 3121], [3087, 3120, 3122], [3121, 3123], [3122, 3124, 3181], [3123, 3125], [3088, 3124, 3126], [3125, 3127], [3126, 3128, 3182], [3127, 3129], [3089, 3128, 3130], [3129, 3131], [3130, 3132, 3183], [3131, 3133], [3090, 3132, 3134], [3133, 3135], [3134, 3136, 3184], [3135, 3137], [3091, 3136, 3138], [3137, 3139], [3138, 3140, 3185], [3139, 3141], [3092, 3140, 3142], [3141, 3143], [3142, 3144, 3186], [3143, 3145], [3093, 3144, 3146], [3145, 3147], [3146, 3148, 3187], [3147, 3149], [3094, 3148, 3150], [3149, 3151], [3150, 3152, 3188], [3151, 3153], [3095, 3152, 3154], [3153, 3155], [3154, 3156, 3189], [3155, 3157], [3096, 3156, 3158], [3157, 3159], [3158, 3160, 3190], [3159, 3161], [3097, 3160, 3162], [3161, 3163], [3162, 3164, 3191], [3163, 3165], [3098, 3164, 3166], [3165, 3167], [3166, 3168, 3192], [3167, 3169], [3099, 3168, 3170], [3169, 3171], [3170, 3172, 3193], [3171, 3173], [3100, 3172, 3174], [3173, 3175], [3174, 3194], [3103, 3197], [3107, 3201], [3111, 3205], [3115, 3209], [3119, 3213], [3123, 3217], [3127, 3221], [3131, 3225], [3135, 3229], [3139, 3233], [3143, 3237], [3147, 3241], [3151, 3245], [3155, 3249], [3159, 3253], [3163, 3257], [3167, 3261], [3171, 3265], [3175, 3269], [3196, 3270], [3195, 3197], [3176, 3196, 3198], [3197, 3199], [3198, 3200, 3271], [3199, 3201], [3177, 3200, 3202], [3201, 3203], [3202, 3204, 3272], [3203, 3205], [3178, 3204, 3206], [3205, 3207], [3206, 3208, 3273], [3207, 3209], [3179, 3208, 3210], [3209, 3211], [3210, 3212, 3274], [3211, 3213], [3180, 3212, 3214], [3213, 3215], [3214, 3216, 3275], [3215, 3217], [3181, 3216, 3218], [3217, 3219], [3218, 3220, 3276], [3219, 3221], [3182, 3220, 3222], [3221, 3223], [3222, 3224, 3277], [3223, 3225], [3183, 3224, 3226], [3225, 3227], [3226, 3228, 3278], [3227, 3229], [3184, 3228, 3230], [3229, 3231], [3230, 3232, 3279], [3231, 3233], [3185, 3232, 3234], [3233, 3235], [3234, 3236, 3280], [3235, 3237], [3186, 3236, 3238], [3237, 3239], [3238, 3240, 3281], [3239, 3241], [3187, 3240, 3242], [3241, 3243], [3242, 3244, 3282], [3243, 3245], [3188, 3244, 3246], [3245, 3247], [3246, 3248, 3283], [3247, 3249], [3189, 3248, 3250], [3249, 3251], [3250, 3252, 3284], [3251, 3253], [3190, 3252, 3254], [3253, 3255], [3254, 3256, 3285], [3255, 3257], [3191, 3256, 3258], [3257, 3259], [3258, 3260, 3286], [3259, 3261], [3192, 3260, 3262], [3261, 3263], [3262, 3264, 3287], [3263, 3265], [3193, 3264, 3266], [3265, 3267], [3266, 3268, 3288], [3267, 3269], [3194, 3268], [3195, 3289], [3199, 3293], [3203, 3297], [3207, 3301], [3211, 3305], [3215, 3309], [3219, 3313], [3223, 3317], [3227, 3321], [3231, 3325], [3235, 3329], [3239, 3333], [3243, 3337], [3247, 3341], [3251, 3345], [3255, 3349], [3259, 3353], [3263, 3357], [3267, 3361], [3270, 3290], [3289, 3291], [3290, 3292, 3364], [3291, 3293], [3271, 3292, 3294], [3293, 3295], [3294, 3296, 3365], [3295, 3297], [3272, 3296, 3298], [3297, 3299], [3298, 3300, 3366], [3299, 3301], [3273, 3300, 3302], [3301, 3303], [3302, 3304, 3367], [3303, 3305], [3274, 3304, 3306], [3305, 3307], [3306, 3308, 3368], [3307, 3309], [3275, 3308, 3310], [3309, 3311], [3310, 3312, 3369], [3311, 3313], [3276, 3312, 3314], [3313, 3315], [3314, 3316, 3370], [3315, 3317], [3277, 3316, 3318], [3317, 3319], [3318, 3320, 3371], [3319, 3321], [3278, 3320, 3322], [3321, 3323], [3322, 3324, 3372], [3323, 3325], [3279, 3324, 3326], [3325, 3327], [3326, 3328, 3373], [3327, 3329], [3280, 3328, 3330], [3329, 3331], [3330, 3332, 3374], [3331, 3333], [3281, 3332, 3334], [3333, 3335], [3334, 3336, 3375], [3335, 3337], [3282, 3336, 3338], [3337, 3339], [3338, 3340, 3376], [3339, 3341], [3283, 3340, 3342], [3341, 3343], [3342, 3344, 3377], [3343, 3345], [3284, 3344, 3346], [3345, 3347], [3346, 3348, 3378], [3347, 3349], [3285, 3348, 3350], [3349, 3351], [3350, 3352, 3379], [3351, 3353], [3286, 3352, 3354], [3353, 3355], [3354, 3356, 3380], [3355, 3357], [3287, 3356, 3358], [3357, 3359], [3358, 3360, 3381], [3359, 3361], [3288, 3360, 3362], [3361, 3363], [3362, 3382], [3291, 3384], [3295, 3388], [3299, 3392], [3303, 3396], [3307, 3400], [3311, 3404], [3315, 3408], [3319, 3412], [3323, 3416], [3327, 3420], [3331, 3424], [3335, 3428], [3339, 3432], [3343, 3436], [3347, 3440], [3351, 3444], [3355, 3448], [3359, 3452], [3363, 3456], [3384], [3364, 3383, 3385], [3384, 3386], [3385, 3387], [3386, 3388], [3365, 3387, 3389], [3388, 3390], [3389, 3391], [3390, 3392], [3366, 3391, 3393], [3392, 3394], [3393, 3395], [3394, 3396], [3367, 3395, 3397], [3396, 3398], [3397, 3399], [3398, 3400], [3368, 3399, 3401], [3400, 3402], [3401, 3403], [3402, 3404], [3369, 3403, 3405], [3404, 3406], [3405, 3407], [3406, 3408], [3370, 3407, 3409], [3408, 3410], [3409, 3411], [3410, 3412], [3371, 3411, 3413], [3412, 3414], [3413, 3415], [3414, 3416], [3372, 3415, 3417], [3416, 3418], [3417, 3419], [3418, 3420], [3373, 3419, 3421], [3420, 3422], [3421, 3423], [3422, 3424], [3374, 3423, 3425], [3424, 3426], [3425, 3427], [3426, 3428], [3375, 3427, 3429], [3428, 3430], [3429, 3431], [3430, 3432], [3376, 3431, 3433], [3432, 3434], [3433, 3435], [3434, 3436], [3377, 3435, 3437], [3436, 3438], [3437, 3439], [3438, 3440], [3378, 3439, 3441], [3440, 3442], [3441, 3443], [3442, 3444], [3379, 3443, 3445], [3444, 3446], [3445, 3447], [3446, 3448], [3380, 3447, 3449], [3448, 3450], [3449, 3451], [3450, 3452], [3381, 3451, 3453], [3452, 3454], [3453, 3455], [3454, 3456], [3382, 3455]] -CNOTTIME: [[1, 74], [0, 2], [1, 3], [2, 4], [3, 5, 75], [4, 6], [5, 7], [6, 8], [7, 9, 76], [8, 10], [9, 11], [10, 12], [11, 13, 77], [12, 14], [13, 15], [14, 16], [15, 17, 78], [16, 18], [17, 19], [18, 20], [19, 21, 79], [20, 22], [21, 23], [22, 24], [23, 25, 80], [24, 26], [25, 27], [26, 28], [27, 29, 81], [28, 30], [29, 31], [30, 32], [31, 33, 82], [32, 34], [33, 35], [34, 36], [35, 37, 83], [36, 38], [37, 39], [38, 40], [39, 41, 84], [40, 42], [41, 43], [42, 44], [43, 45, 85], [44, 46], [45, 47], [46, 48], [47, 49, 86], [48, 50], [49, 51], [50, 52], [51, 53, 87], [52, 54], [53, 55], [54, 56], [55, 57, 88], [56, 58], [57, 59], [58, 60], [59, 61, 89], [60, 62], [61, 63], [62, 64], [63, 65, 90], [64, 66], [65, 67], [66, 68], [67, 69, 91], [68, 70], [69, 71], [70, 72], [71, 73, 92], [72], [0, 93], [4, 97], [8, 101], [12, 105], [16, 109], [20, 113], [24, 117], [28, 121], [32, 125], [36, 129], [40, 133], [44, 137], [48, 141], [52, 145], [56, 149], [60, 153], [64, 157], [68, 161], [72, 165], [74, 94], [93, 95], [94, 96, 168], [95, 97], [75, 96, 98], [97, 99], [98, 100, 169], [99, 101], [76, 100, 102], [101, 103], [102, 104, 170], [103, 105], [77, 104, 106], [105, 107], [106, 108, 171], [107, 109], [78, 108, 110], [109, 111], [110, 112, 172], [111, 113], [79, 112, 114], [113, 115], [114, 116, 173], [115, 117], [80, 116, 118], [117, 119], [118, 120, 174], [119, 121], [81, 120, 122], [121, 123], [122, 124, 175], [123, 125], [82, 124, 126], [125, 127], [126, 128, 176], [127, 129], [83, 128, 130], [129, 131], [130, 132, 177], [131, 133], [84, 132, 134], [133, 135], [134, 136, 178], [135, 137], [85, 136, 138], [137, 139], [138, 140, 179], [139, 141], [86, 140, 142], [141, 143], [142, 144, 180], [143, 145], [87, 144, 146], [145, 147], [146, 148, 181], [147, 149], [88, 148, 150], [149, 151], [150, 152, 182], [151, 153], [89, 152, 154], [153, 155], [154, 156, 183], [155, 157], [90, 156, 158], [157, 159], [158, 160, 184], [159, 161], [91, 160, 162], [161, 163], [162, 164, 185], [163, 165], [92, 164, 166], [165, 167], [166, 186], [95, 189], [99, 193], [103, 197], [107, 201], [111, 205], [115, 209], [119, 213], [123, 217], [127, 221], [131, 225], [135, 229], [139, 233], [143, 237], [147, 241], [151, 245], [155, 249], [159, 253], [163, 257], [167, 261], [188, 262], [187, 189], [168, 188, 190], [189, 191], [190, 192, 263], [191, 193], [169, 192, 194], [193, 195], [194, 196, 264], [195, 197], [170, 196, 198], [197, 199], [198, 200, 265], [199, 201], [171, 200, 202], [201, 203], [202, 204, 266], [203, 205], [172, 204, 206], [205, 207], [206, 208, 267], [207, 209], [173, 208, 210], [209, 211], [210, 212, 268], [211, 213], [174, 212, 214], [213, 215], [214, 216, 269], [215, 217], [175, 216, 218], [217, 219], [218, 220, 270], [219, 221], [176, 220, 222], [221, 223], [222, 224, 271], [223, 225], [177, 224, 226], [225, 227], [226, 228, 272], [227, 229], [178, 228, 230], [229, 231], [230, 232, 273], [231, 233], [179, 232, 234], [233, 235], [234, 236, 274], [235, 237], [180, 236, 238], [237, 239], [238, 240, 275], [239, 241], [181, 240, 242], [241, 243], [242, 244, 276], [243, 245], [182, 244, 246], [245, 247], [246, 248, 277], [247, 249], [183, 248, 250], [249, 251], [250, 252, 278], [251, 253], [184, 252, 254], [253, 255], [254, 256, 279], [255, 257], [185, 256, 258], [257, 259], [258, 260, 280], [259, 261], [186, 260], [187, 281], [191, 285], [195, 289], [199, 293], [203, 297], [207, 301], [211, 305], [215, 309], [219, 313], [223, 317], [227, 321], [231, 325], [235, 329], [239, 333], [243, 337], [247, 341], [251, 345], [255, 349], [259, 353], [262, 282], [281, 283], [282, 284, 356], [283, 285], [263, 284, 286], [285, 287], [286, 288, 357], [287, 289], [264, 288, 290], [289, 291], [290, 292, 358], [291, 293], [265, 292, 294], [293, 295], [294, 296, 359], [295, 297], [266, 296, 298], [297, 299], [298, 300, 360], [299, 301], [267, 300, 302], [301, 303], [302, 304, 361], [303, 305], [268, 304, 306], [305, 307], [306, 308, 362], [307, 309], [269, 308, 310], [309, 311], [310, 312, 363], [311, 313], [270, 312, 314], [313, 315], [314, 316, 364], [315, 317], [271, 316, 318], [317, 319], [318, 320, 365], [319, 321], [272, 320, 322], [321, 323], [322, 324, 366], [323, 325], [273, 324, 326], [325, 327], [326, 328, 367], [327, 329], [274, 328, 330], [329, 331], [330, 332, 368], [331, 333], [275, 332, 334], [333, 335], [334, 336, 369], [335, 337], [276, 336, 338], [337, 339], [338, 340, 370], [339, 341], [277, 340, 342], [341, 343], [342, 344, 371], [343, 345], [278, 344, 346], [345, 347], [346, 348, 372], [347, 349], [279, 348, 350], [349, 351], [350, 352, 373], [351, 353], [280, 352, 354], [353, 355], [354, 374], [283, 377], [287, 381], [291, 385], [295, 389], [299, 393], [303, 397], [307, 401], [311, 405], [315, 409], [319, 413], [323, 417], [327, 421], [331, 425], [335, 429], [339, 433], [343, 437], [347, 441], [351, 445], [355, 449], [376, 450], [375, 377], [356, 376, 378], [377, 379], [378, 380, 451], [379, 381], [357, 380, 382], [381, 383], [382, 384, 452], [383, 385], [358, 384, 386], [385, 387], [386, 388, 453], [387, 389], [359, 388, 390], [389, 391], [390, 392, 454], [391, 393], [360, 392, 394], [393, 395], [394, 396, 455], [395, 397], [361, 396, 398], [397, 399], [398, 400, 456], [399, 401], [362, 400, 402], [401, 403], [402, 404, 457], [403, 405], [363, 404, 406], [405, 407], [406, 408, 458], [407, 409], [364, 408, 410], [409, 411], [410, 412, 459], [411, 413], [365, 412, 414], [413, 415], [414, 416, 460], [415, 417], [366, 416, 418], [417, 419], [418, 420, 461], [419, 421], [367, 420, 422], [421, 423], [422, 424, 462], [423, 425], [368, 424, 426], [425, 427], [426, 428, 463], [427, 429], [369, 428, 430], [429, 431], [430, 432, 464], [431, 433], [370, 432, 434], [433, 435], [434, 436, 465], [435, 437], [371, 436, 438], [437, 439], [438, 440, 466], [439, 441], [372, 440, 442], [441, 443], [442, 444, 467], [443, 445], [373, 444, 446], [445, 447], [446, 448, 468], [447, 449], [374, 448], [375, 469], [379, 473], [383, 477], [387, 481], [391, 485], [395, 489], [399, 493], [403, 497], [407, 501], [411, 505], [415, 509], [419, 513], [423, 517], [427, 521], [431, 525], [435, 529], [439, 533], [443, 537], [447, 541], [450, 470], [469, 471], [470, 472, 544], [471, 473], [451, 472, 474], [473, 475], [474, 476, 545], [475, 477], [452, 476, 478], [477, 479], [478, 480, 546], [479, 481], [453, 480, 482], [481, 483], [482, 484, 547], [483, 485], [454, 484, 486], [485, 487], [486, 488, 548], [487, 489], [455, 488, 490], [489, 491], [490, 492, 549], [491, 493], [456, 492, 494], [493, 495], [494, 496, 550], [495, 497], [457, 496, 498], [497, 499], [498, 500, 551], [499, 501], [458, 500, 502], [501, 503], [502, 504, 552], [503, 505], [459, 504, 506], [505, 507], [506, 508, 553], [507, 509], [460, 508, 510], [509, 511], [510, 512, 554], [511, 513], [461, 512, 514], [513, 515], [514, 516, 555], [515, 517], [462, 516, 518], [517, 519], [518, 520, 556], [519, 521], [463, 520, 522], [521, 523], [522, 524, 557], [523, 525], [464, 524, 526], [525, 527], [526, 528, 558], [527, 529], [465, 528, 530], [529, 531], [530, 532, 559], [531, 533], [466, 532, 534], [533, 535], [534, 536, 560], [535, 537], [467, 536, 538], [537, 539], [538, 540, 561], [539, 541], [468, 540, 542], [541, 543], [542, 562], [471, 565], [475, 569], [479, 573], [483, 577], [487, 581], [491, 585], [495, 589], [499, 593], [503, 597], [507, 601], [511, 605], [515, 609], [519, 613], [523, 617], [527, 621], [531, 625], [535, 629], [539, 633], [543, 637], [564, 638], [563, 565], [544, 564, 566], [565, 567], [566, 568, 639], [567, 569], [545, 568, 570], [569, 571], [570, 572, 640], [571, 573], [546, 572, 574], [573, 575], [574, 576, 641], [575, 577], [547, 576, 578], [577, 579], [578, 580, 642], [579, 581], [548, 580, 582], [581, 583], [582, 584, 643], [583, 585], [549, 584, 586], [585, 587], [586, 588, 644], [587, 589], [550, 588, 590], [589, 591], [590, 592, 645], [591, 593], [551, 592, 594], [593, 595], [594, 596, 646], [595, 597], [552, 596, 598], [597, 599], [598, 600, 647], [599, 601], [553, 600, 602], [601, 603], [602, 604, 648], [603, 605], [554, 604, 606], [605, 607], [606, 608, 649], [607, 609], [555, 608, 610], [609, 611], [610, 612, 650], [611, 613], [556, 612, 614], [613, 615], [614, 616, 651], [615, 617], [557, 616, 618], [617, 619], [618, 620, 652], [619, 621], [558, 620, 622], [621, 623], [622, 624, 653], [623, 625], [559, 624, 626], [625, 627], [626, 628, 654], [627, 629], [560, 628, 630], [629, 631], [630, 632, 655], [631, 633], [561, 632, 634], [633, 635], [634, 636, 656], [635, 637], [562, 636], [563, 657], [567, 661], [571, 665], [575, 669], [579, 673], [583, 677], [587, 681], [591, 685], [595, 689], [599, 693], [603, 697], [607, 701], [611, 705], [615, 709], [619, 713], [623, 717], [627, 721], [631, 725], [635, 729], [638, 658], [657, 659], [658, 660, 732], [659, 661], [639, 660, 662], [661, 663], [662, 664, 733], [663, 665], [640, 664, 666], [665, 667], [666, 668, 734], [667, 669], [641, 668, 670], [669, 671], [670, 672, 735], [671, 673], [642, 672, 674], [673, 675], [674, 676, 736], [675, 677], [643, 676, 678], [677, 679], [678, 680, 737], [679, 681], [644, 680, 682], [681, 683], [682, 684, 738], [683, 685], [645, 684, 686], [685, 687], [686, 688, 739], [687, 689], [646, 688, 690], [689, 691], [690, 692, 740], [691, 693], [647, 692, 694], [693, 695], [694, 696, 741], [695, 697], [648, 696, 698], [697, 699], [698, 700, 742], [699, 701], [649, 700, 702], [701, 703], [702, 704, 743], [703, 705], [650, 704, 706], [705, 707], [706, 708, 744], [707, 709], [651, 708, 710], [709, 711], [710, 712, 745], [711, 713], [652, 712, 714], [713, 715], [714, 716, 746], [715, 717], [653, 716, 718], [717, 719], [718, 720, 747], [719, 721], [654, 720, 722], [721, 723], [722, 724, 748], [723, 725], [655, 724, 726], [725, 727], [726, 728, 749], [727, 729], [656, 728, 730], [729, 731], [730, 750], [659, 753], [663, 757], [667, 761], [671, 765], [675, 769], [679, 773], [683, 777], [687, 781], [691, 785], [695, 789], [699, 793], [703, 797], [707, 801], [711, 805], [715, 809], [719, 813], [723, 817], [727, 821], [731, 825], [752, 826], [751, 753], [732, 752, 754], [753, 755], [754, 756, 827], [755, 757], [733, 756, 758], [757, 759], [758, 760, 828], [759, 761], [734, 760, 762], [761, 763], [762, 764, 829], [763, 765], [735, 764, 766], [765, 767], [766, 768, 830], [767, 769], [736, 768, 770], [769, 771], [770, 772, 831], [771, 773], [737, 772, 774], [773, 775], [774, 776, 832], [775, 777], [738, 776, 778], [777, 779], [778, 780, 833], [779, 781], [739, 780, 782], [781, 783], [782, 784, 834], [783, 785], [740, 784, 786], [785, 787], [786, 788, 835], [787, 789], [741, 788, 790], [789, 791], [790, 792, 836], [791, 793], [742, 792, 794], [793, 795], [794, 796, 837], [795, 797], [743, 796, 798], [797, 799], [798, 800, 838], [799, 801], [744, 800, 802], [801, 803], [802, 804, 839], [803, 805], [745, 804, 806], [805, 807], [806, 808, 840], [807, 809], [746, 808, 810], [809, 811], [810, 812, 841], [811, 813], [747, 812, 814], [813, 815], [814, 816, 842], [815, 817], [748, 816, 818], [817, 819], [818, 820, 843], [819, 821], [749, 820, 822], [821, 823], [822, 824, 844], [823, 825], [750, 824], [751, 845], [755, 849], [759, 853], [763, 857], [767, 861], [771, 865], [775, 869], [779, 873], [783, 877], [787, 881], [791, 885], [795, 889], [799, 893], [803, 897], [807, 901], [811, 905], [815, 909], [819, 913], [823, 917], [826, 846], [845, 847], [846, 848, 920], [847, 849], [827, 848, 850], [849, 851], [850, 852, 921], [851, 853], [828, 852, 854], [853, 855], [854, 856, 922], [855, 857], [829, 856, 858], [857, 859], [858, 860, 923], [859, 861], [830, 860, 862], [861, 863], [862, 864, 924], [863, 865], [831, 864, 866], [865, 867], [866, 868, 925], [867, 869], [832, 868, 870], [869, 871], [870, 872, 926], [871, 873], [833, 872, 874], [873, 875], [874, 876, 927], [875, 877], [834, 876, 878], [877, 879], [878, 880, 928], [879, 881], [835, 880, 882], [881, 883], [882, 884, 929], [883, 885], [836, 884, 886], [885, 887], [886, 888, 930], [887, 889], [837, 888, 890], [889, 891], [890, 892, 931], [891, 893], [838, 892, 894], [893, 895], [894, 896, 932], [895, 897], [839, 896, 898], [897, 899], [898, 900, 933], [899, 901], [840, 900, 902], [901, 903], [902, 904, 934], [903, 905], [841, 904, 906], [905, 907], [906, 908, 935], [907, 909], [842, 908, 910], [909, 911], [910, 912, 936], [911, 913], [843, 912, 914], [913, 915], [914, 916, 937], [915, 917], [844, 916, 918], [917, 919], [918, 938], [847, 941], [851, 945], [855, 949], [859, 953], [863, 957], [867, 961], [871, 965], [875, 969], [879, 973], [883, 977], [887, 981], [891, 985], [895, 989], [899, 993], [903, 997], [907, 1001], [911, 1005], [915, 1009], [919, 1013], [940, 1014], [939, 941], [920, 940, 942], [941, 943], [942, 944, 1015], [943, 945], [921, 944, 946], [945, 947], [946, 948, 1016], [947, 949], [922, 948, 950], [949, 951], [950, 952, 1017], [951, 953], [923, 952, 954], [953, 955], [954, 956, 1018], [955, 957], [924, 956, 958], [957, 959], [958, 960, 1019], [959, 961], [925, 960, 962], [961, 963], [962, 964, 1020], [963, 965], [926, 964, 966], [965, 967], [966, 968, 1021], [967, 969], [927, 968, 970], [969, 971], [970, 972, 1022], [971, 973], [928, 972, 974], [973, 975], [974, 976, 1023], [975, 977], [929, 976, 978], [977, 979], [978, 980, 1024], [979, 981], [930, 980, 982], [981, 983], [982, 984, 1025], [983, 985], [931, 984, 986], [985, 987], [986, 988, 1026], [987, 989], [932, 988, 990], [989, 991], [990, 992, 1027], [991, 993], [933, 992, 994], [993, 995], [994, 996, 1028], [995, 997], [934, 996, 998], [997, 999], [998, 1000, 1029], [999, 1001], [935, 1000, 1002], [1001, 1003], [1002, 1004, 1030], [1003, 1005], [936, 1004, 1006], [1005, 1007], [1006, 1008, 1031], [1007, 1009], [937, 1008, 1010], [1009, 1011], [1010, 1012, 1032], [1011, 1013], [938, 1012], [939, 1033], [943, 1037], [947, 1041], [951, 1045], [955, 1049], [959, 1053], [963, 1057], [967, 1061], [971, 1065], [975, 1069], [979, 1073], [983, 1077], [987, 1081], [991, 1085], [995, 1089], [999, 1093], [1003, 1097], [1007, 1101], [1011, 1105], [1014, 1034], [1033, 1035], [1034, 1036, 1108], [1035, 1037], [1015, 1036, 1038], [1037, 1039], [1038, 1040, 1109], [1039, 1041], [1016, 1040, 1042], [1041, 1043], [1042, 1044, 1110], [1043, 1045], [1017, 1044, 1046], [1045, 1047], [1046, 1048, 1111], [1047, 1049], [1018, 1048, 1050], [1049, 1051], [1050, 1052, 1112], [1051, 1053], [1019, 1052, 1054], [1053, 1055], [1054, 1056, 1113], [1055, 1057], [1020, 1056, 1058], [1057, 1059], [1058, 1060, 1114], [1059, 1061], [1021, 1060, 1062], [1061, 1063], [1062, 1064, 1115], [1063, 1065], [1022, 1064, 1066], [1065, 1067], [1066, 1068, 1116], [1067, 1069], [1023, 1068, 1070], [1069, 1071], [1070, 1072, 1117], [1071, 1073], [1024, 1072, 1074], [1073, 1075], [1074, 1076, 1118], [1075, 1077], [1025, 1076, 1078], [1077, 1079], [1078, 1080, 1119], [1079, 1081], [1026, 1080, 1082], [1081, 1083], [1082, 1084, 1120], [1083, 1085], [1027, 1084, 1086], [1085, 1087], [1086, 1088, 1121], [1087, 1089], [1028, 1088, 1090], [1089, 1091], [1090, 1092, 1122], [1091, 1093], [1029, 1092, 1094], [1093, 1095], [1094, 1096, 1123], [1095, 1097], [1030, 1096, 1098], [1097, 1099], [1098, 1100, 1124], [1099, 1101], [1031, 1100, 1102], [1101, 1103], [1102, 1104, 1125], [1103, 1105], [1032, 1104, 1106], [1105, 1107], [1106, 1126], [1035, 1129], [1039, 1133], [1043, 1137], [1047, 1141], [1051, 1145], [1055, 1149], [1059, 1153], [1063, 1157], [1067, 1161], [1071, 1165], [1075, 1169], [1079, 1173], [1083, 1177], [1087, 1181], [1091, 1185], [1095, 1189], [1099, 1193], [1103, 1197], [1107, 1201], [1128, 1202], [1127, 1129], [1108, 1128, 1130], [1129, 1131], [1130, 1132, 1203], [1131, 1133], [1109, 1132, 1134], [1133, 1135], [1134, 1136, 1204], [1135, 1137], [1110, 1136, 1138], [1137, 1139], [1138, 1140, 1205], [1139, 1141], [1111, 1140, 1142], [1141, 1143], [1142, 1144, 1206], [1143, 1145], [1112, 1144, 1146], [1145, 1147], [1146, 1148, 1207], [1147, 1149], [1113, 1148, 1150], [1149, 1151], [1150, 1152, 1208], [1151, 1153], [1114, 1152, 1154], [1153, 1155], [1154, 1156, 1209], [1155, 1157], [1115, 1156, 1158], [1157, 1159], [1158, 1160, 1210], [1159, 1161], [1116, 1160, 1162], [1161, 1163], [1162, 1164, 1211], [1163, 1165], [1117, 1164, 1166], [1165, 1167], [1166, 1168, 1212], [1167, 1169], [1118, 1168, 1170], [1169, 1171], [1170, 1172, 1213], [1171, 1173], [1119, 1172, 1174], [1173, 1175], [1174, 1176, 1214], [1175, 1177], [1120, 1176, 1178], [1177, 1179], [1178, 1180, 1215], [1179, 1181], [1121, 1180, 1182], [1181, 1183], [1182, 1184, 1216], [1183, 1185], [1122, 1184, 1186], [1185, 1187], [1186, 1188, 1217], [1187, 1189], [1123, 1188, 1190], [1189, 1191], [1190, 1192, 1218], [1191, 1193], [1124, 1192, 1194], [1193, 1195], [1194, 1196, 1219], [1195, 1197], [1125, 1196, 1198], [1197, 1199], [1198, 1200, 1220], [1199, 1201], [1126, 1200], [1127, 1221], [1131, 1225], [1135, 1229], [1139, 1233], [1143, 1237], [1147, 1241], [1151, 1245], [1155, 1249], [1159, 1253], [1163, 1257], [1167, 1261], [1171, 1265], [1175, 1269], [1179, 1273], [1183, 1277], [1187, 1281], [1191, 1285], [1195, 1289], [1199, 1293], [1202, 1222], [1221, 1223], [1222, 1224, 1296], [1223, 1225], [1203, 1224, 1226], [1225, 1227], [1226, 1228, 1297], [1227, 1229], [1204, 1228, 1230], [1229, 1231], [1230, 1232, 1298], [1231, 1233], [1205, 1232, 1234], [1233, 1235], [1234, 1236, 1299], [1235, 1237], [1206, 1236, 1238], [1237, 1239], [1238, 1240, 1300], [1239, 1241], [1207, 1240, 1242], [1241, 1243], [1242, 1244, 1301], [1243, 1245], [1208, 1244, 1246], [1245, 1247], [1246, 1248, 1302], [1247, 1249], [1209, 1248, 1250], [1249, 1251], [1250, 1252, 1303], [1251, 1253], [1210, 1252, 1254], [1253, 1255], [1254, 1256, 1304], [1255, 1257], [1211, 1256, 1258], [1257, 1259], [1258, 1260, 1305], [1259, 1261], [1212, 1260, 1262], [1261, 1263], [1262, 1264, 1306], [1263, 1265], [1213, 1264, 1266], [1265, 1267], [1266, 1268, 1307], [1267, 1269], [1214, 1268, 1270], [1269, 1271], [1270, 1272, 1308], [1271, 1273], [1215, 1272, 1274], [1273, 1275], [1274, 1276, 1309], [1275, 1277], [1216, 1276, 1278], [1277, 1279], [1278, 1280, 1310], [1279, 1281], [1217, 1280, 1282], [1281, 1283], [1282, 1284, 1311], [1283, 1285], [1218, 1284, 1286], [1285, 1287], [1286, 1288, 1312], [1287, 1289], [1219, 1288, 1290], [1289, 1291], [1290, 1292, 1313], [1291, 1293], [1220, 1292, 1294], [1293, 1295], [1294, 1314], [1223, 1317], [1227, 1321], [1231, 1325], [1235, 1329], [1239, 1333], [1243, 1337], [1247, 1341], [1251, 1345], [1255, 1349], [1259, 1353], [1263, 1357], [1267, 1361], [1271, 1365], [1275, 1369], [1279, 1373], [1283, 1377], [1287, 1381], [1291, 1385], [1295, 1389], [1316, 1390], [1315, 1317], [1296, 1316, 1318], [1317, 1319], [1318, 1320, 1391], [1319, 1321], [1297, 1320, 1322], [1321, 1323], [1322, 1324, 1392], [1323, 1325], [1298, 1324, 1326], [1325, 1327], [1326, 1328, 1393], [1327, 1329], [1299, 1328, 1330], [1329, 1331], [1330, 1332, 1394], [1331, 1333], [1300, 1332, 1334], [1333, 1335], [1334, 1336, 1395], [1335, 1337], [1301, 1336, 1338], [1337, 1339], [1338, 1340, 1396], [1339, 1341], [1302, 1340, 1342], [1341, 1343], [1342, 1344, 1397], [1343, 1345], [1303, 1344, 1346], [1345, 1347], [1346, 1348, 1398], [1347, 1349], [1304, 1348, 1350], [1349, 1351], [1350, 1352, 1399], [1351, 1353], [1305, 1352, 1354], [1353, 1355], [1354, 1356, 1400], [1355, 1357], [1306, 1356, 1358], [1357, 1359], [1358, 1360, 1401], [1359, 1361], [1307, 1360, 1362], [1361, 1363], [1362, 1364, 1402], [1363, 1365], [1308, 1364, 1366], [1365, 1367], [1366, 1368, 1403], [1367, 1369], [1309, 1368, 1370], [1369, 1371], [1370, 1372, 1404], [1371, 1373], [1310, 1372, 1374], [1373, 1375], [1374, 1376, 1405], [1375, 1377], [1311, 1376, 1378], [1377, 1379], [1378, 1380, 1406], [1379, 1381], [1312, 1380, 1382], [1381, 1383], [1382, 1384, 1407], [1383, 1385], [1313, 1384, 1386], [1385, 1387], [1386, 1388, 1408], [1387, 1389], [1314, 1388], [1315, 1409], [1319, 1413], [1323, 1417], [1327, 1421], [1331, 1425], [1335, 1429], [1339, 1433], [1343, 1437], [1347, 1441], [1351, 1445], [1355, 1449], [1359, 1453], [1363, 1457], [1367, 1461], [1371, 1465], [1375, 1469], [1379, 1473], [1383, 1477], [1387, 1481], [1390, 1410], [1409, 1411], [1410, 1412, 1484], [1411, 1413], [1391, 1412, 1414], [1413, 1415], [1414, 1416, 1485], [1415, 1417], [1392, 1416, 1418], [1417, 1419], [1418, 1420, 1486], [1419, 1421], [1393, 1420, 1422], [1421, 1423], [1422, 1424, 1487], [1423, 1425], [1394, 1424, 1426], [1425, 1427], [1426, 1428, 1488], [1427, 1429], [1395, 1428, 1430], [1429, 1431], [1430, 1432, 1489], [1431, 1433], [1396, 1432, 1434], [1433, 1435], [1434, 1436, 1490], [1435, 1437], [1397, 1436, 1438], [1437, 1439], [1438, 1440, 1491], [1439, 1441], [1398, 1440, 1442], [1441, 1443], [1442, 1444, 1492], [1443, 1445], [1399, 1444, 1446], [1445, 1447], [1446, 1448, 1493], [1447, 1449], [1400, 1448, 1450], [1449, 1451], [1450, 1452, 1494], [1451, 1453], [1401, 1452, 1454], [1453, 1455], [1454, 1456, 1495], [1455, 1457], [1402, 1456, 1458], [1457, 1459], [1458, 1460, 1496], [1459, 1461], [1403, 1460, 1462], [1461, 1463], [1462, 1464, 1497], [1463, 1465], [1404, 1464, 1466], [1465, 1467], [1466, 1468, 1498], [1467, 1469], [1405, 1468, 1470], [1469, 1471], [1470, 1472, 1499], [1471, 1473], [1406, 1472, 1474], [1473, 1475], [1474, 1476, 1500], [1475, 1477], [1407, 1476, 1478], [1477, 1479], [1478, 1480, 1501], [1479, 1481], [1408, 1480, 1482], [1481, 1483], [1482, 1502], [1411, 1505], [1415, 1509], [1419, 1513], [1423, 1517], [1427, 1521], [1431, 1525], [1435, 1529], [1439, 1533], [1443, 1537], [1447, 1541], [1451, 1545], [1455, 1549], [1459, 1553], [1463, 1557], [1467, 1561], [1471, 1565], [1475, 1569], [1479, 1573], [1483, 1577], [1504, 1578], [1503, 1505], [1484, 1504, 1506], [1505, 1507], [1506, 1508, 1579], [1507, 1509], [1485, 1508, 1510], [1509, 1511], [1510, 1512, 1580], [1511, 1513], [1486, 1512, 1514], [1513, 1515], [1514, 1516, 1581], [1515, 1517], [1487, 1516, 1518], [1517, 1519], [1518, 1520, 1582], [1519, 1521], [1488, 1520, 1522], [1521, 1523], [1522, 1524, 1583], [1523, 1525], [1489, 1524, 1526], [1525, 1527], [1526, 1528, 1584], [1527, 1529], [1490, 1528, 1530], [1529, 1531], [1530, 1532, 1585], [1531, 1533], [1491, 1532, 1534], [1533, 1535], [1534, 1536, 1586], [1535, 1537], [1492, 1536, 1538], [1537, 1539], [1538, 1540, 1587], [1539, 1541], [1493, 1540, 1542], [1541, 1543], [1542, 1544, 1588], [1543, 1545], [1494, 1544, 1546], [1545, 1547], [1546, 1548, 1589], [1547, 1549], [1495, 1548, 1550], [1549, 1551], [1550, 1552, 1590], [1551, 1553], [1496, 1552, 1554], [1553, 1555], [1554, 1556, 1591], [1555, 1557], [1497, 1556, 1558], [1557, 1559], [1558, 1560, 1592], [1559, 1561], [1498, 1560, 1562], [1561, 1563], [1562, 1564, 1593], [1563, 1565], [1499, 1564, 1566], [1565, 1567], [1566, 1568, 1594], [1567, 1569], [1500, 1568, 1570], [1569, 1571], [1570, 1572, 1595], [1571, 1573], [1501, 1572, 1574], [1573, 1575], [1574, 1576, 1596], [1575, 1577], [1502, 1576], [1503, 1597], [1507, 1601], [1511, 1605], [1515, 1609], [1519, 1613], [1523, 1617], [1527, 1621], [1531, 1625], [1535, 1629], [1539, 1633], [1543, 1637], [1547, 1641], [1551, 1645], [1555, 1649], [1559, 1653], [1563, 1657], [1567, 1661], [1571, 1665], [1575, 1669], [1578, 1598], [1597, 1599], [1598, 1600, 1672], [1599, 1601], [1579, 1600, 1602], [1601, 1603], [1602, 1604, 1673], [1603, 1605], [1580, 1604, 1606], [1605, 1607], [1606, 1608, 1674], [1607, 1609], [1581, 1608, 1610], [1609, 1611], [1610, 1612, 1675], [1611, 1613], [1582, 1612, 1614], [1613, 1615], [1614, 1616, 1676], [1615, 1617], [1583, 1616, 1618], [1617, 1619], [1618, 1620, 1677], [1619, 1621], [1584, 1620, 1622], [1621, 1623], [1622, 1624, 1678], [1623, 1625], [1585, 1624, 1626], [1625, 1627], [1626, 1628, 1679], [1627, 1629], [1586, 1628, 1630], [1629, 1631], [1630, 1632, 1680], [1631, 1633], [1587, 1632, 1634], [1633, 1635], [1634, 1636, 1681], [1635, 1637], [1588, 1636, 1638], [1637, 1639], [1638, 1640, 1682], [1639, 1641], [1589, 1640, 1642], [1641, 1643], [1642, 1644, 1683], [1643, 1645], [1590, 1644, 1646], [1645, 1647], [1646, 1648, 1684], [1647, 1649], [1591, 1648, 1650], [1649, 1651], [1650, 1652, 1685], [1651, 1653], [1592, 1652, 1654], [1653, 1655], [1654, 1656, 1686], [1655, 1657], [1593, 1656, 1658], [1657, 1659], [1658, 1660, 1687], [1659, 1661], [1594, 1660, 1662], [1661, 1663], [1662, 1664, 1688], [1663, 1665], [1595, 1664, 1666], [1665, 1667], [1666, 1668, 1689], [1667, 1669], [1596, 1668, 1670], [1669, 1671], [1670, 1690], [1599, 1693], [1603, 1697], [1607, 1701], [1611, 1705], [1615, 1709], [1619, 1713], [1623, 1717], [1627, 1721], [1631, 1725], [1635, 1729], [1639, 1733], [1643, 1737], [1647, 1741], [1651, 1745], [1655, 1749], [1659, 1753], [1663, 1757], [1667, 1761], [1671, 1765], [1692, 1766], [1691, 1693], [1672, 1692, 1694], [1693, 1695], [1694, 1696, 1767], [1695, 1697], [1673, 1696, 1698], [1697, 1699], [1698, 1700, 1768], [1699, 1701], [1674, 1700, 1702], [1701, 1703], [1702, 1704, 1769], [1703, 1705], [1675, 1704, 1706], [1705, 1707], [1706, 1708, 1770], [1707, 1709], [1676, 1708, 1710], [1709, 1711], [1710, 1712, 1771], [1711, 1713], [1677, 1712, 1714], [1713, 1715], [1714, 1716, 1772], [1715, 1717], [1678, 1716, 1718], [1717, 1719], [1718, 1720, 1773], [1719, 1721], [1679, 1720, 1722], [1721, 1723], [1722, 1724, 1774], [1723, 1725], [1680, 1724, 1726], [1725, 1727], [1726, 1728, 1775], [1727, 1729], [1681, 1728, 1730], [1729, 1731], [1730, 1732, 1776], [1731, 1733], [1682, 1732, 1734], [1733, 1735], [1734, 1736, 1777], [1735, 1737], [1683, 1736, 1738], [1737, 1739], [1738, 1740, 1778], [1739, 1741], [1684, 1740, 1742], [1741, 1743], [1742, 1744, 1779], [1743, 1745], [1685, 1744, 1746], [1745, 1747], [1746, 1748, 1780], [1747, 1749], [1686, 1748, 1750], [1749, 1751], [1750, 1752, 1781], [1751, 1753], [1687, 1752, 1754], [1753, 1755], [1754, 1756, 1782], [1755, 1757], [1688, 1756, 1758], [1757, 1759], [1758, 1760, 1783], [1759, 1761], [1689, 1760, 1762], [1761, 1763], [1762, 1764, 1784], [1763, 1765], [1690, 1764], [1691, 1785], [1695, 1789], [1699, 1793], [1703, 1797], [1707, 1801], [1711, 1805], [1715, 1809], [1719, 1813], [1723, 1817], [1727, 1821], [1731, 1825], [1735, 1829], [1739, 1833], [1743, 1837], [1747, 1841], [1751, 1845], [1755, 1849], [1759, 1853], [1763, 1857], [1766, 1786], [1785, 1787], [1786, 1788, 1860], [1787, 1789], [1767, 1788, 1790], [1789, 1791], [1790, 1792, 1861], [1791, 1793], [1768, 1792, 1794], [1793, 1795], [1794, 1796, 1862], [1795, 1797], [1769, 1796, 1798], [1797, 1799], [1798, 1800, 1863], [1799, 1801], [1770, 1800, 1802], [1801, 1803], [1802, 1804, 1864], [1803, 1805], [1771, 1804, 1806], [1805, 1807], [1806, 1808, 1865], [1807, 1809], [1772, 1808, 1810], [1809, 1811], [1810, 1812, 1866], [1811, 1813], [1773, 1812, 1814], [1813, 1815], [1814, 1816, 1867], [1815, 1817], [1774, 1816, 1818], [1817, 1819], [1818, 1820, 1868], [1819, 1821], [1775, 1820, 1822], [1821, 1823], [1822, 1824, 1869], [1823, 1825], [1776, 1824, 1826], [1825, 1827], [1826, 1828, 1870], [1827, 1829], [1777, 1828, 1830], [1829, 1831], [1830, 1832, 1871], [1831, 1833], [1778, 1832, 1834], [1833, 1835], [1834, 1836, 1872], [1835, 1837], [1779, 1836, 1838], [1837, 1839], [1838, 1840, 1873], [1839, 1841], [1780, 1840, 1842], [1841, 1843], [1842, 1844, 1874], [1843, 1845], [1781, 1844, 1846], [1845, 1847], [1846, 1848, 1875], [1847, 1849], [1782, 1848, 1850], [1849, 1851], [1850, 1852, 1876], [1851, 1853], [1783, 1852, 1854], [1853, 1855], [1854, 1856, 1877], [1855, 1857], [1784, 1856, 1858], [1857, 1859], [1858, 1878], [1787, 1881], [1791, 1885], [1795, 1889], [1799, 1893], [1803, 1897], [1807, 1901], [1811, 1905], [1815, 1909], [1819, 1913], [1823, 1917], [1827, 1921], [1831, 1925], [1835, 1929], [1839, 1933], [1843, 1937], [1847, 1941], [1851, 1945], [1855, 1949], [1859, 1953], [1880, 1954], [1879, 1881], [1860, 1880, 1882], [1881, 1883], [1882, 1884, 1955], [1883, 1885], [1861, 1884, 1886], [1885, 1887], [1886, 1888, 1956], [1887, 1889], [1862, 1888, 1890], [1889, 1891], [1890, 1892, 1957], [1891, 1893], [1863, 1892, 1894], [1893, 1895], [1894, 1896, 1958], [1895, 1897], [1864, 1896, 1898], [1897, 1899], [1898, 1900, 1959], [1899, 1901], [1865, 1900, 1902], [1901, 1903], [1902, 1904, 1960], [1903, 1905], [1866, 1904, 1906], [1905, 1907], [1906, 1908, 1961], [1907, 1909], [1867, 1908, 1910], [1909, 1911], [1910, 1912, 1962], [1911, 1913], [1868, 1912, 1914], [1913, 1915], [1914, 1916, 1963], [1915, 1917], [1869, 1916, 1918], [1917, 1919], [1918, 1920, 1964], [1919, 1921], [1870, 1920, 1922], [1921, 1923], [1922, 1924, 1965], [1923, 1925], [1871, 1924, 1926], [1925, 1927], [1926, 1928, 1966], [1927, 1929], [1872, 1928, 1930], [1929, 1931], [1930, 1932, 1967], [1931, 1933], [1873, 1932, 1934], [1933, 1935], [1934, 1936, 1968], [1935, 1937], [1874, 1936, 1938], [1937, 1939], [1938, 1940, 1969], [1939, 1941], [1875, 1940, 1942], [1941, 1943], [1942, 1944, 1970], [1943, 1945], [1876, 1944, 1946], [1945, 1947], [1946, 1948, 1971], [1947, 1949], [1877, 1948, 1950], [1949, 1951], [1950, 1952, 1972], [1951, 1953], [1878, 1952], [1879, 1973], [1883, 1977], [1887, 1981], [1891, 1985], [1895, 1989], [1899, 1993], [1903, 1997], [1907, 2001], [1911, 2005], [1915, 2009], [1919, 2013], [1923, 2017], [1927, 2021], [1931, 2025], [1935, 2029], [1939, 2033], [1943, 2037], [1947, 2041], [1951, 2045], [1954, 1974], [1973, 1975], [1974, 1976, 2048], [1975, 1977], [1955, 1976, 1978], [1977, 1979], [1978, 1980, 2049], [1979, 1981], [1956, 1980, 1982], [1981, 1983], [1982, 1984, 2050], [1983, 1985], [1957, 1984, 1986], [1985, 1987], [1986, 1988, 2051], [1987, 1989], [1958, 1988, 1990], [1989, 1991], [1990, 1992, 2052], [1991, 1993], [1959, 1992, 1994], [1993, 1995], [1994, 1996, 2053], [1995, 1997], [1960, 1996, 1998], [1997, 1999], [1998, 2000, 2054], [1999, 2001], [1961, 2000, 2002], [2001, 2003], [2002, 2004, 2055], [2003, 2005], [1962, 2004, 2006], [2005, 2007], [2006, 2008, 2056], [2007, 2009], [1963, 2008, 2010], [2009, 2011], [2010, 2012, 2057], [2011, 2013], [1964, 2012, 2014], [2013, 2015], [2014, 2016, 2058], [2015, 2017], [1965, 2016, 2018], [2017, 2019], [2018, 2020, 2059], [2019, 2021], [1966, 2020, 2022], [2021, 2023], [2022, 2024, 2060], [2023, 2025], [1967, 2024, 2026], [2025, 2027], [2026, 2028, 2061], [2027, 2029], [1968, 2028, 2030], [2029, 2031], [2030, 2032, 2062], [2031, 2033], [1969, 2032, 2034], [2033, 2035], [2034, 2036, 2063], [2035, 2037], [1970, 2036, 2038], [2037, 2039], [2038, 2040, 2064], [2039, 2041], [1971, 2040, 2042], [2041, 2043], [2042, 2044, 2065], [2043, 2045], [1972, 2044, 2046], [2045, 2047], [2046, 2066], [1975, 2069], [1979, 2073], [1983, 2077], [1987, 2081], [1991, 2085], [1995, 2089], [1999, 2093], [2003, 2097], [2007, 2101], [2011, 2105], [2015, 2109], [2019, 2113], [2023, 2117], [2027, 2121], [2031, 2125], [2035, 2129], [2039, 2133], [2043, 2137], [2047, 2141], [2068, 2142], [2067, 2069], [2048, 2068, 2070], [2069, 2071], [2070, 2072, 2143], [2071, 2073], [2049, 2072, 2074], [2073, 2075], [2074, 2076, 2144], [2075, 2077], [2050, 2076, 2078], [2077, 2079], [2078, 2080, 2145], [2079, 2081], [2051, 2080, 2082], [2081, 2083], [2082, 2084, 2146], [2083, 2085], [2052, 2084, 2086], [2085, 2087], [2086, 2088, 2147], [2087, 2089], [2053, 2088, 2090], [2089, 2091], [2090, 2092, 2148], [2091, 2093], [2054, 2092, 2094], [2093, 2095], [2094, 2096, 2149], [2095, 2097], [2055, 2096, 2098], [2097, 2099], [2098, 2100, 2150], [2099, 2101], [2056, 2100, 2102], [2101, 2103], [2102, 2104, 2151], [2103, 2105], [2057, 2104, 2106], [2105, 2107], [2106, 2108, 2152], [2107, 2109], [2058, 2108, 2110], [2109, 2111], [2110, 2112, 2153], [2111, 2113], [2059, 2112, 2114], [2113, 2115], [2114, 2116, 2154], [2115, 2117], [2060, 2116, 2118], [2117, 2119], [2118, 2120, 2155], [2119, 2121], [2061, 2120, 2122], [2121, 2123], [2122, 2124, 2156], [2123, 2125], [2062, 2124, 2126], [2125, 2127], [2126, 2128, 2157], [2127, 2129], [2063, 2128, 2130], [2129, 2131], [2130, 2132, 2158], [2131, 2133], [2064, 2132, 2134], [2133, 2135], [2134, 2136, 2159], [2135, 2137], [2065, 2136, 2138], [2137, 2139], [2138, 2140, 2160], [2139, 2141], [2066, 2140], [2067, 2161], [2071, 2165], [2075, 2169], [2079, 2173], [2083, 2177], [2087, 2181], [2091, 2185], [2095, 2189], [2099, 2193], [2103, 2197], [2107, 2201], [2111, 2205], [2115, 2209], [2119, 2213], [2123, 2217], [2127, 2221], [2131, 2225], [2135, 2229], [2139, 2233], [2142, 2162], [2161, 2163], [2162, 2164, 2236], [2163, 2165], [2143, 2164, 2166], [2165, 2167], [2166, 2168, 2237], [2167, 2169], [2144, 2168, 2170], [2169, 2171], [2170, 2172, 2238], [2171, 2173], [2145, 2172, 2174], [2173, 2175], [2174, 2176, 2239], [2175, 2177], [2146, 2176, 2178], [2177, 2179], [2178, 2180, 2240], [2179, 2181], [2147, 2180, 2182], [2181, 2183], [2182, 2184, 2241], [2183, 2185], [2148, 2184, 2186], [2185, 2187], [2186, 2188, 2242], [2187, 2189], [2149, 2188, 2190], [2189, 2191], [2190, 2192, 2243], [2191, 2193], [2150, 2192, 2194], [2193, 2195], [2194, 2196, 2244], [2195, 2197], [2151, 2196, 2198], [2197, 2199], [2198, 2200, 2245], [2199, 2201], [2152, 2200, 2202], [2201, 2203], [2202, 2204, 2246], [2203, 2205], [2153, 2204, 2206], [2205, 2207], [2206, 2208, 2247], [2207, 2209], [2154, 2208, 2210], [2209, 2211], [2210, 2212, 2248], [2211, 2213], [2155, 2212, 2214], [2213, 2215], [2214, 2216, 2249], [2215, 2217], [2156, 2216, 2218], [2217, 2219], [2218, 2220, 2250], [2219, 2221], [2157, 2220, 2222], [2221, 2223], [2222, 2224, 2251], [2223, 2225], [2158, 2224, 2226], [2225, 2227], [2226, 2228, 2252], [2227, 2229], [2159, 2228, 2230], [2229, 2231], [2230, 2232, 2253], [2231, 2233], [2160, 2232, 2234], [2233, 2235], [2234, 2254], [2163, 2257], [2167, 2261], [2171, 2265], [2175, 2269], [2179, 2273], [2183, 2277], [2187, 2281], [2191, 2285], [2195, 2289], [2199, 2293], [2203, 2297], [2207, 2301], [2211, 2305], [2215, 2309], [2219, 2313], [2223, 2317], [2227, 2321], [2231, 2325], [2235, 2329], [2256, 2330], [2255, 2257], [2236, 2256, 2258], [2257, 2259], [2258, 2260, 2331], [2259, 2261], [2237, 2260, 2262], [2261, 2263], [2262, 2264, 2332], [2263, 2265], [2238, 2264, 2266], [2265, 2267], [2266, 2268, 2333], [2267, 2269], [2239, 2268, 2270], [2269, 2271], [2270, 2272, 2334], [2271, 2273], [2240, 2272, 2274], [2273, 2275], [2274, 2276, 2335], [2275, 2277], [2241, 2276, 2278], [2277, 2279], [2278, 2280, 2336], [2279, 2281], [2242, 2280, 2282], [2281, 2283], [2282, 2284, 2337], [2283, 2285], [2243, 2284, 2286], [2285, 2287], [2286, 2288, 2338], [2287, 2289], [2244, 2288, 2290], [2289, 2291], [2290, 2292, 2339], [2291, 2293], [2245, 2292, 2294], [2293, 2295], [2294, 2296, 2340], [2295, 2297], [2246, 2296, 2298], [2297, 2299], [2298, 2300, 2341], [2299, 2301], [2247, 2300, 2302], [2301, 2303], [2302, 2304, 2342], [2303, 2305], [2248, 2304, 2306], [2305, 2307], [2306, 2308, 2343], [2307, 2309], [2249, 2308, 2310], [2309, 2311], [2310, 2312, 2344], [2311, 2313], [2250, 2312, 2314], [2313, 2315], [2314, 2316, 2345], [2315, 2317], [2251, 2316, 2318], [2317, 2319], [2318, 2320, 2346], [2319, 2321], [2252, 2320, 2322], [2321, 2323], [2322, 2324, 2347], [2323, 2325], [2253, 2324, 2326], [2325, 2327], [2326, 2328, 2348], [2327, 2329], [2254, 2328], [2255, 2349], [2259, 2353], [2263, 2357], [2267, 2361], [2271, 2365], [2275, 2369], [2279, 2373], [2283, 2377], [2287, 2381], [2291, 2385], [2295, 2389], [2299, 2393], [2303, 2397], [2307, 2401], [2311, 2405], [2315, 2409], [2319, 2413], [2323, 2417], [2327, 2421], [2330, 2350], [2349, 2351], [2350, 2352, 2424], [2351, 2353], [2331, 2352, 2354], [2353, 2355], [2354, 2356, 2425], [2355, 2357], [2332, 2356, 2358], [2357, 2359], [2358, 2360, 2426], [2359, 2361], [2333, 2360, 2362], [2361, 2363], [2362, 2364, 2427], [2363, 2365], [2334, 2364, 2366], [2365, 2367], [2366, 2368, 2428], [2367, 2369], [2335, 2368, 2370], [2369, 2371], [2370, 2372, 2429], [2371, 2373], [2336, 2372, 2374], [2373, 2375], [2374, 2376, 2430], [2375, 2377], [2337, 2376, 2378], [2377, 2379], [2378, 2380, 2431], [2379, 2381], [2338, 2380, 2382], [2381, 2383], [2382, 2384, 2432], [2383, 2385], [2339, 2384, 2386], [2385, 2387], [2386, 2388, 2433], [2387, 2389], [2340, 2388, 2390], [2389, 2391], [2390, 2392, 2434], [2391, 2393], [2341, 2392, 2394], [2393, 2395], [2394, 2396, 2435], [2395, 2397], [2342, 2396, 2398], [2397, 2399], [2398, 2400, 2436], [2399, 2401], [2343, 2400, 2402], [2401, 2403], [2402, 2404, 2437], [2403, 2405], [2344, 2404, 2406], [2405, 2407], [2406, 2408, 2438], [2407, 2409], [2345, 2408, 2410], [2409, 2411], [2410, 2412, 2439], [2411, 2413], [2346, 2412, 2414], [2413, 2415], [2414, 2416, 2440], [2415, 2417], [2347, 2416, 2418], [2417, 2419], [2418, 2420, 2441], [2419, 2421], [2348, 2420, 2422], [2421, 2423], [2422, 2442], [2351, 2445], [2355, 2449], [2359, 2453], [2363, 2457], [2367, 2461], [2371, 2465], [2375, 2469], [2379, 2473], [2383, 2477], [2387, 2481], [2391, 2485], [2395, 2489], [2399, 2493], [2403, 2497], [2407, 2501], [2411, 2505], [2415, 2509], [2419, 2513], [2423, 2517], [2444, 2518], [2443, 2445], [2424, 2444, 2446], [2445, 2447], [2446, 2448, 2519], [2447, 2449], [2425, 2448, 2450], [2449, 2451], [2450, 2452, 2520], [2451, 2453], [2426, 2452, 2454], [2453, 2455], [2454, 2456, 2521], [2455, 2457], [2427, 2456, 2458], [2457, 2459], [2458, 2460, 2522], [2459, 2461], [2428, 2460, 2462], [2461, 2463], [2462, 2464, 2523], [2463, 2465], [2429, 2464, 2466], [2465, 2467], [2466, 2468, 2524], [2467, 2469], [2430, 2468, 2470], [2469, 2471], [2470, 2472, 2525], [2471, 2473], [2431, 2472, 2474], [2473, 2475], [2474, 2476, 2526], [2475, 2477], [2432, 2476, 2478], [2477, 2479], [2478, 2480, 2527], [2479, 2481], [2433, 2480, 2482], [2481, 2483], [2482, 2484, 2528], [2483, 2485], [2434, 2484, 2486], [2485, 2487], [2486, 2488, 2529], [2487, 2489], [2435, 2488, 2490], [2489, 2491], [2490, 2492, 2530], [2491, 2493], [2436, 2492, 2494], [2493, 2495], [2494, 2496, 2531], [2495, 2497], [2437, 2496, 2498], [2497, 2499], [2498, 2500, 2532], [2499, 2501], [2438, 2500, 2502], [2501, 2503], [2502, 2504, 2533], [2503, 2505], [2439, 2504, 2506], [2505, 2507], [2506, 2508, 2534], [2507, 2509], [2440, 2508, 2510], [2509, 2511], [2510, 2512, 2535], [2511, 2513], [2441, 2512, 2514], [2513, 2515], [2514, 2516, 2536], [2515, 2517], [2442, 2516], [2443, 2537], [2447, 2541], [2451, 2545], [2455, 2549], [2459, 2553], [2463, 2557], [2467, 2561], [2471, 2565], [2475, 2569], [2479, 2573], [2483, 2577], [2487, 2581], [2491, 2585], [2495, 2589], [2499, 2593], [2503, 2597], [2507, 2601], [2511, 2605], [2515, 2609], [2518, 2538], [2537, 2539], [2538, 2540, 2612], [2539, 2541], [2519, 2540, 2542], [2541, 2543], [2542, 2544, 2613], [2543, 2545], [2520, 2544, 2546], [2545, 2547], [2546, 2548, 2614], [2547, 2549], [2521, 2548, 2550], [2549, 2551], [2550, 2552, 2615], [2551, 2553], [2522, 2552, 2554], [2553, 2555], [2554, 2556, 2616], [2555, 2557], [2523, 2556, 2558], [2557, 2559], [2558, 2560, 2617], [2559, 2561], [2524, 2560, 2562], [2561, 2563], [2562, 2564, 2618], [2563, 2565], [2525, 2564, 2566], [2565, 2567], [2566, 2568, 2619], [2567, 2569], [2526, 2568, 2570], [2569, 2571], [2570, 2572, 2620], [2571, 2573], [2527, 2572, 2574], [2573, 2575], [2574, 2576, 2621], [2575, 2577], [2528, 2576, 2578], [2577, 2579], [2578, 2580, 2622], [2579, 2581], [2529, 2580, 2582], [2581, 2583], [2582, 2584, 2623], [2583, 2585], [2530, 2584, 2586], [2585, 2587], [2586, 2588, 2624], [2587, 2589], [2531, 2588, 2590], [2589, 2591], [2590, 2592, 2625], [2591, 2593], [2532, 2592, 2594], [2593, 2595], [2594, 2596, 2626], [2595, 2597], [2533, 2596, 2598], [2597, 2599], [2598, 2600, 2627], [2599, 2601], [2534, 2600, 2602], [2601, 2603], [2602, 2604, 2628], [2603, 2605], [2535, 2604, 2606], [2605, 2607], [2606, 2608, 2629], [2607, 2609], [2536, 2608, 2610], [2609, 2611], [2610, 2630], [2539, 2633], [2543, 2637], [2547, 2641], [2551, 2645], [2555, 2649], [2559, 2653], [2563, 2657], [2567, 2661], [2571, 2665], [2575, 2669], [2579, 2673], [2583, 2677], [2587, 2681], [2591, 2685], [2595, 2689], [2599, 2693], [2603, 2697], [2607, 2701], [2611, 2705], [2632, 2706], [2631, 2633], [2612, 2632, 2634], [2633, 2635], [2634, 2636, 2707], [2635, 2637], [2613, 2636, 2638], [2637, 2639], [2638, 2640, 2708], [2639, 2641], [2614, 2640, 2642], [2641, 2643], [2642, 2644, 2709], [2643, 2645], [2615, 2644, 2646], [2645, 2647], [2646, 2648, 2710], [2647, 2649], [2616, 2648, 2650], [2649, 2651], [2650, 2652, 2711], [2651, 2653], [2617, 2652, 2654], [2653, 2655], [2654, 2656, 2712], [2655, 2657], [2618, 2656, 2658], [2657, 2659], [2658, 2660, 2713], [2659, 2661], [2619, 2660, 2662], [2661, 2663], [2662, 2664, 2714], [2663, 2665], [2620, 2664, 2666], [2665, 2667], [2666, 2668, 2715], [2667, 2669], [2621, 2668, 2670], [2669, 2671], [2670, 2672, 2716], [2671, 2673], [2622, 2672, 2674], [2673, 2675], [2674, 2676, 2717], [2675, 2677], [2623, 2676, 2678], [2677, 2679], [2678, 2680, 2718], [2679, 2681], [2624, 2680, 2682], [2681, 2683], [2682, 2684, 2719], [2683, 2685], [2625, 2684, 2686], [2685, 2687], [2686, 2688, 2720], [2687, 2689], [2626, 2688, 2690], [2689, 2691], [2690, 2692, 2721], [2691, 2693], [2627, 2692, 2694], [2693, 2695], [2694, 2696, 2722], [2695, 2697], [2628, 2696, 2698], [2697, 2699], [2698, 2700, 2723], [2699, 2701], [2629, 2700, 2702], [2701, 2703], [2702, 2704, 2724], [2703, 2705], [2630, 2704], [2631, 2725], [2635, 2729], [2639, 2733], [2643, 2737], [2647, 2741], [2651, 2745], [2655, 2749], [2659, 2753], [2663, 2757], [2667, 2761], [2671, 2765], [2675, 2769], [2679, 2773], [2683, 2777], [2687, 2781], [2691, 2785], [2695, 2789], [2699, 2793], [2703, 2797], [2706, 2726], [2725, 2727], [2726, 2728, 2800], [2727, 2729], [2707, 2728, 2730], [2729, 2731], [2730, 2732, 2801], [2731, 2733], [2708, 2732, 2734], [2733, 2735], [2734, 2736, 2802], [2735, 2737], [2709, 2736, 2738], [2737, 2739], [2738, 2740, 2803], [2739, 2741], [2710, 2740, 2742], [2741, 2743], [2742, 2744, 2804], [2743, 2745], [2711, 2744, 2746], [2745, 2747], [2746, 2748, 2805], [2747, 2749], [2712, 2748, 2750], [2749, 2751], [2750, 2752, 2806], [2751, 2753], [2713, 2752, 2754], [2753, 2755], [2754, 2756, 2807], [2755, 2757], [2714, 2756, 2758], [2757, 2759], [2758, 2760, 2808], [2759, 2761], [2715, 2760, 2762], [2761, 2763], [2762, 2764, 2809], [2763, 2765], [2716, 2764, 2766], [2765, 2767], [2766, 2768, 2810], [2767, 2769], [2717, 2768, 2770], [2769, 2771], [2770, 2772, 2811], [2771, 2773], [2718, 2772, 2774], [2773, 2775], [2774, 2776, 2812], [2775, 2777], [2719, 2776, 2778], [2777, 2779], [2778, 2780, 2813], [2779, 2781], [2720, 2780, 2782], [2781, 2783], [2782, 2784, 2814], [2783, 2785], [2721, 2784, 2786], [2785, 2787], [2786, 2788, 2815], [2787, 2789], [2722, 2788, 2790], [2789, 2791], [2790, 2792, 2816], [2791, 2793], [2723, 2792, 2794], [2793, 2795], [2794, 2796, 2817], [2795, 2797], [2724, 2796, 2798], [2797, 2799], [2798, 2818], [2727, 2821], [2731, 2825], [2735, 2829], [2739, 2833], [2743, 2837], [2747, 2841], [2751, 2845], [2755, 2849], [2759, 2853], [2763, 2857], [2767, 2861], [2771, 2865], [2775, 2869], [2779, 2873], [2783, 2877], [2787, 2881], [2791, 2885], [2795, 2889], [2799, 2893], [2820, 2894], [2819, 2821], [2800, 2820, 2822], [2821, 2823], [2822, 2824, 2895], [2823, 2825], [2801, 2824, 2826], [2825, 2827], [2826, 2828, 2896], [2827, 2829], [2802, 2828, 2830], [2829, 2831], [2830, 2832, 2897], [2831, 2833], [2803, 2832, 2834], [2833, 2835], [2834, 2836, 2898], [2835, 2837], [2804, 2836, 2838], [2837, 2839], [2838, 2840, 2899], [2839, 2841], [2805, 2840, 2842], [2841, 2843], [2842, 2844, 2900], [2843, 2845], [2806, 2844, 2846], [2845, 2847], [2846, 2848, 2901], [2847, 2849], [2807, 2848, 2850], [2849, 2851], [2850, 2852, 2902], [2851, 2853], [2808, 2852, 2854], [2853, 2855], [2854, 2856, 2903], [2855, 2857], [2809, 2856, 2858], [2857, 2859], [2858, 2860, 2904], [2859, 2861], [2810, 2860, 2862], [2861, 2863], [2862, 2864, 2905], [2863, 2865], [2811, 2864, 2866], [2865, 2867], [2866, 2868, 2906], [2867, 2869], [2812, 2868, 2870], [2869, 2871], [2870, 2872, 2907], [2871, 2873], [2813, 2872, 2874], [2873, 2875], [2874, 2876, 2908], [2875, 2877], [2814, 2876, 2878], [2877, 2879], [2878, 2880, 2909], [2879, 2881], [2815, 2880, 2882], [2881, 2883], [2882, 2884, 2910], [2883, 2885], [2816, 2884, 2886], [2885, 2887], [2886, 2888, 2911], [2887, 2889], [2817, 2888, 2890], [2889, 2891], [2890, 2892, 2912], [2891, 2893], [2818, 2892], [2819, 2913], [2823, 2917], [2827, 2921], [2831, 2925], [2835, 2929], [2839, 2933], [2843, 2937], [2847, 2941], [2851, 2945], [2855, 2949], [2859, 2953], [2863, 2957], [2867, 2961], [2871, 2965], [2875, 2969], [2879, 2973], [2883, 2977], [2887, 2981], [2891, 2985], [2894, 2914], [2913, 2915], [2914, 2916, 2988], [2915, 2917], [2895, 2916, 2918], [2917, 2919], [2918, 2920, 2989], [2919, 2921], [2896, 2920, 2922], [2921, 2923], [2922, 2924, 2990], [2923, 2925], [2897, 2924, 2926], [2925, 2927], [2926, 2928, 2991], [2927, 2929], [2898, 2928, 2930], [2929, 2931], [2930, 2932, 2992], [2931, 2933], [2899, 2932, 2934], [2933, 2935], [2934, 2936, 2993], [2935, 2937], [2900, 2936, 2938], [2937, 2939], [2938, 2940, 2994], [2939, 2941], [2901, 2940, 2942], [2941, 2943], [2942, 2944, 2995], [2943, 2945], [2902, 2944, 2946], [2945, 2947], [2946, 2948, 2996], [2947, 2949], [2903, 2948, 2950], [2949, 2951], [2950, 2952, 2997], [2951, 2953], [2904, 2952, 2954], [2953, 2955], [2954, 2956, 2998], [2955, 2957], [2905, 2956, 2958], [2957, 2959], [2958, 2960, 2999], [2959, 2961], [2906, 2960, 2962], [2961, 2963], [2962, 2964, 3000], [2963, 2965], [2907, 2964, 2966], [2965, 2967], [2966, 2968, 3001], [2967, 2969], [2908, 2968, 2970], [2969, 2971], [2970, 2972, 3002], [2971, 2973], [2909, 2972, 2974], [2973, 2975], [2974, 2976, 3003], [2975, 2977], [2910, 2976, 2978], [2977, 2979], [2978, 2980, 3004], [2979, 2981], [2911, 2980, 2982], [2981, 2983], [2982, 2984, 3005], [2983, 2985], [2912, 2984, 2986], [2985, 2987], [2986, 3006], [2915, 3009], [2919, 3013], [2923, 3017], [2927, 3021], [2931, 3025], [2935, 3029], [2939, 3033], [2943, 3037], [2947, 3041], [2951, 3045], [2955, 3049], [2959, 3053], [2963, 3057], [2967, 3061], [2971, 3065], [2975, 3069], [2979, 3073], [2983, 3077], [2987, 3081], [3008, 3082], [3007, 3009], [2988, 3008, 3010], [3009, 3011], [3010, 3012, 3083], [3011, 3013], [2989, 3012, 3014], [3013, 3015], [3014, 3016, 3084], [3015, 3017], [2990, 3016, 3018], [3017, 3019], [3018, 3020, 3085], [3019, 3021], [2991, 3020, 3022], [3021, 3023], [3022, 3024, 3086], [3023, 3025], [2992, 3024, 3026], [3025, 3027], [3026, 3028, 3087], [3027, 3029], [2993, 3028, 3030], [3029, 3031], [3030, 3032, 3088], [3031, 3033], [2994, 3032, 3034], [3033, 3035], [3034, 3036, 3089], [3035, 3037], [2995, 3036, 3038], [3037, 3039], [3038, 3040, 3090], [3039, 3041], [2996, 3040, 3042], [3041, 3043], [3042, 3044, 3091], [3043, 3045], [2997, 3044, 3046], [3045, 3047], [3046, 3048, 3092], [3047, 3049], [2998, 3048, 3050], [3049, 3051], [3050, 3052, 3093], [3051, 3053], [2999, 3052, 3054], [3053, 3055], [3054, 3056, 3094], [3055, 3057], [3000, 3056, 3058], [3057, 3059], [3058, 3060, 3095], [3059, 3061], [3001, 3060, 3062], [3061, 3063], [3062, 3064, 3096], [3063, 3065], [3002, 3064, 3066], [3065, 3067], [3066, 3068, 3097], [3067, 3069], [3003, 3068, 3070], [3069, 3071], [3070, 3072, 3098], [3071, 3073], [3004, 3072, 3074], [3073, 3075], [3074, 3076, 3099], [3075, 3077], [3005, 3076, 3078], [3077, 3079], [3078, 3080, 3100], [3079, 3081], [3006, 3080], [3007, 3101], [3011, 3105], [3015, 3109], [3019, 3113], [3023, 3117], [3027, 3121], [3031, 3125], [3035, 3129], [3039, 3133], [3043, 3137], [3047, 3141], [3051, 3145], [3055, 3149], [3059, 3153], [3063, 3157], [3067, 3161], [3071, 3165], [3075, 3169], [3079, 3173], [3082, 3102], [3101, 3103], [3102, 3104, 3176], [3103, 3105], [3083, 3104, 3106], [3105, 3107], [3106, 3108, 3177], [3107, 3109], [3084, 3108, 3110], [3109, 3111], [3110, 3112, 3178], [3111, 3113], [3085, 3112, 3114], [3113, 3115], [3114, 3116, 3179], [3115, 3117], [3086, 3116, 3118], [3117, 3119], [3118, 3120, 3180], [3119, 3121], [3087, 3120, 3122], [3121, 3123], [3122, 3124, 3181], [3123, 3125], [3088, 3124, 3126], [3125, 3127], [3126, 3128, 3182], [3127, 3129], [3089, 3128, 3130], [3129, 3131], [3130, 3132, 3183], [3131, 3133], [3090, 3132, 3134], [3133, 3135], [3134, 3136, 3184], [3135, 3137], [3091, 3136, 3138], [3137, 3139], [3138, 3140, 3185], [3139, 3141], [3092, 3140, 3142], [3141, 3143], [3142, 3144, 3186], [3143, 3145], [3093, 3144, 3146], [3145, 3147], [3146, 3148, 3187], [3147, 3149], [3094, 3148, 3150], [3149, 3151], [3150, 3152, 3188], [3151, 3153], [3095, 3152, 3154], [3153, 3155], [3154, 3156, 3189], [3155, 3157], [3096, 3156, 3158], [3157, 3159], [3158, 3160, 3190], [3159, 3161], [3097, 3160, 3162], [3161, 3163], [3162, 3164, 3191], [3163, 3165], [3098, 3164, 3166], [3165, 3167], [3166, 3168, 3192], [3167, 3169], [3099, 3168, 3170], [3169, 3171], [3170, 3172, 3193], [3171, 3173], [3100, 3172, 3174], [3173, 3175], [3174, 3194], [3103, 3197], [3107, 3201], [3111, 3205], [3115, 3209], [3119, 3213], [3123, 3217], [3127, 3221], [3131, 3225], [3135, 3229], [3139, 3233], [3143, 3237], [3147, 3241], [3151, 3245], [3155, 3249], [3159, 3253], [3163, 3257], [3167, 3261], [3171, 3265], [3175, 3269], [3196, 3270], [3195, 3197], [3176, 3196, 3198], [3197, 3199], [3198, 3200, 3271], [3199, 3201], [3177, 3200, 3202], [3201, 3203], [3202, 3204, 3272], [3203, 3205], [3178, 3204, 3206], [3205, 3207], [3206, 3208, 3273], [3207, 3209], [3179, 3208, 3210], [3209, 3211], [3210, 3212, 3274], [3211, 3213], [3180, 3212, 3214], [3213, 3215], [3214, 3216, 3275], [3215, 3217], [3181, 3216, 3218], [3217, 3219], [3218, 3220, 3276], [3219, 3221], [3182, 3220, 3222], [3221, 3223], [3222, 3224, 3277], [3223, 3225], [3183, 3224, 3226], [3225, 3227], [3226, 3228, 3278], [3227, 3229], [3184, 3228, 3230], [3229, 3231], [3230, 3232, 3279], [3231, 3233], [3185, 3232, 3234], [3233, 3235], [3234, 3236, 3280], [3235, 3237], [3186, 3236, 3238], [3237, 3239], [3238, 3240, 3281], [3239, 3241], [3187, 3240, 3242], [3241, 3243], [3242, 3244, 3282], [3243, 3245], [3188, 3244, 3246], [3245, 3247], [3246, 3248, 3283], [3247, 3249], [3189, 3248, 3250], [3249, 3251], [3250, 3252, 3284], [3251, 3253], [3190, 3252, 3254], [3253, 3255], [3254, 3256, 3285], [3255, 3257], [3191, 3256, 3258], [3257, 3259], [3258, 3260, 3286], [3259, 3261], [3192, 3260, 3262], [3261, 3263], [3262, 3264, 3287], [3263, 3265], [3193, 3264, 3266], [3265, 3267], [3266, 3268, 3288], [3267, 3269], [3194, 3268], [3195, 3289], [3199, 3293], [3203, 3297], [3207, 3301], [3211, 3305], [3215, 3309], [3219, 3313], [3223, 3317], [3227, 3321], [3231, 3325], [3235, 3329], [3239, 3333], [3243, 3337], [3247, 3341], [3251, 3345], [3255, 3349], [3259, 3353], [3263, 3357], [3267, 3361], [3270, 3290], [3289, 3291], [3290, 3292, 3364], [3291, 3293], [3271, 3292, 3294], [3293, 3295], [3294, 3296, 3365], [3295, 3297], [3272, 3296, 3298], [3297, 3299], [3298, 3300, 3366], [3299, 3301], [3273, 3300, 3302], [3301, 3303], [3302, 3304, 3367], [3303, 3305], [3274, 3304, 3306], [3305, 3307], [3306, 3308, 3368], [3307, 3309], [3275, 3308, 3310], [3309, 3311], [3310, 3312, 3369], [3311, 3313], [3276, 3312, 3314], [3313, 3315], [3314, 3316, 3370], [3315, 3317], [3277, 3316, 3318], [3317, 3319], [3318, 3320, 3371], [3319, 3321], [3278, 3320, 3322], [3321, 3323], [3322, 3324, 3372], [3323, 3325], [3279, 3324, 3326], [3325, 3327], [3326, 3328, 3373], [3327, 3329], [3280, 3328, 3330], [3329, 3331], [3330, 3332, 3374], [3331, 3333], [3281, 3332, 3334], [3333, 3335], [3334, 3336, 3375], [3335, 3337], [3282, 3336, 3338], [3337, 3339], [3338, 3340, 3376], [3339, 3341], [3283, 3340, 3342], [3341, 3343], [3342, 3344, 3377], [3343, 3345], [3284, 3344, 3346], [3345, 3347], [3346, 3348, 3378], [3347, 3349], [3285, 3348, 3350], [3349, 3351], [3350, 3352, 3379], [3351, 3353], [3286, 3352, 3354], [3353, 3355], [3354, 3356, 3380], [3355, 3357], [3287, 3356, 3358], [3357, 3359], [3358, 3360, 3381], [3359, 3361], [3288, 3360, 3362], [3361, 3363], [3362, 3382], [3291, 3384], [3295, 3388], [3299, 3392], [3303, 3396], [3307, 3400], [3311, 3404], [3315, 3408], [3319, 3412], [3323, 3416], [3327, 3420], [3331, 3424], [3335, 3428], [3339, 3432], [3343, 3436], [3347, 3440], [3351, 3444], [3355, 3448], [3359, 3452], [3363, 3456], [3384], [3364, 3383, 3385], [3384, 3386], [3385, 3387], [3386, 3388], [3365, 3387, 3389], [3388, 3390], [3389, 3391], [3390, 3392], [3366, 3391, 3393], [3392, 3394], [3393, 3395], [3394, 3396], [3367, 3395, 3397], [3396, 3398], [3397, 3399], [3398, 3400], [3368, 3399, 3401], [3400, 3402], [3401, 3403], [3402, 3404], [3369, 3403, 3405], [3404, 3406], [3405, 3407], [3406, 3408], [3370, 3407, 3409], [3408, 3410], [3409, 3411], [3410, 3412], [3371, 3411, 3413], [3412, 3414], [3413, 3415], [3414, 3416], [3372, 3415, 3417], [3416, 3418], [3417, 3419], [3418, 3420], [3373, 3419, 3421], [3420, 3422], [3421, 3423], [3422, 3424], [3374, 3423, 3425], [3424, 3426], [3425, 3427], [3426, 3428], [3375, 3427, 3429], [3428, 3430], [3429, 3431], [3430, 3432], [3376, 3431, 3433], [3432, 3434], [3433, 3435], [3434, 3436], [3377, 3435, 3437], [3436, 3438], [3437, 3439], [3438, 3440], [3378, 3439, 3441], [3440, 3442], [3441, 3443], [3442, 3444], [3379, 3443, 3445], [3444, 3446], [3445, 3447], [3446, 3448], [3380, 3447, 3449], [3448, 3450], [3449, 3451], [3450, 3452], [3381, 3451, 3453], [3452, 3454], [3453, 3455], [3454, 3456], [3382, 3455]] +CNOTERROR: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] +CNOTTIME: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] diff --git a/benchmark/topology/topo_433.layout b/benchmark/topology/topo_433.layout index 3518ff030..8a72b5db1 100644 --- a/benchmark/topology/topo_433.layout +++ b/benchmark/topology/topo_433.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1, 26], [0, 2], [1, 3], [2, 4], [3, 5, 27], [4, 6], [5, 7], [6, 8], [7, 9, 28], [8, 10], [9, 11], [10, 12], [11, 13, 29], [12, 14], [13, 15], [14, 16], [15, 17, 30], [16, 18], [17, 19], [18, 20], [19, 21, 31], [20, 22], [21, 23], [22, 24], [23, 25, 32], [24], [0, 33], [4, 37], [8, 41], [12, 45], [16, 49], [20, 53], [24, 57], [26, 34], [33, 35], [34, 36, 60], [35, 37], [27, 36, 38], [37, 39], [38, 40, 61], [39, 41], [28, 40, 42], [41, 43], [42, 44, 62], [43, 45], [29, 44, 46], [45, 47], [46, 48, 63], [47, 49], [30, 48, 50], [49, 51], [50, 52, 64], [51, 53], [31, 52, 54], [53, 55], [54, 56, 65], [55, 57], [32, 56, 58], [57, 59], [58, 66], [35, 69], [39, 73], [43, 77], [47, 81], [51, 85], [55, 89], [59, 93], [68, 94], [67, 69], [60, 68, 70], [69, 71], [70, 72, 95], [71, 73], [61, 72, 74], [73, 75], [74, 76, 96], [75, 77], [62, 76, 78], [77, 79], [78, 80, 97], [79, 81], [63, 80, 82], [81, 83], [82, 84, 98], [83, 85], [64, 84, 86], [85, 87], [86, 88, 99], [87, 89], [65, 88, 90], [89, 91], [90, 92, 100], [91, 93], [66, 92], [67, 101], [71, 105], [75, 109], [79, 113], [83, 117], [87, 121], [91, 125], [94, 102], [101, 103], [102, 104, 128], [103, 105], [95, 104, 106], [105, 107], [106, 108, 129], [107, 109], [96, 108, 110], [109, 111], [110, 112, 130], [111, 113], [97, 112, 114], [113, 115], [114, 116, 131], [115, 117], [98, 116, 118], [117, 119], [118, 120, 132], [119, 121], [99, 120, 122], [121, 123], [122, 124, 133], [123, 125], [100, 124, 126], [125, 127], [126, 134], [103, 137], [107, 141], [111, 145], [115, 149], [119, 153], [123, 157], [127, 161], [136, 162], [135, 137], [128, 136, 138], [137, 139], [138, 140, 163], [139, 141], [129, 140, 142], [141, 143], [142, 144, 164], [143, 145], [130, 144, 146], [145, 147], [146, 148, 165], [147, 149], [131, 148, 150], [149, 151], [150, 152, 166], [151, 153], [132, 152, 154], [153, 155], [154, 156, 167], [155, 157], [133, 156, 158], [157, 159], [158, 160, 168], [159, 161], [134, 160], [135, 169], [139, 173], [143, 177], [147, 181], [151, 185], [155, 189], [159, 193], [162, 170], [169, 171], [170, 172, 196], [171, 173], [163, 172, 174], [173, 175], [174, 176, 197], [175, 177], [164, 176, 178], [177, 179], [178, 180, 198], [179, 181], [165, 180, 182], [181, 183], [182, 184, 199], [183, 185], [166, 184, 186], [185, 187], [186, 188, 200], [187, 189], [167, 188, 190], [189, 191], [190, 192, 201], [191, 193], [168, 192, 194], [193, 195], [194, 202], [171, 205], [175, 209], [179, 213], [183, 217], [187, 221], [191, 225], [195, 229], [204, 230], [203, 205], [196, 204, 206], [205, 207], [206, 208, 231], [207, 209], [197, 208, 210], [209, 211], [210, 212, 232], [211, 213], [198, 212, 214], [213, 215], [214, 216, 233], [215, 217], [199, 216, 218], [217, 219], [218, 220, 234], [219, 221], [200, 220, 222], [221, 223], [222, 224, 235], [223, 225], [201, 224, 226], [225, 227], [226, 228, 236], [227, 229], [202, 228], [203, 237], [207, 241], [211, 245], [215, 249], [219, 253], [223, 257], [227, 261], [230, 238], [237, 239], [238, 240, 264], [239, 241], [231, 240, 242], [241, 243], [242, 244, 265], [243, 245], [232, 244, 246], [245, 247], [246, 248, 266], [247, 249], [233, 248, 250], [249, 251], [250, 252, 267], [251, 253], [234, 252, 254], [253, 255], [254, 256, 268], [255, 257], [235, 256, 258], [257, 259], [258, 260, 269], [259, 261], [236, 260, 262], [261, 263], [262, 270], [239, 273], [243, 277], [247, 281], [251, 285], [255, 289], [259, 293], [263, 297], [272, 298], [271, 273], [264, 272, 274], [273, 275], [274, 276, 299], [275, 277], [265, 276, 278], [277, 279], [278, 280, 300], [279, 281], [266, 280, 282], [281, 283], [282, 284, 301], [283, 285], [267, 284, 286], [285, 287], [286, 288, 302], [287, 289], [268, 288, 290], [289, 291], [290, 292, 303], [291, 293], [269, 292, 294], [293, 295], [294, 296, 304], [295, 297], [270, 296], [271, 305], [275, 309], [279, 313], [283, 317], [287, 321], [291, 325], [295, 329], [298, 306], [305, 307], [306, 308, 332], [307, 309], [299, 308, 310], [309, 311], [310, 312, 333], [311, 313], [300, 312, 314], [313, 315], [314, 316, 334], [315, 317], [301, 316, 318], [317, 319], [318, 320, 335], [319, 321], [302, 320, 322], [321, 323], [322, 324, 336], [323, 325], [303, 324, 326], [325, 327], [326, 328, 337], [327, 329], [304, 328, 330], [329, 331], [330, 338], [307, 341], [311, 345], [315, 349], [319, 353], [323, 357], [327, 361], [331, 365], [340, 366], [339, 341], [332, 340, 342], [341, 343], [342, 344, 367], [343, 345], [333, 344, 346], [345, 347], [346, 348, 368], [347, 349], [334, 348, 350], [349, 351], [350, 352, 369], [351, 353], [335, 352, 354], [353, 355], [354, 356, 370], [355, 357], [336, 356, 358], [357, 359], [358, 360, 371], [359, 361], [337, 360, 362], [361, 363], [362, 364, 372], [363, 365], [338, 364], [339, 373], [343, 377], [347, 381], [351, 385], [355, 389], [359, 393], [363, 397], [366, 374], [373, 375], [374, 376, 400], [375, 377], [367, 376, 378], [377, 379], [378, 380, 401], [379, 381], [368, 380, 382], [381, 383], [382, 384, 402], [383, 385], [369, 384, 386], [385, 387], [386, 388, 403], [387, 389], [370, 388, 390], [389, 391], [390, 392, 404], [391, 393], [371, 392, 394], [393, 395], [394, 396, 405], [395, 397], [372, 396, 398], [397, 399], [398, 406], [375, 408], [379, 412], [383, 416], [387, 420], [391, 424], [395, 428], [399, 432], [408], [400, 407, 409], [408, 410], [409, 411], [410, 412], [401, 411, 413], [412, 414], [413, 415], [414, 416], [402, 415, 417], [416, 418], [417, 419], [418, 420], [403, 419, 421], [420, 422], [421, 423], [422, 424], [404, 423, 425], [424, 426], [425, 427], [426, 428], [405, 427, 429], [428, 430], [429, 431], [430, 432], [406, 431]] SGERROR: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1, 26], [0, 2], [1, 3], [2, 4], [3, 5, 27], [4, 6], [5, 7], [6, 8], [7, 9, 28], [8, 10], [9, 11], [10, 12], [11, 13, 29], [12, 14], [13, 15], [14, 16], [15, 17, 30], [16, 18], [17, 19], [18, 20], [19, 21, 31], [20, 22], [21, 23], [22, 24], [23, 25, 32], [24], [0, 33], [4, 37], [8, 41], [12, 45], [16, 49], [20, 53], [24, 57], [26, 34], [33, 35], [34, 36, 60], [35, 37], [27, 36, 38], [37, 39], [38, 40, 61], [39, 41], [28, 40, 42], [41, 43], [42, 44, 62], [43, 45], [29, 44, 46], [45, 47], [46, 48, 63], [47, 49], [30, 48, 50], [49, 51], [50, 52, 64], [51, 53], [31, 52, 54], [53, 55], [54, 56, 65], [55, 57], [32, 56, 58], [57, 59], [58, 66], [35, 69], [39, 73], [43, 77], [47, 81], [51, 85], [55, 89], [59, 93], [68, 94], [67, 69], [60, 68, 70], [69, 71], [70, 72, 95], [71, 73], [61, 72, 74], [73, 75], [74, 76, 96], [75, 77], [62, 76, 78], [77, 79], [78, 80, 97], [79, 81], [63, 80, 82], [81, 83], [82, 84, 98], [83, 85], [64, 84, 86], [85, 87], [86, 88, 99], [87, 89], [65, 88, 90], [89, 91], [90, 92, 100], [91, 93], [66, 92], [67, 101], [71, 105], [75, 109], [79, 113], [83, 117], [87, 121], [91, 125], [94, 102], [101, 103], [102, 104, 128], [103, 105], [95, 104, 106], [105, 107], [106, 108, 129], [107, 109], [96, 108, 110], [109, 111], [110, 112, 130], [111, 113], [97, 112, 114], [113, 115], [114, 116, 131], [115, 117], [98, 116, 118], [117, 119], [118, 120, 132], [119, 121], [99, 120, 122], [121, 123], [122, 124, 133], [123, 125], [100, 124, 126], [125, 127], [126, 134], [103, 137], [107, 141], [111, 145], [115, 149], [119, 153], [123, 157], [127, 161], [136, 162], [135, 137], [128, 136, 138], [137, 139], [138, 140, 163], [139, 141], [129, 140, 142], [141, 143], [142, 144, 164], [143, 145], [130, 144, 146], [145, 147], [146, 148, 165], [147, 149], [131, 148, 150], [149, 151], [150, 152, 166], [151, 153], [132, 152, 154], [153, 155], [154, 156, 167], [155, 157], [133, 156, 158], [157, 159], [158, 160, 168], [159, 161], [134, 160], [135, 169], [139, 173], [143, 177], [147, 181], [151, 185], [155, 189], [159, 193], [162, 170], [169, 171], [170, 172, 196], [171, 173], [163, 172, 174], [173, 175], [174, 176, 197], [175, 177], [164, 176, 178], [177, 179], [178, 180, 198], [179, 181], [165, 180, 182], [181, 183], [182, 184, 199], [183, 185], [166, 184, 186], [185, 187], [186, 188, 200], [187, 189], [167, 188, 190], [189, 191], [190, 192, 201], [191, 193], [168, 192, 194], [193, 195], [194, 202], [171, 205], [175, 209], [179, 213], [183, 217], [187, 221], [191, 225], [195, 229], [204, 230], [203, 205], [196, 204, 206], [205, 207], [206, 208, 231], [207, 209], [197, 208, 210], [209, 211], [210, 212, 232], [211, 213], [198, 212, 214], [213, 215], [214, 216, 233], [215, 217], [199, 216, 218], [217, 219], [218, 220, 234], [219, 221], [200, 220, 222], [221, 223], [222, 224, 235], [223, 225], [201, 224, 226], [225, 227], [226, 228, 236], [227, 229], [202, 228], [203, 237], [207, 241], [211, 245], [215, 249], [219, 253], [223, 257], [227, 261], [230, 238], [237, 239], [238, 240, 264], [239, 241], [231, 240, 242], [241, 243], [242, 244, 265], [243, 245], [232, 244, 246], [245, 247], [246, 248, 266], [247, 249], [233, 248, 250], [249, 251], [250, 252, 267], [251, 253], [234, 252, 254], [253, 255], [254, 256, 268], [255, 257], [235, 256, 258], [257, 259], [258, 260, 269], [259, 261], [236, 260, 262], [261, 263], [262, 270], [239, 273], [243, 277], [247, 281], [251, 285], [255, 289], [259, 293], [263, 297], [272, 298], [271, 273], [264, 272, 274], [273, 275], [274, 276, 299], [275, 277], [265, 276, 278], [277, 279], [278, 280, 300], [279, 281], [266, 280, 282], [281, 283], [282, 284, 301], [283, 285], [267, 284, 286], [285, 287], [286, 288, 302], [287, 289], [268, 288, 290], [289, 291], [290, 292, 303], [291, 293], [269, 292, 294], [293, 295], [294, 296, 304], [295, 297], [270, 296], [271, 305], [275, 309], [279, 313], [283, 317], [287, 321], [291, 325], [295, 329], [298, 306], [305, 307], [306, 308, 332], [307, 309], [299, 308, 310], [309, 311], [310, 312, 333], [311, 313], [300, 312, 314], [313, 315], [314, 316, 334], [315, 317], [301, 316, 318], [317, 319], [318, 320, 335], [319, 321], [302, 320, 322], [321, 323], [322, 324, 336], [323, 325], [303, 324, 326], [325, 327], [326, 328, 337], [327, 329], [304, 328, 330], [329, 331], [330, 338], [307, 341], [311, 345], [315, 349], [319, 353], [323, 357], [327, 361], [331, 365], [340, 366], [339, 341], [332, 340, 342], [341, 343], [342, 344, 367], [343, 345], [333, 344, 346], [345, 347], [346, 348, 368], [347, 349], [334, 348, 350], [349, 351], [350, 352, 369], [351, 353], [335, 352, 354], [353, 355], [354, 356, 370], [355, 357], [336, 356, 358], [357, 359], [358, 360, 371], [359, 361], [337, 360, 362], [361, 363], [362, 364, 372], [363, 365], [338, 364], [339, 373], [343, 377], [347, 381], [351, 385], [355, 389], [359, 393], [363, 397], [366, 374], [373, 375], [374, 376, 400], [375, 377], [367, 376, 378], [377, 379], [378, 380, 401], [379, 381], [368, 380, 382], [381, 383], [382, 384, 402], [383, 385], [369, 384, 386], [385, 387], [386, 388, 403], [387, 389], [370, 388, 390], [389, 391], [390, 392, 404], [391, 393], [371, 392, 394], [393, 395], [394, 396, 405], [395, 397], [372, 396, 398], [397, 399], [398, 406], [375, 408], [379, 412], [383, 416], [387, 420], [391, 424], [395, 428], [399, 432], [408], [400, 407, 409], [408, 410], [409, 411], [410, 412], [401, 411, 413], [412, 414], [413, 415], [414, 416], [402, 415, 417], [416, 418], [417, 419], [418, 420], [403, 419, 421], [420, 422], [421, 423], [422, 424], [404, 423, 425], [424, 426], [425, 427], [426, 428], [405, 427, 429], [428, 430], [429, 431], [430, 432], [406, 431]] -CNOTTIME: [[1, 26], [0, 2], [1, 3], [2, 4], [3, 5, 27], [4, 6], [5, 7], [6, 8], [7, 9, 28], [8, 10], [9, 11], [10, 12], [11, 13, 29], [12, 14], [13, 15], [14, 16], [15, 17, 30], [16, 18], [17, 19], [18, 20], [19, 21, 31], [20, 22], [21, 23], [22, 24], [23, 25, 32], [24], [0, 33], [4, 37], [8, 41], [12, 45], [16, 49], [20, 53], [24, 57], [26, 34], [33, 35], [34, 36, 60], [35, 37], [27, 36, 38], [37, 39], [38, 40, 61], [39, 41], [28, 40, 42], [41, 43], [42, 44, 62], [43, 45], [29, 44, 46], [45, 47], [46, 48, 63], [47, 49], [30, 48, 50], [49, 51], [50, 52, 64], [51, 53], [31, 52, 54], [53, 55], [54, 56, 65], [55, 57], [32, 56, 58], [57, 59], [58, 66], [35, 69], [39, 73], [43, 77], [47, 81], [51, 85], [55, 89], [59, 93], [68, 94], [67, 69], [60, 68, 70], [69, 71], [70, 72, 95], [71, 73], [61, 72, 74], [73, 75], [74, 76, 96], [75, 77], [62, 76, 78], [77, 79], [78, 80, 97], [79, 81], [63, 80, 82], [81, 83], [82, 84, 98], [83, 85], [64, 84, 86], [85, 87], [86, 88, 99], [87, 89], [65, 88, 90], [89, 91], [90, 92, 100], [91, 93], [66, 92], [67, 101], [71, 105], [75, 109], [79, 113], [83, 117], [87, 121], [91, 125], [94, 102], [101, 103], [102, 104, 128], [103, 105], [95, 104, 106], [105, 107], [106, 108, 129], [107, 109], [96, 108, 110], [109, 111], [110, 112, 130], [111, 113], [97, 112, 114], [113, 115], [114, 116, 131], [115, 117], [98, 116, 118], [117, 119], [118, 120, 132], [119, 121], [99, 120, 122], [121, 123], [122, 124, 133], [123, 125], [100, 124, 126], [125, 127], [126, 134], [103, 137], [107, 141], [111, 145], [115, 149], [119, 153], [123, 157], [127, 161], [136, 162], [135, 137], [128, 136, 138], [137, 139], [138, 140, 163], [139, 141], [129, 140, 142], [141, 143], [142, 144, 164], [143, 145], [130, 144, 146], [145, 147], [146, 148, 165], [147, 149], [131, 148, 150], [149, 151], [150, 152, 166], [151, 153], [132, 152, 154], [153, 155], [154, 156, 167], [155, 157], [133, 156, 158], [157, 159], [158, 160, 168], [159, 161], [134, 160], [135, 169], [139, 173], [143, 177], [147, 181], [151, 185], [155, 189], [159, 193], [162, 170], [169, 171], [170, 172, 196], [171, 173], [163, 172, 174], [173, 175], [174, 176, 197], [175, 177], [164, 176, 178], [177, 179], [178, 180, 198], [179, 181], [165, 180, 182], [181, 183], [182, 184, 199], [183, 185], [166, 184, 186], [185, 187], [186, 188, 200], [187, 189], [167, 188, 190], [189, 191], [190, 192, 201], [191, 193], [168, 192, 194], [193, 195], [194, 202], [171, 205], [175, 209], [179, 213], [183, 217], [187, 221], [191, 225], [195, 229], [204, 230], [203, 205], [196, 204, 206], [205, 207], [206, 208, 231], [207, 209], [197, 208, 210], [209, 211], [210, 212, 232], [211, 213], [198, 212, 214], [213, 215], [214, 216, 233], [215, 217], [199, 216, 218], [217, 219], [218, 220, 234], [219, 221], [200, 220, 222], [221, 223], [222, 224, 235], [223, 225], [201, 224, 226], [225, 227], [226, 228, 236], [227, 229], [202, 228], [203, 237], [207, 241], [211, 245], [215, 249], [219, 253], [223, 257], [227, 261], [230, 238], [237, 239], [238, 240, 264], [239, 241], [231, 240, 242], [241, 243], [242, 244, 265], [243, 245], [232, 244, 246], [245, 247], [246, 248, 266], [247, 249], [233, 248, 250], [249, 251], [250, 252, 267], [251, 253], [234, 252, 254], [253, 255], [254, 256, 268], [255, 257], [235, 256, 258], [257, 259], [258, 260, 269], [259, 261], [236, 260, 262], [261, 263], [262, 270], [239, 273], [243, 277], [247, 281], [251, 285], [255, 289], [259, 293], [263, 297], [272, 298], [271, 273], [264, 272, 274], [273, 275], [274, 276, 299], [275, 277], [265, 276, 278], [277, 279], [278, 280, 300], [279, 281], [266, 280, 282], [281, 283], [282, 284, 301], [283, 285], [267, 284, 286], [285, 287], [286, 288, 302], [287, 289], [268, 288, 290], [289, 291], [290, 292, 303], [291, 293], [269, 292, 294], [293, 295], [294, 296, 304], [295, 297], [270, 296], [271, 305], [275, 309], [279, 313], [283, 317], [287, 321], [291, 325], [295, 329], [298, 306], [305, 307], [306, 308, 332], [307, 309], [299, 308, 310], [309, 311], [310, 312, 333], [311, 313], [300, 312, 314], [313, 315], [314, 316, 334], [315, 317], [301, 316, 318], [317, 319], [318, 320, 335], [319, 321], [302, 320, 322], [321, 323], [322, 324, 336], [323, 325], [303, 324, 326], [325, 327], [326, 328, 337], [327, 329], [304, 328, 330], [329, 331], [330, 338], [307, 341], [311, 345], [315, 349], [319, 353], [323, 357], [327, 361], [331, 365], [340, 366], [339, 341], [332, 340, 342], [341, 343], [342, 344, 367], [343, 345], [333, 344, 346], [345, 347], [346, 348, 368], [347, 349], [334, 348, 350], [349, 351], [350, 352, 369], [351, 353], [335, 352, 354], [353, 355], [354, 356, 370], [355, 357], [336, 356, 358], [357, 359], [358, 360, 371], [359, 361], [337, 360, 362], [361, 363], [362, 364, 372], [363, 365], [338, 364], [339, 373], [343, 377], [347, 381], [351, 385], [355, 389], [359, 393], [363, 397], [366, 374], [373, 375], [374, 376, 400], [375, 377], [367, 376, 378], [377, 379], [378, 380, 401], [379, 381], [368, 380, 382], [381, 383], [382, 384, 402], [383, 385], [369, 384, 386], [385, 387], [386, 388, 403], [387, 389], [370, 388, 390], [389, 391], [390, 392, 404], [391, 393], [371, 392, 394], [393, 395], [394, 396, 405], [395, 397], [372, 396, 398], [397, 399], [398, 406], [375, 408], [379, 412], [383, 416], [387, 420], [391, 424], [395, 428], [399, 432], [408], [400, 407, 409], [408, 410], [409, 411], [410, 412], [401, 411, 413], [412, 414], [413, 415], [414, 416], [402, 415, 417], [416, 418], [417, 419], [418, 420], [403, 419, 421], [420, 422], [421, 423], [422, 424], [404, 423, 425], [424, 426], [425, 427], [426, 428], [405, 427, 429], [428, 430], [429, 431], [430, 432], [406, 431]] +CNOTERROR: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] +CNOTTIME: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] diff --git a/benchmark/topology/topo_5105.layout b/benchmark/topology/topo_5105.layout index 0d02ec72a..bf4d131ea 100644 --- a/benchmark/topology/topo_5105.layout +++ b/benchmark/topology/topo_5105.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1, 90], [0, 2], [1, 3], [2, 4], [3, 5, 91], [4, 6], [5, 7], [6, 8], [7, 9, 92], [8, 10], [9, 11], [10, 12], [11, 13, 93], [12, 14], [13, 15], [14, 16], [15, 17, 94], [16, 18], [17, 19], [18, 20], [19, 21, 95], [20, 22], [21, 23], [22, 24], [23, 25, 96], [24, 26], [25, 27], [26, 28], [27, 29, 97], [28, 30], [29, 31], [30, 32], [31, 33, 98], [32, 34], [33, 35], [34, 36], [35, 37, 99], [36, 38], [37, 39], [38, 40], [39, 41, 100], [40, 42], [41, 43], [42, 44], [43, 45, 101], [44, 46], [45, 47], [46, 48], [47, 49, 102], [48, 50], [49, 51], [50, 52], [51, 53, 103], [52, 54], [53, 55], [54, 56], [55, 57, 104], [56, 58], [57, 59], [58, 60], [59, 61, 105], [60, 62], [61, 63], [62, 64], [63, 65, 106], [64, 66], [65, 67], [66, 68], [67, 69, 107], [68, 70], [69, 71], [70, 72], [71, 73, 108], [72, 74], [73, 75], [74, 76], [75, 77, 109], [76, 78], [77, 79], [78, 80], [79, 81, 110], [80, 82], [81, 83], [82, 84], [83, 85, 111], [84, 86], [85, 87], [86, 88], [87, 89, 112], [88], [0, 113], [4, 117], [8, 121], [12, 125], [16, 129], [20, 133], [24, 137], [28, 141], [32, 145], [36, 149], [40, 153], [44, 157], [48, 161], [52, 165], [56, 169], [60, 173], [64, 177], [68, 181], [72, 185], [76, 189], [80, 193], [84, 197], [88, 201], [90, 114], [113, 115], [114, 116, 204], [115, 117], [91, 116, 118], [117, 119], [118, 120, 205], [119, 121], [92, 120, 122], [121, 123], [122, 124, 206], [123, 125], [93, 124, 126], [125, 127], [126, 128, 207], [127, 129], [94, 128, 130], [129, 131], [130, 132, 208], [131, 133], [95, 132, 134], [133, 135], [134, 136, 209], [135, 137], [96, 136, 138], [137, 139], [138, 140, 210], [139, 141], [97, 140, 142], [141, 143], [142, 144, 211], [143, 145], [98, 144, 146], [145, 147], [146, 148, 212], [147, 149], [99, 148, 150], [149, 151], [150, 152, 213], [151, 153], [100, 152, 154], [153, 155], [154, 156, 214], [155, 157], [101, 156, 158], [157, 159], [158, 160, 215], [159, 161], [102, 160, 162], [161, 163], [162, 164, 216], [163, 165], [103, 164, 166], [165, 167], [166, 168, 217], [167, 169], [104, 168, 170], [169, 171], [170, 172, 218], [171, 173], [105, 172, 174], [173, 175], [174, 176, 219], [175, 177], [106, 176, 178], [177, 179], [178, 180, 220], [179, 181], [107, 180, 182], [181, 183], [182, 184, 221], [183, 185], [108, 184, 186], [185, 187], [186, 188, 222], [187, 189], [109, 188, 190], [189, 191], [190, 192, 223], [191, 193], [110, 192, 194], [193, 195], [194, 196, 224], [195, 197], [111, 196, 198], [197, 199], [198, 200, 225], [199, 201], [112, 200, 202], [201, 203], [202, 226], [115, 229], [119, 233], [123, 237], [127, 241], [131, 245], [135, 249], [139, 253], [143, 257], [147, 261], [151, 265], [155, 269], [159, 273], [163, 277], [167, 281], [171, 285], [175, 289], [179, 293], [183, 297], [187, 301], [191, 305], [195, 309], [199, 313], [203, 317], [228, 318], [227, 229], [204, 228, 230], [229, 231], [230, 232, 319], [231, 233], [205, 232, 234], [233, 235], [234, 236, 320], [235, 237], [206, 236, 238], [237, 239], [238, 240, 321], [239, 241], [207, 240, 242], [241, 243], [242, 244, 322], [243, 245], [208, 244, 246], [245, 247], [246, 248, 323], [247, 249], [209, 248, 250], [249, 251], [250, 252, 324], [251, 253], [210, 252, 254], [253, 255], [254, 256, 325], [255, 257], [211, 256, 258], [257, 259], [258, 260, 326], [259, 261], [212, 260, 262], [261, 263], [262, 264, 327], [263, 265], [213, 264, 266], [265, 267], [266, 268, 328], [267, 269], [214, 268, 270], [269, 271], [270, 272, 329], [271, 273], [215, 272, 274], [273, 275], [274, 276, 330], [275, 277], [216, 276, 278], [277, 279], [278, 280, 331], [279, 281], [217, 280, 282], [281, 283], [282, 284, 332], [283, 285], [218, 284, 286], [285, 287], [286, 288, 333], [287, 289], [219, 288, 290], [289, 291], [290, 292, 334], [291, 293], [220, 292, 294], [293, 295], [294, 296, 335], [295, 297], [221, 296, 298], [297, 299], [298, 300, 336], [299, 301], [222, 300, 302], [301, 303], [302, 304, 337], [303, 305], [223, 304, 306], [305, 307], [306, 308, 338], [307, 309], [224, 308, 310], [309, 311], [310, 312, 339], [311, 313], [225, 312, 314], [313, 315], [314, 316, 340], [315, 317], [226, 316], [227, 341], [231, 345], [235, 349], [239, 353], [243, 357], [247, 361], [251, 365], [255, 369], [259, 373], [263, 377], [267, 381], [271, 385], [275, 389], [279, 393], [283, 397], [287, 401], [291, 405], [295, 409], [299, 413], [303, 417], [307, 421], [311, 425], [315, 429], [318, 342], [341, 343], [342, 344, 432], [343, 345], [319, 344, 346], [345, 347], [346, 348, 433], [347, 349], [320, 348, 350], [349, 351], [350, 352, 434], [351, 353], [321, 352, 354], [353, 355], [354, 356, 435], [355, 357], [322, 356, 358], [357, 359], [358, 360, 436], [359, 361], [323, 360, 362], [361, 363], [362, 364, 437], [363, 365], [324, 364, 366], [365, 367], [366, 368, 438], [367, 369], [325, 368, 370], [369, 371], [370, 372, 439], [371, 373], [326, 372, 374], [373, 375], [374, 376, 440], [375, 377], [327, 376, 378], [377, 379], [378, 380, 441], [379, 381], [328, 380, 382], [381, 383], [382, 384, 442], [383, 385], [329, 384, 386], [385, 387], [386, 388, 443], [387, 389], [330, 388, 390], [389, 391], [390, 392, 444], [391, 393], [331, 392, 394], [393, 395], [394, 396, 445], [395, 397], [332, 396, 398], [397, 399], [398, 400, 446], [399, 401], [333, 400, 402], [401, 403], [402, 404, 447], [403, 405], [334, 404, 406], [405, 407], [406, 408, 448], [407, 409], [335, 408, 410], [409, 411], [410, 412, 449], [411, 413], [336, 412, 414], [413, 415], [414, 416, 450], [415, 417], [337, 416, 418], [417, 419], [418, 420, 451], [419, 421], [338, 420, 422], [421, 423], [422, 424, 452], [423, 425], [339, 424, 426], [425, 427], [426, 428, 453], [427, 429], [340, 428, 430], [429, 431], [430, 454], [343, 457], [347, 461], [351, 465], [355, 469], [359, 473], [363, 477], [367, 481], [371, 485], [375, 489], [379, 493], [383, 497], [387, 501], [391, 505], [395, 509], [399, 513], [403, 517], [407, 521], [411, 525], [415, 529], [419, 533], [423, 537], [427, 541], [431, 545], [456, 546], [455, 457], [432, 456, 458], [457, 459], [458, 460, 547], [459, 461], [433, 460, 462], [461, 463], [462, 464, 548], [463, 465], [434, 464, 466], [465, 467], [466, 468, 549], [467, 469], [435, 468, 470], [469, 471], [470, 472, 550], [471, 473], [436, 472, 474], [473, 475], [474, 476, 551], [475, 477], [437, 476, 478], [477, 479], [478, 480, 552], [479, 481], [438, 480, 482], [481, 483], [482, 484, 553], [483, 485], [439, 484, 486], [485, 487], [486, 488, 554], [487, 489], [440, 488, 490], [489, 491], [490, 492, 555], [491, 493], [441, 492, 494], [493, 495], [494, 496, 556], [495, 497], [442, 496, 498], [497, 499], [498, 500, 557], [499, 501], [443, 500, 502], [501, 503], [502, 504, 558], [503, 505], [444, 504, 506], [505, 507], [506, 508, 559], [507, 509], [445, 508, 510], [509, 511], [510, 512, 560], [511, 513], [446, 512, 514], [513, 515], [514, 516, 561], [515, 517], [447, 516, 518], [517, 519], [518, 520, 562], [519, 521], [448, 520, 522], [521, 523], [522, 524, 563], [523, 525], [449, 524, 526], [525, 527], [526, 528, 564], [527, 529], [450, 528, 530], [529, 531], [530, 532, 565], [531, 533], [451, 532, 534], [533, 535], [534, 536, 566], [535, 537], [452, 536, 538], [537, 539], [538, 540, 567], [539, 541], [453, 540, 542], [541, 543], [542, 544, 568], [543, 545], [454, 544], [455, 569], [459, 573], [463, 577], [467, 581], [471, 585], [475, 589], [479, 593], [483, 597], [487, 601], [491, 605], [495, 609], [499, 613], [503, 617], [507, 621], [511, 625], [515, 629], [519, 633], [523, 637], [527, 641], [531, 645], [535, 649], [539, 653], [543, 657], [546, 570], [569, 571], [570, 572, 660], [571, 573], [547, 572, 574], [573, 575], [574, 576, 661], [575, 577], [548, 576, 578], [577, 579], [578, 580, 662], [579, 581], [549, 580, 582], [581, 583], [582, 584, 663], [583, 585], [550, 584, 586], [585, 587], [586, 588, 664], [587, 589], [551, 588, 590], [589, 591], [590, 592, 665], [591, 593], [552, 592, 594], [593, 595], [594, 596, 666], [595, 597], [553, 596, 598], [597, 599], [598, 600, 667], [599, 601], [554, 600, 602], [601, 603], [602, 604, 668], [603, 605], [555, 604, 606], [605, 607], [606, 608, 669], [607, 609], [556, 608, 610], [609, 611], [610, 612, 670], [611, 613], [557, 612, 614], [613, 615], [614, 616, 671], [615, 617], [558, 616, 618], [617, 619], [618, 620, 672], [619, 621], [559, 620, 622], [621, 623], [622, 624, 673], [623, 625], [560, 624, 626], [625, 627], [626, 628, 674], [627, 629], [561, 628, 630], [629, 631], [630, 632, 675], [631, 633], [562, 632, 634], [633, 635], [634, 636, 676], [635, 637], [563, 636, 638], [637, 639], [638, 640, 677], [639, 641], [564, 640, 642], [641, 643], [642, 644, 678], [643, 645], [565, 644, 646], [645, 647], [646, 648, 679], [647, 649], [566, 648, 650], [649, 651], [650, 652, 680], [651, 653], [567, 652, 654], [653, 655], [654, 656, 681], [655, 657], [568, 656, 658], [657, 659], [658, 682], [571, 685], [575, 689], [579, 693], [583, 697], [587, 701], [591, 705], [595, 709], [599, 713], [603, 717], [607, 721], [611, 725], [615, 729], [619, 733], [623, 737], [627, 741], [631, 745], [635, 749], [639, 753], [643, 757], [647, 761], [651, 765], [655, 769], [659, 773], [684, 774], [683, 685], [660, 684, 686], [685, 687], [686, 688, 775], [687, 689], [661, 688, 690], [689, 691], [690, 692, 776], [691, 693], [662, 692, 694], [693, 695], [694, 696, 777], [695, 697], [663, 696, 698], [697, 699], [698, 700, 778], [699, 701], [664, 700, 702], [701, 703], [702, 704, 779], [703, 705], [665, 704, 706], [705, 707], [706, 708, 780], [707, 709], [666, 708, 710], [709, 711], [710, 712, 781], [711, 713], [667, 712, 714], [713, 715], [714, 716, 782], [715, 717], [668, 716, 718], [717, 719], [718, 720, 783], [719, 721], [669, 720, 722], [721, 723], [722, 724, 784], [723, 725], [670, 724, 726], [725, 727], [726, 728, 785], [727, 729], [671, 728, 730], [729, 731], [730, 732, 786], [731, 733], [672, 732, 734], [733, 735], [734, 736, 787], [735, 737], [673, 736, 738], [737, 739], [738, 740, 788], [739, 741], [674, 740, 742], [741, 743], [742, 744, 789], [743, 745], [675, 744, 746], [745, 747], [746, 748, 790], [747, 749], [676, 748, 750], [749, 751], [750, 752, 791], [751, 753], [677, 752, 754], [753, 755], [754, 756, 792], [755, 757], [678, 756, 758], [757, 759], [758, 760, 793], [759, 761], [679, 760, 762], [761, 763], [762, 764, 794], [763, 765], [680, 764, 766], [765, 767], [766, 768, 795], [767, 769], [681, 768, 770], [769, 771], [770, 772, 796], [771, 773], [682, 772], [683, 797], [687, 801], [691, 805], [695, 809], [699, 813], [703, 817], [707, 821], [711, 825], [715, 829], [719, 833], [723, 837], [727, 841], [731, 845], [735, 849], [739, 853], [743, 857], [747, 861], [751, 865], [755, 869], [759, 873], [763, 877], [767, 881], [771, 885], [774, 798], [797, 799], [798, 800, 888], [799, 801], [775, 800, 802], [801, 803], [802, 804, 889], [803, 805], [776, 804, 806], [805, 807], [806, 808, 890], [807, 809], [777, 808, 810], [809, 811], [810, 812, 891], [811, 813], [778, 812, 814], [813, 815], [814, 816, 892], [815, 817], [779, 816, 818], [817, 819], [818, 820, 893], [819, 821], [780, 820, 822], [821, 823], [822, 824, 894], [823, 825], [781, 824, 826], [825, 827], [826, 828, 895], [827, 829], [782, 828, 830], [829, 831], [830, 832, 896], [831, 833], [783, 832, 834], [833, 835], [834, 836, 897], [835, 837], [784, 836, 838], [837, 839], [838, 840, 898], [839, 841], [785, 840, 842], [841, 843], [842, 844, 899], [843, 845], [786, 844, 846], [845, 847], [846, 848, 900], [847, 849], [787, 848, 850], [849, 851], [850, 852, 901], [851, 853], [788, 852, 854], [853, 855], [854, 856, 902], [855, 857], [789, 856, 858], [857, 859], [858, 860, 903], [859, 861], [790, 860, 862], [861, 863], [862, 864, 904], [863, 865], [791, 864, 866], [865, 867], [866, 868, 905], [867, 869], [792, 868, 870], [869, 871], [870, 872, 906], [871, 873], [793, 872, 874], [873, 875], [874, 876, 907], [875, 877], [794, 876, 878], [877, 879], [878, 880, 908], [879, 881], [795, 880, 882], [881, 883], [882, 884, 909], [883, 885], [796, 884, 886], [885, 887], [886, 910], [799, 913], [803, 917], [807, 921], [811, 925], [815, 929], [819, 933], [823, 937], [827, 941], [831, 945], [835, 949], [839, 953], [843, 957], [847, 961], [851, 965], [855, 969], [859, 973], [863, 977], [867, 981], [871, 985], [875, 989], [879, 993], [883, 997], [887, 1001], [912, 1002], [911, 913], [888, 912, 914], [913, 915], [914, 916, 1003], [915, 917], [889, 916, 918], [917, 919], [918, 920, 1004], [919, 921], [890, 920, 922], [921, 923], [922, 924, 1005], [923, 925], [891, 924, 926], [925, 927], [926, 928, 1006], [927, 929], [892, 928, 930], [929, 931], [930, 932, 1007], [931, 933], [893, 932, 934], [933, 935], [934, 936, 1008], [935, 937], [894, 936, 938], [937, 939], [938, 940, 1009], [939, 941], [895, 940, 942], [941, 943], [942, 944, 1010], [943, 945], [896, 944, 946], [945, 947], [946, 948, 1011], [947, 949], [897, 948, 950], [949, 951], [950, 952, 1012], [951, 953], [898, 952, 954], [953, 955], [954, 956, 1013], [955, 957], [899, 956, 958], [957, 959], [958, 960, 1014], [959, 961], [900, 960, 962], [961, 963], [962, 964, 1015], [963, 965], [901, 964, 966], [965, 967], [966, 968, 1016], [967, 969], [902, 968, 970], [969, 971], [970, 972, 1017], [971, 973], [903, 972, 974], [973, 975], [974, 976, 1018], [975, 977], [904, 976, 978], [977, 979], [978, 980, 1019], [979, 981], [905, 980, 982], [981, 983], [982, 984, 1020], [983, 985], [906, 984, 986], [985, 987], [986, 988, 1021], [987, 989], [907, 988, 990], [989, 991], [990, 992, 1022], [991, 993], [908, 992, 994], [993, 995], [994, 996, 1023], [995, 997], [909, 996, 998], [997, 999], [998, 1000, 1024], [999, 1001], [910, 1000], [911, 1025], [915, 1029], [919, 1033], [923, 1037], [927, 1041], [931, 1045], [935, 1049], [939, 1053], [943, 1057], [947, 1061], [951, 1065], [955, 1069], [959, 1073], [963, 1077], [967, 1081], [971, 1085], [975, 1089], [979, 1093], [983, 1097], [987, 1101], [991, 1105], [995, 1109], [999, 1113], [1002, 1026], [1025, 1027], [1026, 1028, 1116], [1027, 1029], [1003, 1028, 1030], [1029, 1031], [1030, 1032, 1117], [1031, 1033], [1004, 1032, 1034], [1033, 1035], [1034, 1036, 1118], [1035, 1037], [1005, 1036, 1038], [1037, 1039], [1038, 1040, 1119], [1039, 1041], [1006, 1040, 1042], [1041, 1043], [1042, 1044, 1120], [1043, 1045], [1007, 1044, 1046], [1045, 1047], [1046, 1048, 1121], [1047, 1049], [1008, 1048, 1050], [1049, 1051], [1050, 1052, 1122], [1051, 1053], [1009, 1052, 1054], [1053, 1055], [1054, 1056, 1123], [1055, 1057], [1010, 1056, 1058], [1057, 1059], [1058, 1060, 1124], [1059, 1061], [1011, 1060, 1062], [1061, 1063], [1062, 1064, 1125], [1063, 1065], [1012, 1064, 1066], [1065, 1067], [1066, 1068, 1126], [1067, 1069], [1013, 1068, 1070], [1069, 1071], [1070, 1072, 1127], [1071, 1073], [1014, 1072, 1074], [1073, 1075], [1074, 1076, 1128], [1075, 1077], [1015, 1076, 1078], [1077, 1079], [1078, 1080, 1129], [1079, 1081], [1016, 1080, 1082], [1081, 1083], [1082, 1084, 1130], [1083, 1085], [1017, 1084, 1086], [1085, 1087], [1086, 1088, 1131], [1087, 1089], [1018, 1088, 1090], [1089, 1091], [1090, 1092, 1132], [1091, 1093], [1019, 1092, 1094], [1093, 1095], [1094, 1096, 1133], [1095, 1097], [1020, 1096, 1098], [1097, 1099], [1098, 1100, 1134], [1099, 1101], [1021, 1100, 1102], [1101, 1103], [1102, 1104, 1135], [1103, 1105], [1022, 1104, 1106], [1105, 1107], [1106, 1108, 1136], [1107, 1109], [1023, 1108, 1110], [1109, 1111], [1110, 1112, 1137], [1111, 1113], [1024, 1112, 1114], [1113, 1115], [1114, 1138], [1027, 1141], [1031, 1145], [1035, 1149], [1039, 1153], [1043, 1157], [1047, 1161], [1051, 1165], [1055, 1169], [1059, 1173], [1063, 1177], [1067, 1181], [1071, 1185], [1075, 1189], [1079, 1193], [1083, 1197], [1087, 1201], [1091, 1205], [1095, 1209], [1099, 1213], [1103, 1217], [1107, 1221], [1111, 1225], [1115, 1229], [1140, 1230], [1139, 1141], [1116, 1140, 1142], [1141, 1143], [1142, 1144, 1231], [1143, 1145], [1117, 1144, 1146], [1145, 1147], [1146, 1148, 1232], [1147, 1149], [1118, 1148, 1150], [1149, 1151], [1150, 1152, 1233], [1151, 1153], [1119, 1152, 1154], [1153, 1155], [1154, 1156, 1234], [1155, 1157], [1120, 1156, 1158], [1157, 1159], [1158, 1160, 1235], [1159, 1161], [1121, 1160, 1162], [1161, 1163], [1162, 1164, 1236], [1163, 1165], [1122, 1164, 1166], [1165, 1167], [1166, 1168, 1237], [1167, 1169], [1123, 1168, 1170], [1169, 1171], [1170, 1172, 1238], [1171, 1173], [1124, 1172, 1174], [1173, 1175], [1174, 1176, 1239], [1175, 1177], [1125, 1176, 1178], [1177, 1179], [1178, 1180, 1240], [1179, 1181], [1126, 1180, 1182], [1181, 1183], [1182, 1184, 1241], [1183, 1185], [1127, 1184, 1186], [1185, 1187], [1186, 1188, 1242], [1187, 1189], [1128, 1188, 1190], [1189, 1191], [1190, 1192, 1243], [1191, 1193], [1129, 1192, 1194], [1193, 1195], [1194, 1196, 1244], [1195, 1197], [1130, 1196, 1198], [1197, 1199], [1198, 1200, 1245], [1199, 1201], [1131, 1200, 1202], [1201, 1203], [1202, 1204, 1246], [1203, 1205], [1132, 1204, 1206], [1205, 1207], [1206, 1208, 1247], [1207, 1209], [1133, 1208, 1210], [1209, 1211], [1210, 1212, 1248], [1211, 1213], [1134, 1212, 1214], [1213, 1215], [1214, 1216, 1249], [1215, 1217], [1135, 1216, 1218], [1217, 1219], [1218, 1220, 1250], [1219, 1221], [1136, 1220, 1222], [1221, 1223], [1222, 1224, 1251], [1223, 1225], [1137, 1224, 1226], [1225, 1227], [1226, 1228, 1252], [1227, 1229], [1138, 1228], [1139, 1253], [1143, 1257], [1147, 1261], [1151, 1265], [1155, 1269], [1159, 1273], [1163, 1277], [1167, 1281], [1171, 1285], [1175, 1289], [1179, 1293], [1183, 1297], [1187, 1301], [1191, 1305], [1195, 1309], [1199, 1313], [1203, 1317], [1207, 1321], [1211, 1325], [1215, 1329], [1219, 1333], [1223, 1337], [1227, 1341], [1230, 1254], [1253, 1255], [1254, 1256, 1344], [1255, 1257], [1231, 1256, 1258], [1257, 1259], [1258, 1260, 1345], [1259, 1261], [1232, 1260, 1262], [1261, 1263], [1262, 1264, 1346], [1263, 1265], [1233, 1264, 1266], [1265, 1267], [1266, 1268, 1347], [1267, 1269], [1234, 1268, 1270], [1269, 1271], [1270, 1272, 1348], [1271, 1273], [1235, 1272, 1274], [1273, 1275], [1274, 1276, 1349], [1275, 1277], [1236, 1276, 1278], [1277, 1279], [1278, 1280, 1350], [1279, 1281], [1237, 1280, 1282], [1281, 1283], [1282, 1284, 1351], [1283, 1285], [1238, 1284, 1286], [1285, 1287], [1286, 1288, 1352], [1287, 1289], [1239, 1288, 1290], [1289, 1291], [1290, 1292, 1353], [1291, 1293], [1240, 1292, 1294], [1293, 1295], [1294, 1296, 1354], [1295, 1297], [1241, 1296, 1298], [1297, 1299], [1298, 1300, 1355], [1299, 1301], [1242, 1300, 1302], [1301, 1303], [1302, 1304, 1356], [1303, 1305], [1243, 1304, 1306], [1305, 1307], [1306, 1308, 1357], [1307, 1309], [1244, 1308, 1310], [1309, 1311], [1310, 1312, 1358], [1311, 1313], [1245, 1312, 1314], [1313, 1315], [1314, 1316, 1359], [1315, 1317], [1246, 1316, 1318], [1317, 1319], [1318, 1320, 1360], [1319, 1321], [1247, 1320, 1322], [1321, 1323], [1322, 1324, 1361], [1323, 1325], [1248, 1324, 1326], [1325, 1327], [1326, 1328, 1362], [1327, 1329], [1249, 1328, 1330], [1329, 1331], [1330, 1332, 1363], [1331, 1333], [1250, 1332, 1334], [1333, 1335], [1334, 1336, 1364], [1335, 1337], [1251, 1336, 1338], [1337, 1339], [1338, 1340, 1365], [1339, 1341], [1252, 1340, 1342], [1341, 1343], [1342, 1366], [1255, 1369], [1259, 1373], [1263, 1377], [1267, 1381], [1271, 1385], [1275, 1389], [1279, 1393], [1283, 1397], [1287, 1401], [1291, 1405], [1295, 1409], [1299, 1413], [1303, 1417], [1307, 1421], [1311, 1425], [1315, 1429], [1319, 1433], [1323, 1437], [1327, 1441], [1331, 1445], [1335, 1449], [1339, 1453], [1343, 1457], [1368, 1458], [1367, 1369], [1344, 1368, 1370], [1369, 1371], [1370, 1372, 1459], [1371, 1373], [1345, 1372, 1374], [1373, 1375], [1374, 1376, 1460], [1375, 1377], [1346, 1376, 1378], [1377, 1379], [1378, 1380, 1461], [1379, 1381], [1347, 1380, 1382], [1381, 1383], [1382, 1384, 1462], [1383, 1385], [1348, 1384, 1386], [1385, 1387], [1386, 1388, 1463], [1387, 1389], [1349, 1388, 1390], [1389, 1391], [1390, 1392, 1464], [1391, 1393], [1350, 1392, 1394], [1393, 1395], [1394, 1396, 1465], [1395, 1397], [1351, 1396, 1398], [1397, 1399], [1398, 1400, 1466], [1399, 1401], [1352, 1400, 1402], [1401, 1403], [1402, 1404, 1467], [1403, 1405], [1353, 1404, 1406], [1405, 1407], [1406, 1408, 1468], [1407, 1409], [1354, 1408, 1410], [1409, 1411], [1410, 1412, 1469], [1411, 1413], [1355, 1412, 1414], [1413, 1415], [1414, 1416, 1470], [1415, 1417], [1356, 1416, 1418], [1417, 1419], [1418, 1420, 1471], [1419, 1421], [1357, 1420, 1422], [1421, 1423], [1422, 1424, 1472], [1423, 1425], [1358, 1424, 1426], [1425, 1427], [1426, 1428, 1473], [1427, 1429], [1359, 1428, 1430], [1429, 1431], [1430, 1432, 1474], [1431, 1433], [1360, 1432, 1434], [1433, 1435], [1434, 1436, 1475], [1435, 1437], [1361, 1436, 1438], [1437, 1439], [1438, 1440, 1476], [1439, 1441], [1362, 1440, 1442], [1441, 1443], [1442, 1444, 1477], [1443, 1445], [1363, 1444, 1446], [1445, 1447], [1446, 1448, 1478], [1447, 1449], [1364, 1448, 1450], [1449, 1451], [1450, 1452, 1479], [1451, 1453], [1365, 1452, 1454], [1453, 1455], [1454, 1456, 1480], [1455, 1457], [1366, 1456], [1367, 1481], [1371, 1485], [1375, 1489], [1379, 1493], [1383, 1497], [1387, 1501], [1391, 1505], [1395, 1509], [1399, 1513], [1403, 1517], [1407, 1521], [1411, 1525], [1415, 1529], [1419, 1533], [1423, 1537], [1427, 1541], [1431, 1545], [1435, 1549], [1439, 1553], [1443, 1557], [1447, 1561], [1451, 1565], [1455, 1569], [1458, 1482], [1481, 1483], [1482, 1484, 1572], [1483, 1485], [1459, 1484, 1486], [1485, 1487], [1486, 1488, 1573], [1487, 1489], [1460, 1488, 1490], [1489, 1491], [1490, 1492, 1574], [1491, 1493], [1461, 1492, 1494], [1493, 1495], [1494, 1496, 1575], [1495, 1497], [1462, 1496, 1498], [1497, 1499], [1498, 1500, 1576], [1499, 1501], [1463, 1500, 1502], [1501, 1503], [1502, 1504, 1577], [1503, 1505], [1464, 1504, 1506], [1505, 1507], [1506, 1508, 1578], [1507, 1509], [1465, 1508, 1510], [1509, 1511], [1510, 1512, 1579], [1511, 1513], [1466, 1512, 1514], [1513, 1515], [1514, 1516, 1580], [1515, 1517], [1467, 1516, 1518], [1517, 1519], [1518, 1520, 1581], [1519, 1521], [1468, 1520, 1522], [1521, 1523], [1522, 1524, 1582], [1523, 1525], [1469, 1524, 1526], [1525, 1527], [1526, 1528, 1583], [1527, 1529], [1470, 1528, 1530], [1529, 1531], [1530, 1532, 1584], [1531, 1533], [1471, 1532, 1534], [1533, 1535], [1534, 1536, 1585], [1535, 1537], [1472, 1536, 1538], [1537, 1539], [1538, 1540, 1586], [1539, 1541], [1473, 1540, 1542], [1541, 1543], [1542, 1544, 1587], [1543, 1545], [1474, 1544, 1546], [1545, 1547], [1546, 1548, 1588], [1547, 1549], [1475, 1548, 1550], [1549, 1551], [1550, 1552, 1589], [1551, 1553], [1476, 1552, 1554], [1553, 1555], [1554, 1556, 1590], [1555, 1557], [1477, 1556, 1558], [1557, 1559], [1558, 1560, 1591], [1559, 1561], [1478, 1560, 1562], [1561, 1563], [1562, 1564, 1592], [1563, 1565], [1479, 1564, 1566], [1565, 1567], [1566, 1568, 1593], [1567, 1569], [1480, 1568, 1570], [1569, 1571], [1570, 1594], [1483, 1597], [1487, 1601], [1491, 1605], [1495, 1609], [1499, 1613], [1503, 1617], [1507, 1621], [1511, 1625], [1515, 1629], [1519, 1633], [1523, 1637], [1527, 1641], [1531, 1645], [1535, 1649], [1539, 1653], [1543, 1657], [1547, 1661], [1551, 1665], [1555, 1669], [1559, 1673], [1563, 1677], [1567, 1681], [1571, 1685], [1596, 1686], [1595, 1597], [1572, 1596, 1598], [1597, 1599], [1598, 1600, 1687], [1599, 1601], [1573, 1600, 1602], [1601, 1603], [1602, 1604, 1688], [1603, 1605], [1574, 1604, 1606], [1605, 1607], [1606, 1608, 1689], [1607, 1609], [1575, 1608, 1610], [1609, 1611], [1610, 1612, 1690], [1611, 1613], [1576, 1612, 1614], [1613, 1615], [1614, 1616, 1691], [1615, 1617], [1577, 1616, 1618], [1617, 1619], [1618, 1620, 1692], [1619, 1621], [1578, 1620, 1622], [1621, 1623], [1622, 1624, 1693], [1623, 1625], [1579, 1624, 1626], [1625, 1627], [1626, 1628, 1694], [1627, 1629], [1580, 1628, 1630], [1629, 1631], [1630, 1632, 1695], [1631, 1633], [1581, 1632, 1634], [1633, 1635], [1634, 1636, 1696], [1635, 1637], [1582, 1636, 1638], [1637, 1639], [1638, 1640, 1697], [1639, 1641], [1583, 1640, 1642], [1641, 1643], [1642, 1644, 1698], [1643, 1645], [1584, 1644, 1646], [1645, 1647], [1646, 1648, 1699], [1647, 1649], [1585, 1648, 1650], [1649, 1651], [1650, 1652, 1700], [1651, 1653], [1586, 1652, 1654], [1653, 1655], [1654, 1656, 1701], [1655, 1657], [1587, 1656, 1658], [1657, 1659], [1658, 1660, 1702], [1659, 1661], [1588, 1660, 1662], [1661, 1663], [1662, 1664, 1703], [1663, 1665], [1589, 1664, 1666], [1665, 1667], [1666, 1668, 1704], [1667, 1669], [1590, 1668, 1670], [1669, 1671], [1670, 1672, 1705], [1671, 1673], [1591, 1672, 1674], [1673, 1675], [1674, 1676, 1706], [1675, 1677], [1592, 1676, 1678], [1677, 1679], [1678, 1680, 1707], [1679, 1681], [1593, 1680, 1682], [1681, 1683], [1682, 1684, 1708], [1683, 1685], [1594, 1684], [1595, 1709], [1599, 1713], [1603, 1717], [1607, 1721], [1611, 1725], [1615, 1729], [1619, 1733], [1623, 1737], [1627, 1741], [1631, 1745], [1635, 1749], [1639, 1753], [1643, 1757], [1647, 1761], [1651, 1765], [1655, 1769], [1659, 1773], [1663, 1777], [1667, 1781], [1671, 1785], [1675, 1789], [1679, 1793], [1683, 1797], [1686, 1710], [1709, 1711], [1710, 1712, 1800], [1711, 1713], [1687, 1712, 1714], [1713, 1715], [1714, 1716, 1801], [1715, 1717], [1688, 1716, 1718], [1717, 1719], [1718, 1720, 1802], [1719, 1721], [1689, 1720, 1722], [1721, 1723], [1722, 1724, 1803], [1723, 1725], [1690, 1724, 1726], [1725, 1727], [1726, 1728, 1804], [1727, 1729], [1691, 1728, 1730], [1729, 1731], [1730, 1732, 1805], [1731, 1733], [1692, 1732, 1734], [1733, 1735], [1734, 1736, 1806], [1735, 1737], [1693, 1736, 1738], [1737, 1739], [1738, 1740, 1807], [1739, 1741], [1694, 1740, 1742], [1741, 1743], [1742, 1744, 1808], [1743, 1745], [1695, 1744, 1746], [1745, 1747], [1746, 1748, 1809], [1747, 1749], [1696, 1748, 1750], [1749, 1751], [1750, 1752, 1810], [1751, 1753], [1697, 1752, 1754], [1753, 1755], [1754, 1756, 1811], [1755, 1757], [1698, 1756, 1758], [1757, 1759], [1758, 1760, 1812], [1759, 1761], [1699, 1760, 1762], [1761, 1763], [1762, 1764, 1813], [1763, 1765], [1700, 1764, 1766], [1765, 1767], [1766, 1768, 1814], [1767, 1769], [1701, 1768, 1770], [1769, 1771], [1770, 1772, 1815], [1771, 1773], [1702, 1772, 1774], [1773, 1775], [1774, 1776, 1816], [1775, 1777], [1703, 1776, 1778], [1777, 1779], [1778, 1780, 1817], [1779, 1781], [1704, 1780, 1782], [1781, 1783], [1782, 1784, 1818], [1783, 1785], [1705, 1784, 1786], [1785, 1787], [1786, 1788, 1819], [1787, 1789], [1706, 1788, 1790], [1789, 1791], [1790, 1792, 1820], [1791, 1793], [1707, 1792, 1794], [1793, 1795], [1794, 1796, 1821], [1795, 1797], [1708, 1796, 1798], [1797, 1799], [1798, 1822], [1711, 1825], [1715, 1829], [1719, 1833], [1723, 1837], [1727, 1841], [1731, 1845], [1735, 1849], [1739, 1853], [1743, 1857], [1747, 1861], [1751, 1865], [1755, 1869], [1759, 1873], [1763, 1877], [1767, 1881], [1771, 1885], [1775, 1889], [1779, 1893], [1783, 1897], [1787, 1901], [1791, 1905], [1795, 1909], [1799, 1913], [1824, 1914], [1823, 1825], [1800, 1824, 1826], [1825, 1827], [1826, 1828, 1915], [1827, 1829], [1801, 1828, 1830], [1829, 1831], [1830, 1832, 1916], [1831, 1833], [1802, 1832, 1834], [1833, 1835], [1834, 1836, 1917], [1835, 1837], [1803, 1836, 1838], [1837, 1839], [1838, 1840, 1918], [1839, 1841], [1804, 1840, 1842], [1841, 1843], [1842, 1844, 1919], [1843, 1845], [1805, 1844, 1846], [1845, 1847], [1846, 1848, 1920], [1847, 1849], [1806, 1848, 1850], [1849, 1851], [1850, 1852, 1921], [1851, 1853], [1807, 1852, 1854], [1853, 1855], [1854, 1856, 1922], [1855, 1857], [1808, 1856, 1858], [1857, 1859], [1858, 1860, 1923], [1859, 1861], [1809, 1860, 1862], [1861, 1863], [1862, 1864, 1924], [1863, 1865], [1810, 1864, 1866], [1865, 1867], [1866, 1868, 1925], [1867, 1869], [1811, 1868, 1870], [1869, 1871], [1870, 1872, 1926], [1871, 1873], [1812, 1872, 1874], [1873, 1875], [1874, 1876, 1927], [1875, 1877], [1813, 1876, 1878], [1877, 1879], [1878, 1880, 1928], [1879, 1881], [1814, 1880, 1882], [1881, 1883], [1882, 1884, 1929], [1883, 1885], [1815, 1884, 1886], [1885, 1887], [1886, 1888, 1930], [1887, 1889], [1816, 1888, 1890], [1889, 1891], [1890, 1892, 1931], [1891, 1893], [1817, 1892, 1894], [1893, 1895], [1894, 1896, 1932], [1895, 1897], [1818, 1896, 1898], [1897, 1899], [1898, 1900, 1933], [1899, 1901], [1819, 1900, 1902], [1901, 1903], [1902, 1904, 1934], [1903, 1905], [1820, 1904, 1906], [1905, 1907], [1906, 1908, 1935], [1907, 1909], [1821, 1908, 1910], [1909, 1911], [1910, 1912, 1936], [1911, 1913], [1822, 1912], [1823, 1937], [1827, 1941], [1831, 1945], [1835, 1949], [1839, 1953], [1843, 1957], [1847, 1961], [1851, 1965], [1855, 1969], [1859, 1973], [1863, 1977], [1867, 1981], [1871, 1985], [1875, 1989], [1879, 1993], [1883, 1997], [1887, 2001], [1891, 2005], [1895, 2009], [1899, 2013], [1903, 2017], [1907, 2021], [1911, 2025], [1914, 1938], [1937, 1939], [1938, 1940, 2028], [1939, 1941], [1915, 1940, 1942], [1941, 1943], [1942, 1944, 2029], [1943, 1945], [1916, 1944, 1946], [1945, 1947], [1946, 1948, 2030], [1947, 1949], [1917, 1948, 1950], [1949, 1951], [1950, 1952, 2031], [1951, 1953], [1918, 1952, 1954], [1953, 1955], [1954, 1956, 2032], [1955, 1957], [1919, 1956, 1958], [1957, 1959], [1958, 1960, 2033], [1959, 1961], [1920, 1960, 1962], [1961, 1963], [1962, 1964, 2034], [1963, 1965], [1921, 1964, 1966], [1965, 1967], [1966, 1968, 2035], [1967, 1969], [1922, 1968, 1970], [1969, 1971], [1970, 1972, 2036], [1971, 1973], [1923, 1972, 1974], [1973, 1975], [1974, 1976, 2037], [1975, 1977], [1924, 1976, 1978], [1977, 1979], [1978, 1980, 2038], [1979, 1981], [1925, 1980, 1982], [1981, 1983], [1982, 1984, 2039], [1983, 1985], [1926, 1984, 1986], [1985, 1987], [1986, 1988, 2040], [1987, 1989], [1927, 1988, 1990], [1989, 1991], [1990, 1992, 2041], [1991, 1993], [1928, 1992, 1994], [1993, 1995], [1994, 1996, 2042], [1995, 1997], [1929, 1996, 1998], [1997, 1999], [1998, 2000, 2043], [1999, 2001], [1930, 2000, 2002], [2001, 2003], [2002, 2004, 2044], [2003, 2005], [1931, 2004, 2006], [2005, 2007], [2006, 2008, 2045], [2007, 2009], [1932, 2008, 2010], [2009, 2011], [2010, 2012, 2046], [2011, 2013], [1933, 2012, 2014], [2013, 2015], [2014, 2016, 2047], [2015, 2017], [1934, 2016, 2018], [2017, 2019], [2018, 2020, 2048], [2019, 2021], [1935, 2020, 2022], [2021, 2023], [2022, 2024, 2049], [2023, 2025], [1936, 2024, 2026], [2025, 2027], [2026, 2050], [1939, 2053], [1943, 2057], [1947, 2061], [1951, 2065], [1955, 2069], [1959, 2073], [1963, 2077], [1967, 2081], [1971, 2085], [1975, 2089], [1979, 2093], [1983, 2097], [1987, 2101], [1991, 2105], [1995, 2109], [1999, 2113], [2003, 2117], [2007, 2121], [2011, 2125], [2015, 2129], [2019, 2133], [2023, 2137], [2027, 2141], [2052, 2142], [2051, 2053], [2028, 2052, 2054], [2053, 2055], [2054, 2056, 2143], [2055, 2057], [2029, 2056, 2058], [2057, 2059], [2058, 2060, 2144], [2059, 2061], [2030, 2060, 2062], [2061, 2063], [2062, 2064, 2145], [2063, 2065], [2031, 2064, 2066], [2065, 2067], [2066, 2068, 2146], [2067, 2069], [2032, 2068, 2070], [2069, 2071], [2070, 2072, 2147], [2071, 2073], [2033, 2072, 2074], [2073, 2075], [2074, 2076, 2148], [2075, 2077], [2034, 2076, 2078], [2077, 2079], [2078, 2080, 2149], [2079, 2081], [2035, 2080, 2082], [2081, 2083], [2082, 2084, 2150], [2083, 2085], [2036, 2084, 2086], [2085, 2087], [2086, 2088, 2151], [2087, 2089], [2037, 2088, 2090], [2089, 2091], [2090, 2092, 2152], [2091, 2093], [2038, 2092, 2094], [2093, 2095], [2094, 2096, 2153], [2095, 2097], [2039, 2096, 2098], [2097, 2099], [2098, 2100, 2154], [2099, 2101], [2040, 2100, 2102], [2101, 2103], [2102, 2104, 2155], [2103, 2105], [2041, 2104, 2106], [2105, 2107], [2106, 2108, 2156], [2107, 2109], [2042, 2108, 2110], [2109, 2111], [2110, 2112, 2157], [2111, 2113], [2043, 2112, 2114], [2113, 2115], [2114, 2116, 2158], [2115, 2117], [2044, 2116, 2118], [2117, 2119], [2118, 2120, 2159], [2119, 2121], [2045, 2120, 2122], [2121, 2123], [2122, 2124, 2160], [2123, 2125], [2046, 2124, 2126], [2125, 2127], [2126, 2128, 2161], [2127, 2129], [2047, 2128, 2130], [2129, 2131], [2130, 2132, 2162], [2131, 2133], [2048, 2132, 2134], [2133, 2135], [2134, 2136, 2163], [2135, 2137], [2049, 2136, 2138], [2137, 2139], [2138, 2140, 2164], [2139, 2141], [2050, 2140], [2051, 2165], [2055, 2169], [2059, 2173], [2063, 2177], [2067, 2181], [2071, 2185], [2075, 2189], [2079, 2193], [2083, 2197], [2087, 2201], [2091, 2205], [2095, 2209], [2099, 2213], [2103, 2217], [2107, 2221], [2111, 2225], [2115, 2229], [2119, 2233], [2123, 2237], [2127, 2241], [2131, 2245], [2135, 2249], [2139, 2253], [2142, 2166], [2165, 2167], [2166, 2168, 2256], [2167, 2169], [2143, 2168, 2170], [2169, 2171], [2170, 2172, 2257], [2171, 2173], [2144, 2172, 2174], [2173, 2175], [2174, 2176, 2258], [2175, 2177], [2145, 2176, 2178], [2177, 2179], [2178, 2180, 2259], [2179, 2181], [2146, 2180, 2182], [2181, 2183], [2182, 2184, 2260], [2183, 2185], [2147, 2184, 2186], [2185, 2187], [2186, 2188, 2261], [2187, 2189], [2148, 2188, 2190], [2189, 2191], [2190, 2192, 2262], [2191, 2193], [2149, 2192, 2194], [2193, 2195], [2194, 2196, 2263], [2195, 2197], [2150, 2196, 2198], [2197, 2199], [2198, 2200, 2264], [2199, 2201], [2151, 2200, 2202], [2201, 2203], [2202, 2204, 2265], [2203, 2205], [2152, 2204, 2206], [2205, 2207], [2206, 2208, 2266], [2207, 2209], [2153, 2208, 2210], [2209, 2211], [2210, 2212, 2267], [2211, 2213], [2154, 2212, 2214], [2213, 2215], [2214, 2216, 2268], [2215, 2217], [2155, 2216, 2218], [2217, 2219], [2218, 2220, 2269], [2219, 2221], [2156, 2220, 2222], [2221, 2223], [2222, 2224, 2270], [2223, 2225], [2157, 2224, 2226], [2225, 2227], [2226, 2228, 2271], [2227, 2229], [2158, 2228, 2230], [2229, 2231], [2230, 2232, 2272], [2231, 2233], [2159, 2232, 2234], [2233, 2235], [2234, 2236, 2273], [2235, 2237], [2160, 2236, 2238], [2237, 2239], [2238, 2240, 2274], [2239, 2241], [2161, 2240, 2242], [2241, 2243], [2242, 2244, 2275], [2243, 2245], [2162, 2244, 2246], [2245, 2247], [2246, 2248, 2276], [2247, 2249], [2163, 2248, 2250], [2249, 2251], [2250, 2252, 2277], [2251, 2253], [2164, 2252, 2254], [2253, 2255], [2254, 2278], [2167, 2281], [2171, 2285], [2175, 2289], [2179, 2293], [2183, 2297], [2187, 2301], [2191, 2305], [2195, 2309], [2199, 2313], [2203, 2317], [2207, 2321], [2211, 2325], [2215, 2329], [2219, 2333], [2223, 2337], [2227, 2341], [2231, 2345], [2235, 2349], [2239, 2353], [2243, 2357], [2247, 2361], [2251, 2365], [2255, 2369], [2280, 2370], [2279, 2281], [2256, 2280, 2282], [2281, 2283], [2282, 2284, 2371], [2283, 2285], [2257, 2284, 2286], [2285, 2287], [2286, 2288, 2372], [2287, 2289], [2258, 2288, 2290], [2289, 2291], [2290, 2292, 2373], [2291, 2293], [2259, 2292, 2294], [2293, 2295], [2294, 2296, 2374], [2295, 2297], [2260, 2296, 2298], [2297, 2299], [2298, 2300, 2375], [2299, 2301], [2261, 2300, 2302], [2301, 2303], [2302, 2304, 2376], [2303, 2305], [2262, 2304, 2306], [2305, 2307], [2306, 2308, 2377], [2307, 2309], [2263, 2308, 2310], [2309, 2311], [2310, 2312, 2378], [2311, 2313], [2264, 2312, 2314], [2313, 2315], [2314, 2316, 2379], [2315, 2317], [2265, 2316, 2318], [2317, 2319], [2318, 2320, 2380], [2319, 2321], [2266, 2320, 2322], [2321, 2323], [2322, 2324, 2381], [2323, 2325], [2267, 2324, 2326], [2325, 2327], [2326, 2328, 2382], [2327, 2329], [2268, 2328, 2330], [2329, 2331], [2330, 2332, 2383], [2331, 2333], [2269, 2332, 2334], [2333, 2335], [2334, 2336, 2384], [2335, 2337], [2270, 2336, 2338], [2337, 2339], [2338, 2340, 2385], [2339, 2341], [2271, 2340, 2342], [2341, 2343], [2342, 2344, 2386], [2343, 2345], [2272, 2344, 2346], [2345, 2347], [2346, 2348, 2387], [2347, 2349], [2273, 2348, 2350], [2349, 2351], [2350, 2352, 2388], [2351, 2353], [2274, 2352, 2354], [2353, 2355], [2354, 2356, 2389], [2355, 2357], [2275, 2356, 2358], [2357, 2359], [2358, 2360, 2390], [2359, 2361], [2276, 2360, 2362], [2361, 2363], [2362, 2364, 2391], [2363, 2365], [2277, 2364, 2366], [2365, 2367], [2366, 2368, 2392], [2367, 2369], [2278, 2368], [2279, 2393], [2283, 2397], [2287, 2401], [2291, 2405], [2295, 2409], [2299, 2413], [2303, 2417], [2307, 2421], [2311, 2425], [2315, 2429], [2319, 2433], [2323, 2437], [2327, 2441], [2331, 2445], [2335, 2449], [2339, 2453], [2343, 2457], [2347, 2461], [2351, 2465], [2355, 2469], [2359, 2473], [2363, 2477], [2367, 2481], [2370, 2394], [2393, 2395], [2394, 2396, 2484], [2395, 2397], [2371, 2396, 2398], [2397, 2399], [2398, 2400, 2485], [2399, 2401], [2372, 2400, 2402], [2401, 2403], [2402, 2404, 2486], [2403, 2405], [2373, 2404, 2406], [2405, 2407], [2406, 2408, 2487], [2407, 2409], [2374, 2408, 2410], [2409, 2411], [2410, 2412, 2488], [2411, 2413], [2375, 2412, 2414], [2413, 2415], [2414, 2416, 2489], [2415, 2417], [2376, 2416, 2418], [2417, 2419], [2418, 2420, 2490], [2419, 2421], [2377, 2420, 2422], [2421, 2423], [2422, 2424, 2491], [2423, 2425], [2378, 2424, 2426], [2425, 2427], [2426, 2428, 2492], [2427, 2429], [2379, 2428, 2430], [2429, 2431], [2430, 2432, 2493], [2431, 2433], [2380, 2432, 2434], [2433, 2435], [2434, 2436, 2494], [2435, 2437], [2381, 2436, 2438], [2437, 2439], [2438, 2440, 2495], [2439, 2441], [2382, 2440, 2442], [2441, 2443], [2442, 2444, 2496], [2443, 2445], [2383, 2444, 2446], [2445, 2447], [2446, 2448, 2497], [2447, 2449], [2384, 2448, 2450], [2449, 2451], [2450, 2452, 2498], [2451, 2453], [2385, 2452, 2454], [2453, 2455], [2454, 2456, 2499], [2455, 2457], [2386, 2456, 2458], [2457, 2459], [2458, 2460, 2500], [2459, 2461], [2387, 2460, 2462], [2461, 2463], [2462, 2464, 2501], [2463, 2465], [2388, 2464, 2466], [2465, 2467], [2466, 2468, 2502], [2467, 2469], [2389, 2468, 2470], [2469, 2471], [2470, 2472, 2503], [2471, 2473], [2390, 2472, 2474], [2473, 2475], [2474, 2476, 2504], [2475, 2477], [2391, 2476, 2478], [2477, 2479], [2478, 2480, 2505], [2479, 2481], [2392, 2480, 2482], [2481, 2483], [2482, 2506], [2395, 2509], [2399, 2513], [2403, 2517], [2407, 2521], [2411, 2525], [2415, 2529], [2419, 2533], [2423, 2537], [2427, 2541], [2431, 2545], [2435, 2549], [2439, 2553], [2443, 2557], [2447, 2561], [2451, 2565], [2455, 2569], [2459, 2573], [2463, 2577], [2467, 2581], [2471, 2585], [2475, 2589], [2479, 2593], [2483, 2597], [2508, 2598], [2507, 2509], [2484, 2508, 2510], [2509, 2511], [2510, 2512, 2599], [2511, 2513], [2485, 2512, 2514], [2513, 2515], [2514, 2516, 2600], [2515, 2517], [2486, 2516, 2518], [2517, 2519], [2518, 2520, 2601], [2519, 2521], [2487, 2520, 2522], [2521, 2523], [2522, 2524, 2602], [2523, 2525], [2488, 2524, 2526], [2525, 2527], [2526, 2528, 2603], [2527, 2529], [2489, 2528, 2530], [2529, 2531], [2530, 2532, 2604], [2531, 2533], [2490, 2532, 2534], [2533, 2535], [2534, 2536, 2605], [2535, 2537], [2491, 2536, 2538], [2537, 2539], [2538, 2540, 2606], [2539, 2541], [2492, 2540, 2542], [2541, 2543], [2542, 2544, 2607], [2543, 2545], [2493, 2544, 2546], [2545, 2547], [2546, 2548, 2608], [2547, 2549], [2494, 2548, 2550], [2549, 2551], [2550, 2552, 2609], [2551, 2553], [2495, 2552, 2554], [2553, 2555], [2554, 2556, 2610], [2555, 2557], [2496, 2556, 2558], [2557, 2559], [2558, 2560, 2611], [2559, 2561], [2497, 2560, 2562], [2561, 2563], [2562, 2564, 2612], [2563, 2565], [2498, 2564, 2566], [2565, 2567], [2566, 2568, 2613], [2567, 2569], [2499, 2568, 2570], [2569, 2571], [2570, 2572, 2614], [2571, 2573], [2500, 2572, 2574], [2573, 2575], [2574, 2576, 2615], [2575, 2577], [2501, 2576, 2578], [2577, 2579], [2578, 2580, 2616], [2579, 2581], [2502, 2580, 2582], [2581, 2583], [2582, 2584, 2617], [2583, 2585], [2503, 2584, 2586], [2585, 2587], [2586, 2588, 2618], [2587, 2589], [2504, 2588, 2590], [2589, 2591], [2590, 2592, 2619], [2591, 2593], [2505, 2592, 2594], [2593, 2595], [2594, 2596, 2620], [2595, 2597], [2506, 2596], [2507, 2621], [2511, 2625], [2515, 2629], [2519, 2633], [2523, 2637], [2527, 2641], [2531, 2645], [2535, 2649], [2539, 2653], [2543, 2657], [2547, 2661], [2551, 2665], [2555, 2669], [2559, 2673], [2563, 2677], [2567, 2681], [2571, 2685], [2575, 2689], [2579, 2693], [2583, 2697], [2587, 2701], [2591, 2705], [2595, 2709], [2598, 2622], [2621, 2623], [2622, 2624, 2712], [2623, 2625], [2599, 2624, 2626], [2625, 2627], [2626, 2628, 2713], [2627, 2629], [2600, 2628, 2630], [2629, 2631], [2630, 2632, 2714], [2631, 2633], [2601, 2632, 2634], [2633, 2635], [2634, 2636, 2715], [2635, 2637], [2602, 2636, 2638], [2637, 2639], [2638, 2640, 2716], [2639, 2641], [2603, 2640, 2642], [2641, 2643], [2642, 2644, 2717], [2643, 2645], [2604, 2644, 2646], [2645, 2647], [2646, 2648, 2718], [2647, 2649], [2605, 2648, 2650], [2649, 2651], [2650, 2652, 2719], [2651, 2653], [2606, 2652, 2654], [2653, 2655], [2654, 2656, 2720], [2655, 2657], [2607, 2656, 2658], [2657, 2659], [2658, 2660, 2721], [2659, 2661], [2608, 2660, 2662], [2661, 2663], [2662, 2664, 2722], [2663, 2665], [2609, 2664, 2666], [2665, 2667], [2666, 2668, 2723], [2667, 2669], [2610, 2668, 2670], [2669, 2671], [2670, 2672, 2724], [2671, 2673], [2611, 2672, 2674], [2673, 2675], [2674, 2676, 2725], [2675, 2677], [2612, 2676, 2678], [2677, 2679], [2678, 2680, 2726], [2679, 2681], [2613, 2680, 2682], [2681, 2683], [2682, 2684, 2727], [2683, 2685], [2614, 2684, 2686], [2685, 2687], [2686, 2688, 2728], [2687, 2689], [2615, 2688, 2690], [2689, 2691], [2690, 2692, 2729], [2691, 2693], [2616, 2692, 2694], [2693, 2695], [2694, 2696, 2730], [2695, 2697], [2617, 2696, 2698], [2697, 2699], [2698, 2700, 2731], [2699, 2701], [2618, 2700, 2702], [2701, 2703], [2702, 2704, 2732], [2703, 2705], [2619, 2704, 2706], [2705, 2707], [2706, 2708, 2733], [2707, 2709], [2620, 2708, 2710], [2709, 2711], [2710, 2734], [2623, 2737], [2627, 2741], [2631, 2745], [2635, 2749], [2639, 2753], [2643, 2757], [2647, 2761], [2651, 2765], [2655, 2769], [2659, 2773], [2663, 2777], [2667, 2781], [2671, 2785], [2675, 2789], [2679, 2793], [2683, 2797], [2687, 2801], [2691, 2805], [2695, 2809], [2699, 2813], [2703, 2817], [2707, 2821], [2711, 2825], [2736, 2826], [2735, 2737], [2712, 2736, 2738], [2737, 2739], [2738, 2740, 2827], [2739, 2741], [2713, 2740, 2742], [2741, 2743], [2742, 2744, 2828], [2743, 2745], [2714, 2744, 2746], [2745, 2747], [2746, 2748, 2829], [2747, 2749], [2715, 2748, 2750], [2749, 2751], [2750, 2752, 2830], [2751, 2753], [2716, 2752, 2754], [2753, 2755], [2754, 2756, 2831], [2755, 2757], [2717, 2756, 2758], [2757, 2759], [2758, 2760, 2832], [2759, 2761], [2718, 2760, 2762], [2761, 2763], [2762, 2764, 2833], [2763, 2765], [2719, 2764, 2766], [2765, 2767], [2766, 2768, 2834], [2767, 2769], [2720, 2768, 2770], [2769, 2771], [2770, 2772, 2835], [2771, 2773], [2721, 2772, 2774], [2773, 2775], [2774, 2776, 2836], [2775, 2777], [2722, 2776, 2778], [2777, 2779], [2778, 2780, 2837], [2779, 2781], [2723, 2780, 2782], [2781, 2783], [2782, 2784, 2838], [2783, 2785], [2724, 2784, 2786], [2785, 2787], [2786, 2788, 2839], [2787, 2789], [2725, 2788, 2790], [2789, 2791], [2790, 2792, 2840], [2791, 2793], [2726, 2792, 2794], [2793, 2795], [2794, 2796, 2841], [2795, 2797], [2727, 2796, 2798], [2797, 2799], [2798, 2800, 2842], [2799, 2801], [2728, 2800, 2802], [2801, 2803], [2802, 2804, 2843], [2803, 2805], [2729, 2804, 2806], [2805, 2807], [2806, 2808, 2844], [2807, 2809], [2730, 2808, 2810], [2809, 2811], [2810, 2812, 2845], [2811, 2813], [2731, 2812, 2814], [2813, 2815], [2814, 2816, 2846], [2815, 2817], [2732, 2816, 2818], [2817, 2819], [2818, 2820, 2847], [2819, 2821], [2733, 2820, 2822], [2821, 2823], [2822, 2824, 2848], [2823, 2825], [2734, 2824], [2735, 2849], [2739, 2853], [2743, 2857], [2747, 2861], [2751, 2865], [2755, 2869], [2759, 2873], [2763, 2877], [2767, 2881], [2771, 2885], [2775, 2889], [2779, 2893], [2783, 2897], [2787, 2901], [2791, 2905], [2795, 2909], [2799, 2913], [2803, 2917], [2807, 2921], [2811, 2925], [2815, 2929], [2819, 2933], [2823, 2937], [2826, 2850], [2849, 2851], [2850, 2852, 2940], [2851, 2853], [2827, 2852, 2854], [2853, 2855], [2854, 2856, 2941], [2855, 2857], [2828, 2856, 2858], [2857, 2859], [2858, 2860, 2942], [2859, 2861], [2829, 2860, 2862], [2861, 2863], [2862, 2864, 2943], [2863, 2865], [2830, 2864, 2866], [2865, 2867], [2866, 2868, 2944], [2867, 2869], [2831, 2868, 2870], [2869, 2871], [2870, 2872, 2945], [2871, 2873], [2832, 2872, 2874], [2873, 2875], [2874, 2876, 2946], [2875, 2877], [2833, 2876, 2878], [2877, 2879], [2878, 2880, 2947], [2879, 2881], [2834, 2880, 2882], [2881, 2883], [2882, 2884, 2948], [2883, 2885], [2835, 2884, 2886], [2885, 2887], [2886, 2888, 2949], [2887, 2889], [2836, 2888, 2890], [2889, 2891], [2890, 2892, 2950], [2891, 2893], [2837, 2892, 2894], [2893, 2895], [2894, 2896, 2951], [2895, 2897], [2838, 2896, 2898], [2897, 2899], [2898, 2900, 2952], [2899, 2901], [2839, 2900, 2902], [2901, 2903], [2902, 2904, 2953], [2903, 2905], [2840, 2904, 2906], [2905, 2907], [2906, 2908, 2954], [2907, 2909], [2841, 2908, 2910], [2909, 2911], [2910, 2912, 2955], [2911, 2913], [2842, 2912, 2914], [2913, 2915], [2914, 2916, 2956], [2915, 2917], [2843, 2916, 2918], [2917, 2919], [2918, 2920, 2957], [2919, 2921], [2844, 2920, 2922], [2921, 2923], [2922, 2924, 2958], [2923, 2925], [2845, 2924, 2926], [2925, 2927], [2926, 2928, 2959], [2927, 2929], [2846, 2928, 2930], [2929, 2931], [2930, 2932, 2960], [2931, 2933], [2847, 2932, 2934], [2933, 2935], [2934, 2936, 2961], [2935, 2937], [2848, 2936, 2938], [2937, 2939], [2938, 2962], [2851, 2965], [2855, 2969], [2859, 2973], [2863, 2977], [2867, 2981], [2871, 2985], [2875, 2989], [2879, 2993], [2883, 2997], [2887, 3001], [2891, 3005], [2895, 3009], [2899, 3013], [2903, 3017], [2907, 3021], [2911, 3025], [2915, 3029], [2919, 3033], [2923, 3037], [2927, 3041], [2931, 3045], [2935, 3049], [2939, 3053], [2964, 3054], [2963, 2965], [2940, 2964, 2966], [2965, 2967], [2966, 2968, 3055], [2967, 2969], [2941, 2968, 2970], [2969, 2971], [2970, 2972, 3056], [2971, 2973], [2942, 2972, 2974], [2973, 2975], [2974, 2976, 3057], [2975, 2977], [2943, 2976, 2978], [2977, 2979], [2978, 2980, 3058], [2979, 2981], [2944, 2980, 2982], [2981, 2983], [2982, 2984, 3059], [2983, 2985], [2945, 2984, 2986], [2985, 2987], [2986, 2988, 3060], [2987, 2989], [2946, 2988, 2990], [2989, 2991], [2990, 2992, 3061], [2991, 2993], [2947, 2992, 2994], [2993, 2995], [2994, 2996, 3062], [2995, 2997], [2948, 2996, 2998], [2997, 2999], [2998, 3000, 3063], [2999, 3001], [2949, 3000, 3002], [3001, 3003], [3002, 3004, 3064], [3003, 3005], [2950, 3004, 3006], [3005, 3007], [3006, 3008, 3065], [3007, 3009], [2951, 3008, 3010], [3009, 3011], [3010, 3012, 3066], [3011, 3013], [2952, 3012, 3014], [3013, 3015], [3014, 3016, 3067], [3015, 3017], [2953, 3016, 3018], [3017, 3019], [3018, 3020, 3068], [3019, 3021], [2954, 3020, 3022], [3021, 3023], [3022, 3024, 3069], [3023, 3025], [2955, 3024, 3026], [3025, 3027], [3026, 3028, 3070], [3027, 3029], [2956, 3028, 3030], [3029, 3031], [3030, 3032, 3071], [3031, 3033], [2957, 3032, 3034], [3033, 3035], [3034, 3036, 3072], [3035, 3037], [2958, 3036, 3038], [3037, 3039], [3038, 3040, 3073], [3039, 3041], [2959, 3040, 3042], [3041, 3043], [3042, 3044, 3074], [3043, 3045], [2960, 3044, 3046], [3045, 3047], [3046, 3048, 3075], [3047, 3049], [2961, 3048, 3050], [3049, 3051], [3050, 3052, 3076], [3051, 3053], [2962, 3052], [2963, 3077], [2967, 3081], [2971, 3085], [2975, 3089], [2979, 3093], [2983, 3097], [2987, 3101], [2991, 3105], [2995, 3109], [2999, 3113], [3003, 3117], [3007, 3121], [3011, 3125], [3015, 3129], [3019, 3133], [3023, 3137], [3027, 3141], [3031, 3145], [3035, 3149], [3039, 3153], [3043, 3157], [3047, 3161], [3051, 3165], [3054, 3078], [3077, 3079], [3078, 3080, 3168], [3079, 3081], [3055, 3080, 3082], [3081, 3083], [3082, 3084, 3169], [3083, 3085], [3056, 3084, 3086], [3085, 3087], [3086, 3088, 3170], [3087, 3089], [3057, 3088, 3090], [3089, 3091], [3090, 3092, 3171], [3091, 3093], [3058, 3092, 3094], [3093, 3095], [3094, 3096, 3172], [3095, 3097], [3059, 3096, 3098], [3097, 3099], [3098, 3100, 3173], [3099, 3101], [3060, 3100, 3102], [3101, 3103], [3102, 3104, 3174], [3103, 3105], [3061, 3104, 3106], [3105, 3107], [3106, 3108, 3175], [3107, 3109], [3062, 3108, 3110], [3109, 3111], [3110, 3112, 3176], [3111, 3113], [3063, 3112, 3114], [3113, 3115], [3114, 3116, 3177], [3115, 3117], [3064, 3116, 3118], [3117, 3119], [3118, 3120, 3178], [3119, 3121], [3065, 3120, 3122], [3121, 3123], [3122, 3124, 3179], [3123, 3125], [3066, 3124, 3126], [3125, 3127], [3126, 3128, 3180], [3127, 3129], [3067, 3128, 3130], [3129, 3131], [3130, 3132, 3181], [3131, 3133], [3068, 3132, 3134], [3133, 3135], [3134, 3136, 3182], [3135, 3137], [3069, 3136, 3138], [3137, 3139], [3138, 3140, 3183], [3139, 3141], [3070, 3140, 3142], [3141, 3143], [3142, 3144, 3184], [3143, 3145], [3071, 3144, 3146], [3145, 3147], [3146, 3148, 3185], [3147, 3149], [3072, 3148, 3150], [3149, 3151], [3150, 3152, 3186], [3151, 3153], [3073, 3152, 3154], [3153, 3155], [3154, 3156, 3187], [3155, 3157], [3074, 3156, 3158], [3157, 3159], [3158, 3160, 3188], [3159, 3161], [3075, 3160, 3162], [3161, 3163], [3162, 3164, 3189], [3163, 3165], [3076, 3164, 3166], [3165, 3167], [3166, 3190], [3079, 3193], [3083, 3197], [3087, 3201], [3091, 3205], [3095, 3209], [3099, 3213], [3103, 3217], [3107, 3221], [3111, 3225], [3115, 3229], [3119, 3233], [3123, 3237], [3127, 3241], [3131, 3245], [3135, 3249], [3139, 3253], [3143, 3257], [3147, 3261], [3151, 3265], [3155, 3269], [3159, 3273], [3163, 3277], [3167, 3281], [3192, 3282], [3191, 3193], [3168, 3192, 3194], [3193, 3195], [3194, 3196, 3283], [3195, 3197], [3169, 3196, 3198], [3197, 3199], [3198, 3200, 3284], [3199, 3201], [3170, 3200, 3202], [3201, 3203], [3202, 3204, 3285], [3203, 3205], [3171, 3204, 3206], [3205, 3207], [3206, 3208, 3286], [3207, 3209], [3172, 3208, 3210], [3209, 3211], [3210, 3212, 3287], [3211, 3213], [3173, 3212, 3214], [3213, 3215], [3214, 3216, 3288], [3215, 3217], [3174, 3216, 3218], [3217, 3219], [3218, 3220, 3289], [3219, 3221], [3175, 3220, 3222], [3221, 3223], [3222, 3224, 3290], [3223, 3225], [3176, 3224, 3226], [3225, 3227], [3226, 3228, 3291], [3227, 3229], [3177, 3228, 3230], [3229, 3231], [3230, 3232, 3292], [3231, 3233], [3178, 3232, 3234], [3233, 3235], [3234, 3236, 3293], [3235, 3237], [3179, 3236, 3238], [3237, 3239], [3238, 3240, 3294], [3239, 3241], [3180, 3240, 3242], [3241, 3243], [3242, 3244, 3295], [3243, 3245], [3181, 3244, 3246], [3245, 3247], [3246, 3248, 3296], [3247, 3249], [3182, 3248, 3250], [3249, 3251], [3250, 3252, 3297], [3251, 3253], [3183, 3252, 3254], [3253, 3255], [3254, 3256, 3298], [3255, 3257], [3184, 3256, 3258], [3257, 3259], [3258, 3260, 3299], [3259, 3261], [3185, 3260, 3262], [3261, 3263], [3262, 3264, 3300], [3263, 3265], [3186, 3264, 3266], [3265, 3267], [3266, 3268, 3301], [3267, 3269], [3187, 3268, 3270], [3269, 3271], [3270, 3272, 3302], [3271, 3273], [3188, 3272, 3274], [3273, 3275], [3274, 3276, 3303], [3275, 3277], [3189, 3276, 3278], [3277, 3279], [3278, 3280, 3304], [3279, 3281], [3190, 3280], [3191, 3305], [3195, 3309], [3199, 3313], [3203, 3317], [3207, 3321], [3211, 3325], [3215, 3329], [3219, 3333], [3223, 3337], [3227, 3341], [3231, 3345], [3235, 3349], [3239, 3353], [3243, 3357], [3247, 3361], [3251, 3365], [3255, 3369], [3259, 3373], [3263, 3377], [3267, 3381], [3271, 3385], [3275, 3389], [3279, 3393], [3282, 3306], [3305, 3307], [3306, 3308, 3396], [3307, 3309], [3283, 3308, 3310], [3309, 3311], [3310, 3312, 3397], [3311, 3313], [3284, 3312, 3314], [3313, 3315], [3314, 3316, 3398], [3315, 3317], [3285, 3316, 3318], [3317, 3319], [3318, 3320, 3399], [3319, 3321], [3286, 3320, 3322], [3321, 3323], [3322, 3324, 3400], [3323, 3325], [3287, 3324, 3326], [3325, 3327], [3326, 3328, 3401], [3327, 3329], [3288, 3328, 3330], [3329, 3331], [3330, 3332, 3402], [3331, 3333], [3289, 3332, 3334], [3333, 3335], [3334, 3336, 3403], [3335, 3337], [3290, 3336, 3338], [3337, 3339], [3338, 3340, 3404], [3339, 3341], [3291, 3340, 3342], [3341, 3343], [3342, 3344, 3405], [3343, 3345], [3292, 3344, 3346], [3345, 3347], [3346, 3348, 3406], [3347, 3349], [3293, 3348, 3350], [3349, 3351], [3350, 3352, 3407], [3351, 3353], [3294, 3352, 3354], [3353, 3355], [3354, 3356, 3408], [3355, 3357], [3295, 3356, 3358], [3357, 3359], [3358, 3360, 3409], [3359, 3361], [3296, 3360, 3362], [3361, 3363], [3362, 3364, 3410], [3363, 3365], [3297, 3364, 3366], [3365, 3367], [3366, 3368, 3411], [3367, 3369], [3298, 3368, 3370], [3369, 3371], [3370, 3372, 3412], [3371, 3373], [3299, 3372, 3374], [3373, 3375], [3374, 3376, 3413], [3375, 3377], [3300, 3376, 3378], [3377, 3379], [3378, 3380, 3414], [3379, 3381], [3301, 3380, 3382], [3381, 3383], [3382, 3384, 3415], [3383, 3385], [3302, 3384, 3386], [3385, 3387], [3386, 3388, 3416], [3387, 3389], [3303, 3388, 3390], [3389, 3391], [3390, 3392, 3417], [3391, 3393], [3304, 3392, 3394], [3393, 3395], [3394, 3418], [3307, 3421], [3311, 3425], [3315, 3429], [3319, 3433], [3323, 3437], [3327, 3441], [3331, 3445], [3335, 3449], [3339, 3453], [3343, 3457], [3347, 3461], [3351, 3465], [3355, 3469], [3359, 3473], [3363, 3477], [3367, 3481], [3371, 3485], [3375, 3489], [3379, 3493], [3383, 3497], [3387, 3501], [3391, 3505], [3395, 3509], [3420, 3510], [3419, 3421], [3396, 3420, 3422], [3421, 3423], [3422, 3424, 3511], [3423, 3425], [3397, 3424, 3426], [3425, 3427], [3426, 3428, 3512], [3427, 3429], [3398, 3428, 3430], [3429, 3431], [3430, 3432, 3513], [3431, 3433], [3399, 3432, 3434], [3433, 3435], [3434, 3436, 3514], [3435, 3437], [3400, 3436, 3438], [3437, 3439], [3438, 3440, 3515], [3439, 3441], [3401, 3440, 3442], [3441, 3443], [3442, 3444, 3516], [3443, 3445], [3402, 3444, 3446], [3445, 3447], [3446, 3448, 3517], [3447, 3449], [3403, 3448, 3450], [3449, 3451], [3450, 3452, 3518], [3451, 3453], [3404, 3452, 3454], [3453, 3455], [3454, 3456, 3519], [3455, 3457], [3405, 3456, 3458], [3457, 3459], [3458, 3460, 3520], [3459, 3461], [3406, 3460, 3462], [3461, 3463], [3462, 3464, 3521], [3463, 3465], [3407, 3464, 3466], [3465, 3467], [3466, 3468, 3522], [3467, 3469], [3408, 3468, 3470], [3469, 3471], [3470, 3472, 3523], [3471, 3473], [3409, 3472, 3474], [3473, 3475], [3474, 3476, 3524], [3475, 3477], [3410, 3476, 3478], [3477, 3479], [3478, 3480, 3525], [3479, 3481], [3411, 3480, 3482], [3481, 3483], [3482, 3484, 3526], [3483, 3485], [3412, 3484, 3486], [3485, 3487], [3486, 3488, 3527], [3487, 3489], [3413, 3488, 3490], [3489, 3491], [3490, 3492, 3528], [3491, 3493], [3414, 3492, 3494], [3493, 3495], [3494, 3496, 3529], [3495, 3497], [3415, 3496, 3498], [3497, 3499], [3498, 3500, 3530], [3499, 3501], [3416, 3500, 3502], [3501, 3503], [3502, 3504, 3531], [3503, 3505], [3417, 3504, 3506], [3505, 3507], [3506, 3508, 3532], [3507, 3509], [3418, 3508], [3419, 3533], [3423, 3537], [3427, 3541], [3431, 3545], [3435, 3549], [3439, 3553], [3443, 3557], [3447, 3561], [3451, 3565], [3455, 3569], [3459, 3573], [3463, 3577], [3467, 3581], [3471, 3585], [3475, 3589], [3479, 3593], [3483, 3597], [3487, 3601], [3491, 3605], [3495, 3609], [3499, 3613], [3503, 3617], [3507, 3621], [3510, 3534], [3533, 3535], [3534, 3536, 3624], [3535, 3537], [3511, 3536, 3538], [3537, 3539], [3538, 3540, 3625], [3539, 3541], [3512, 3540, 3542], [3541, 3543], [3542, 3544, 3626], [3543, 3545], [3513, 3544, 3546], [3545, 3547], [3546, 3548, 3627], [3547, 3549], [3514, 3548, 3550], [3549, 3551], [3550, 3552, 3628], [3551, 3553], [3515, 3552, 3554], [3553, 3555], [3554, 3556, 3629], [3555, 3557], [3516, 3556, 3558], [3557, 3559], [3558, 3560, 3630], [3559, 3561], [3517, 3560, 3562], [3561, 3563], [3562, 3564, 3631], [3563, 3565], [3518, 3564, 3566], [3565, 3567], [3566, 3568, 3632], [3567, 3569], [3519, 3568, 3570], [3569, 3571], [3570, 3572, 3633], [3571, 3573], [3520, 3572, 3574], [3573, 3575], [3574, 3576, 3634], [3575, 3577], [3521, 3576, 3578], [3577, 3579], [3578, 3580, 3635], [3579, 3581], [3522, 3580, 3582], [3581, 3583], [3582, 3584, 3636], [3583, 3585], [3523, 3584, 3586], [3585, 3587], [3586, 3588, 3637], [3587, 3589], [3524, 3588, 3590], [3589, 3591], [3590, 3592, 3638], [3591, 3593], [3525, 3592, 3594], [3593, 3595], [3594, 3596, 3639], [3595, 3597], [3526, 3596, 3598], [3597, 3599], [3598, 3600, 3640], [3599, 3601], [3527, 3600, 3602], [3601, 3603], [3602, 3604, 3641], [3603, 3605], [3528, 3604, 3606], [3605, 3607], [3606, 3608, 3642], [3607, 3609], [3529, 3608, 3610], [3609, 3611], [3610, 3612, 3643], [3611, 3613], [3530, 3612, 3614], [3613, 3615], [3614, 3616, 3644], [3615, 3617], [3531, 3616, 3618], [3617, 3619], [3618, 3620, 3645], [3619, 3621], [3532, 3620, 3622], [3621, 3623], [3622, 3646], [3535, 3649], [3539, 3653], [3543, 3657], [3547, 3661], [3551, 3665], [3555, 3669], [3559, 3673], [3563, 3677], [3567, 3681], [3571, 3685], [3575, 3689], [3579, 3693], [3583, 3697], [3587, 3701], [3591, 3705], [3595, 3709], [3599, 3713], [3603, 3717], [3607, 3721], [3611, 3725], [3615, 3729], [3619, 3733], [3623, 3737], [3648, 3738], [3647, 3649], [3624, 3648, 3650], [3649, 3651], [3650, 3652, 3739], [3651, 3653], [3625, 3652, 3654], [3653, 3655], [3654, 3656, 3740], [3655, 3657], [3626, 3656, 3658], [3657, 3659], [3658, 3660, 3741], [3659, 3661], [3627, 3660, 3662], [3661, 3663], [3662, 3664, 3742], [3663, 3665], [3628, 3664, 3666], [3665, 3667], [3666, 3668, 3743], [3667, 3669], [3629, 3668, 3670], [3669, 3671], [3670, 3672, 3744], [3671, 3673], [3630, 3672, 3674], [3673, 3675], [3674, 3676, 3745], [3675, 3677], [3631, 3676, 3678], [3677, 3679], [3678, 3680, 3746], [3679, 3681], [3632, 3680, 3682], [3681, 3683], [3682, 3684, 3747], [3683, 3685], [3633, 3684, 3686], [3685, 3687], [3686, 3688, 3748], [3687, 3689], [3634, 3688, 3690], [3689, 3691], [3690, 3692, 3749], [3691, 3693], [3635, 3692, 3694], [3693, 3695], [3694, 3696, 3750], [3695, 3697], [3636, 3696, 3698], [3697, 3699], [3698, 3700, 3751], [3699, 3701], [3637, 3700, 3702], [3701, 3703], [3702, 3704, 3752], [3703, 3705], [3638, 3704, 3706], [3705, 3707], [3706, 3708, 3753], [3707, 3709], [3639, 3708, 3710], [3709, 3711], [3710, 3712, 3754], [3711, 3713], [3640, 3712, 3714], [3713, 3715], [3714, 3716, 3755], [3715, 3717], [3641, 3716, 3718], [3717, 3719], [3718, 3720, 3756], [3719, 3721], [3642, 3720, 3722], [3721, 3723], [3722, 3724, 3757], [3723, 3725], [3643, 3724, 3726], [3725, 3727], [3726, 3728, 3758], [3727, 3729], [3644, 3728, 3730], [3729, 3731], [3730, 3732, 3759], [3731, 3733], [3645, 3732, 3734], [3733, 3735], [3734, 3736, 3760], [3735, 3737], [3646, 3736], [3647, 3761], [3651, 3765], [3655, 3769], [3659, 3773], [3663, 3777], [3667, 3781], [3671, 3785], [3675, 3789], [3679, 3793], [3683, 3797], [3687, 3801], [3691, 3805], [3695, 3809], [3699, 3813], [3703, 3817], [3707, 3821], [3711, 3825], [3715, 3829], [3719, 3833], [3723, 3837], [3727, 3841], [3731, 3845], [3735, 3849], [3738, 3762], [3761, 3763], [3762, 3764, 3852], [3763, 3765], [3739, 3764, 3766], [3765, 3767], [3766, 3768, 3853], [3767, 3769], [3740, 3768, 3770], [3769, 3771], [3770, 3772, 3854], [3771, 3773], [3741, 3772, 3774], [3773, 3775], [3774, 3776, 3855], [3775, 3777], [3742, 3776, 3778], [3777, 3779], [3778, 3780, 3856], [3779, 3781], [3743, 3780, 3782], [3781, 3783], [3782, 3784, 3857], [3783, 3785], [3744, 3784, 3786], [3785, 3787], [3786, 3788, 3858], [3787, 3789], [3745, 3788, 3790], [3789, 3791], [3790, 3792, 3859], [3791, 3793], [3746, 3792, 3794], [3793, 3795], [3794, 3796, 3860], [3795, 3797], [3747, 3796, 3798], [3797, 3799], [3798, 3800, 3861], [3799, 3801], [3748, 3800, 3802], [3801, 3803], [3802, 3804, 3862], [3803, 3805], [3749, 3804, 3806], [3805, 3807], [3806, 3808, 3863], [3807, 3809], [3750, 3808, 3810], [3809, 3811], [3810, 3812, 3864], [3811, 3813], [3751, 3812, 3814], [3813, 3815], [3814, 3816, 3865], [3815, 3817], [3752, 3816, 3818], [3817, 3819], [3818, 3820, 3866], [3819, 3821], [3753, 3820, 3822], [3821, 3823], [3822, 3824, 3867], [3823, 3825], [3754, 3824, 3826], [3825, 3827], [3826, 3828, 3868], [3827, 3829], [3755, 3828, 3830], [3829, 3831], [3830, 3832, 3869], [3831, 3833], [3756, 3832, 3834], [3833, 3835], [3834, 3836, 3870], [3835, 3837], [3757, 3836, 3838], [3837, 3839], [3838, 3840, 3871], [3839, 3841], [3758, 3840, 3842], [3841, 3843], [3842, 3844, 3872], [3843, 3845], [3759, 3844, 3846], [3845, 3847], [3846, 3848, 3873], [3847, 3849], [3760, 3848, 3850], [3849, 3851], [3850, 3874], [3763, 3877], [3767, 3881], [3771, 3885], [3775, 3889], [3779, 3893], [3783, 3897], [3787, 3901], [3791, 3905], [3795, 3909], [3799, 3913], [3803, 3917], [3807, 3921], [3811, 3925], [3815, 3929], [3819, 3933], [3823, 3937], [3827, 3941], [3831, 3945], [3835, 3949], [3839, 3953], [3843, 3957], [3847, 3961], [3851, 3965], [3876, 3966], [3875, 3877], [3852, 3876, 3878], [3877, 3879], [3878, 3880, 3967], [3879, 3881], [3853, 3880, 3882], [3881, 3883], [3882, 3884, 3968], [3883, 3885], [3854, 3884, 3886], [3885, 3887], [3886, 3888, 3969], [3887, 3889], [3855, 3888, 3890], [3889, 3891], [3890, 3892, 3970], [3891, 3893], [3856, 3892, 3894], [3893, 3895], [3894, 3896, 3971], [3895, 3897], [3857, 3896, 3898], [3897, 3899], [3898, 3900, 3972], [3899, 3901], [3858, 3900, 3902], [3901, 3903], [3902, 3904, 3973], [3903, 3905], [3859, 3904, 3906], [3905, 3907], [3906, 3908, 3974], [3907, 3909], [3860, 3908, 3910], [3909, 3911], [3910, 3912, 3975], [3911, 3913], [3861, 3912, 3914], [3913, 3915], [3914, 3916, 3976], [3915, 3917], [3862, 3916, 3918], [3917, 3919], [3918, 3920, 3977], [3919, 3921], [3863, 3920, 3922], [3921, 3923], [3922, 3924, 3978], [3923, 3925], [3864, 3924, 3926], [3925, 3927], [3926, 3928, 3979], [3927, 3929], [3865, 3928, 3930], [3929, 3931], [3930, 3932, 3980], [3931, 3933], [3866, 3932, 3934], [3933, 3935], [3934, 3936, 3981], [3935, 3937], [3867, 3936, 3938], [3937, 3939], [3938, 3940, 3982], [3939, 3941], [3868, 3940, 3942], [3941, 3943], [3942, 3944, 3983], [3943, 3945], [3869, 3944, 3946], [3945, 3947], [3946, 3948, 3984], [3947, 3949], [3870, 3948, 3950], [3949, 3951], [3950, 3952, 3985], [3951, 3953], [3871, 3952, 3954], [3953, 3955], [3954, 3956, 3986], [3955, 3957], [3872, 3956, 3958], [3957, 3959], [3958, 3960, 3987], [3959, 3961], [3873, 3960, 3962], [3961, 3963], [3962, 3964, 3988], [3963, 3965], [3874, 3964], [3875, 3989], [3879, 3993], [3883, 3997], [3887, 4001], [3891, 4005], [3895, 4009], [3899, 4013], [3903, 4017], [3907, 4021], [3911, 4025], [3915, 4029], [3919, 4033], [3923, 4037], [3927, 4041], [3931, 4045], [3935, 4049], [3939, 4053], [3943, 4057], [3947, 4061], [3951, 4065], [3955, 4069], [3959, 4073], [3963, 4077], [3966, 3990], [3989, 3991], [3990, 3992, 4080], [3991, 3993], [3967, 3992, 3994], [3993, 3995], [3994, 3996, 4081], [3995, 3997], [3968, 3996, 3998], [3997, 3999], [3998, 4000, 4082], [3999, 4001], [3969, 4000, 4002], [4001, 4003], [4002, 4004, 4083], [4003, 4005], [3970, 4004, 4006], [4005, 4007], [4006, 4008, 4084], [4007, 4009], [3971, 4008, 4010], [4009, 4011], [4010, 4012, 4085], [4011, 4013], [3972, 4012, 4014], [4013, 4015], [4014, 4016, 4086], [4015, 4017], [3973, 4016, 4018], [4017, 4019], [4018, 4020, 4087], [4019, 4021], [3974, 4020, 4022], [4021, 4023], [4022, 4024, 4088], [4023, 4025], [3975, 4024, 4026], [4025, 4027], [4026, 4028, 4089], [4027, 4029], [3976, 4028, 4030], [4029, 4031], [4030, 4032, 4090], [4031, 4033], [3977, 4032, 4034], [4033, 4035], [4034, 4036, 4091], [4035, 4037], [3978, 4036, 4038], [4037, 4039], [4038, 4040, 4092], [4039, 4041], [3979, 4040, 4042], [4041, 4043], [4042, 4044, 4093], [4043, 4045], [3980, 4044, 4046], [4045, 4047], [4046, 4048, 4094], [4047, 4049], [3981, 4048, 4050], [4049, 4051], [4050, 4052, 4095], [4051, 4053], [3982, 4052, 4054], [4053, 4055], [4054, 4056, 4096], [4055, 4057], [3983, 4056, 4058], [4057, 4059], [4058, 4060, 4097], [4059, 4061], [3984, 4060, 4062], [4061, 4063], [4062, 4064, 4098], [4063, 4065], [3985, 4064, 4066], [4065, 4067], [4066, 4068, 4099], [4067, 4069], [3986, 4068, 4070], [4069, 4071], [4070, 4072, 4100], [4071, 4073], [3987, 4072, 4074], [4073, 4075], [4074, 4076, 4101], [4075, 4077], [3988, 4076, 4078], [4077, 4079], [4078, 4102], [3991, 4105], [3995, 4109], [3999, 4113], [4003, 4117], [4007, 4121], [4011, 4125], [4015, 4129], [4019, 4133], [4023, 4137], [4027, 4141], [4031, 4145], [4035, 4149], [4039, 4153], [4043, 4157], [4047, 4161], [4051, 4165], [4055, 4169], [4059, 4173], [4063, 4177], [4067, 4181], [4071, 4185], [4075, 4189], [4079, 4193], [4104, 4194], [4103, 4105], [4080, 4104, 4106], [4105, 4107], [4106, 4108, 4195], [4107, 4109], [4081, 4108, 4110], [4109, 4111], [4110, 4112, 4196], [4111, 4113], [4082, 4112, 4114], [4113, 4115], [4114, 4116, 4197], [4115, 4117], [4083, 4116, 4118], [4117, 4119], [4118, 4120, 4198], [4119, 4121], [4084, 4120, 4122], [4121, 4123], [4122, 4124, 4199], [4123, 4125], [4085, 4124, 4126], [4125, 4127], [4126, 4128, 4200], [4127, 4129], [4086, 4128, 4130], [4129, 4131], [4130, 4132, 4201], [4131, 4133], [4087, 4132, 4134], [4133, 4135], [4134, 4136, 4202], [4135, 4137], [4088, 4136, 4138], [4137, 4139], [4138, 4140, 4203], [4139, 4141], [4089, 4140, 4142], [4141, 4143], [4142, 4144, 4204], [4143, 4145], [4090, 4144, 4146], [4145, 4147], [4146, 4148, 4205], [4147, 4149], [4091, 4148, 4150], [4149, 4151], [4150, 4152, 4206], [4151, 4153], [4092, 4152, 4154], [4153, 4155], [4154, 4156, 4207], [4155, 4157], [4093, 4156, 4158], [4157, 4159], [4158, 4160, 4208], [4159, 4161], [4094, 4160, 4162], [4161, 4163], [4162, 4164, 4209], [4163, 4165], [4095, 4164, 4166], [4165, 4167], [4166, 4168, 4210], [4167, 4169], [4096, 4168, 4170], [4169, 4171], [4170, 4172, 4211], [4171, 4173], [4097, 4172, 4174], [4173, 4175], [4174, 4176, 4212], [4175, 4177], [4098, 4176, 4178], [4177, 4179], [4178, 4180, 4213], [4179, 4181], [4099, 4180, 4182], [4181, 4183], [4182, 4184, 4214], [4183, 4185], [4100, 4184, 4186], [4185, 4187], [4186, 4188, 4215], [4187, 4189], [4101, 4188, 4190], [4189, 4191], [4190, 4192, 4216], [4191, 4193], [4102, 4192], [4103, 4217], [4107, 4221], [4111, 4225], [4115, 4229], [4119, 4233], [4123, 4237], [4127, 4241], [4131, 4245], [4135, 4249], [4139, 4253], [4143, 4257], [4147, 4261], [4151, 4265], [4155, 4269], [4159, 4273], [4163, 4277], [4167, 4281], [4171, 4285], [4175, 4289], [4179, 4293], [4183, 4297], [4187, 4301], [4191, 4305], [4194, 4218], [4217, 4219], [4218, 4220, 4308], [4219, 4221], [4195, 4220, 4222], [4221, 4223], [4222, 4224, 4309], [4223, 4225], [4196, 4224, 4226], [4225, 4227], [4226, 4228, 4310], [4227, 4229], [4197, 4228, 4230], [4229, 4231], [4230, 4232, 4311], [4231, 4233], [4198, 4232, 4234], [4233, 4235], [4234, 4236, 4312], [4235, 4237], [4199, 4236, 4238], [4237, 4239], [4238, 4240, 4313], [4239, 4241], [4200, 4240, 4242], [4241, 4243], [4242, 4244, 4314], [4243, 4245], [4201, 4244, 4246], [4245, 4247], [4246, 4248, 4315], [4247, 4249], [4202, 4248, 4250], [4249, 4251], [4250, 4252, 4316], [4251, 4253], [4203, 4252, 4254], [4253, 4255], [4254, 4256, 4317], [4255, 4257], [4204, 4256, 4258], [4257, 4259], [4258, 4260, 4318], [4259, 4261], [4205, 4260, 4262], [4261, 4263], [4262, 4264, 4319], [4263, 4265], [4206, 4264, 4266], [4265, 4267], [4266, 4268, 4320], [4267, 4269], [4207, 4268, 4270], [4269, 4271], [4270, 4272, 4321], [4271, 4273], [4208, 4272, 4274], [4273, 4275], [4274, 4276, 4322], [4275, 4277], [4209, 4276, 4278], [4277, 4279], [4278, 4280, 4323], [4279, 4281], [4210, 4280, 4282], [4281, 4283], [4282, 4284, 4324], [4283, 4285], [4211, 4284, 4286], [4285, 4287], [4286, 4288, 4325], [4287, 4289], [4212, 4288, 4290], [4289, 4291], [4290, 4292, 4326], [4291, 4293], [4213, 4292, 4294], [4293, 4295], [4294, 4296, 4327], [4295, 4297], [4214, 4296, 4298], [4297, 4299], [4298, 4300, 4328], [4299, 4301], [4215, 4300, 4302], [4301, 4303], [4302, 4304, 4329], [4303, 4305], [4216, 4304, 4306], [4305, 4307], [4306, 4330], [4219, 4333], [4223, 4337], [4227, 4341], [4231, 4345], [4235, 4349], [4239, 4353], [4243, 4357], [4247, 4361], [4251, 4365], [4255, 4369], [4259, 4373], [4263, 4377], [4267, 4381], [4271, 4385], [4275, 4389], [4279, 4393], [4283, 4397], [4287, 4401], [4291, 4405], [4295, 4409], [4299, 4413], [4303, 4417], [4307, 4421], [4332, 4422], [4331, 4333], [4308, 4332, 4334], [4333, 4335], [4334, 4336, 4423], [4335, 4337], [4309, 4336, 4338], [4337, 4339], [4338, 4340, 4424], [4339, 4341], [4310, 4340, 4342], [4341, 4343], [4342, 4344, 4425], [4343, 4345], [4311, 4344, 4346], [4345, 4347], [4346, 4348, 4426], [4347, 4349], [4312, 4348, 4350], [4349, 4351], [4350, 4352, 4427], [4351, 4353], [4313, 4352, 4354], [4353, 4355], [4354, 4356, 4428], [4355, 4357], [4314, 4356, 4358], [4357, 4359], [4358, 4360, 4429], [4359, 4361], [4315, 4360, 4362], [4361, 4363], [4362, 4364, 4430], [4363, 4365], [4316, 4364, 4366], [4365, 4367], [4366, 4368, 4431], [4367, 4369], [4317, 4368, 4370], [4369, 4371], [4370, 4372, 4432], [4371, 4373], [4318, 4372, 4374], [4373, 4375], [4374, 4376, 4433], [4375, 4377], [4319, 4376, 4378], [4377, 4379], [4378, 4380, 4434], [4379, 4381], [4320, 4380, 4382], [4381, 4383], [4382, 4384, 4435], [4383, 4385], [4321, 4384, 4386], [4385, 4387], [4386, 4388, 4436], [4387, 4389], [4322, 4388, 4390], [4389, 4391], [4390, 4392, 4437], [4391, 4393], [4323, 4392, 4394], [4393, 4395], [4394, 4396, 4438], [4395, 4397], [4324, 4396, 4398], [4397, 4399], [4398, 4400, 4439], [4399, 4401], [4325, 4400, 4402], [4401, 4403], [4402, 4404, 4440], [4403, 4405], [4326, 4404, 4406], [4405, 4407], [4406, 4408, 4441], [4407, 4409], [4327, 4408, 4410], [4409, 4411], [4410, 4412, 4442], [4411, 4413], [4328, 4412, 4414], [4413, 4415], [4414, 4416, 4443], [4415, 4417], [4329, 4416, 4418], [4417, 4419], [4418, 4420, 4444], [4419, 4421], [4330, 4420], [4331, 4445], [4335, 4449], [4339, 4453], [4343, 4457], [4347, 4461], [4351, 4465], [4355, 4469], [4359, 4473], [4363, 4477], [4367, 4481], [4371, 4485], [4375, 4489], [4379, 4493], [4383, 4497], [4387, 4501], [4391, 4505], [4395, 4509], [4399, 4513], [4403, 4517], [4407, 4521], [4411, 4525], [4415, 4529], [4419, 4533], [4422, 4446], [4445, 4447], [4446, 4448, 4536], [4447, 4449], [4423, 4448, 4450], [4449, 4451], [4450, 4452, 4537], [4451, 4453], [4424, 4452, 4454], [4453, 4455], [4454, 4456, 4538], [4455, 4457], [4425, 4456, 4458], [4457, 4459], [4458, 4460, 4539], [4459, 4461], [4426, 4460, 4462], [4461, 4463], [4462, 4464, 4540], [4463, 4465], [4427, 4464, 4466], [4465, 4467], [4466, 4468, 4541], [4467, 4469], [4428, 4468, 4470], [4469, 4471], [4470, 4472, 4542], [4471, 4473], [4429, 4472, 4474], [4473, 4475], [4474, 4476, 4543], [4475, 4477], [4430, 4476, 4478], [4477, 4479], [4478, 4480, 4544], [4479, 4481], [4431, 4480, 4482], [4481, 4483], [4482, 4484, 4545], [4483, 4485], [4432, 4484, 4486], [4485, 4487], [4486, 4488, 4546], [4487, 4489], [4433, 4488, 4490], [4489, 4491], [4490, 4492, 4547], [4491, 4493], [4434, 4492, 4494], [4493, 4495], [4494, 4496, 4548], [4495, 4497], [4435, 4496, 4498], [4497, 4499], [4498, 4500, 4549], [4499, 4501], [4436, 4500, 4502], [4501, 4503], [4502, 4504, 4550], [4503, 4505], [4437, 4504, 4506], [4505, 4507], [4506, 4508, 4551], [4507, 4509], [4438, 4508, 4510], [4509, 4511], [4510, 4512, 4552], [4511, 4513], [4439, 4512, 4514], [4513, 4515], [4514, 4516, 4553], [4515, 4517], [4440, 4516, 4518], [4517, 4519], [4518, 4520, 4554], [4519, 4521], [4441, 4520, 4522], [4521, 4523], [4522, 4524, 4555], [4523, 4525], [4442, 4524, 4526], [4525, 4527], [4526, 4528, 4556], [4527, 4529], [4443, 4528, 4530], [4529, 4531], [4530, 4532, 4557], [4531, 4533], [4444, 4532, 4534], [4533, 4535], [4534, 4558], [4447, 4561], [4451, 4565], [4455, 4569], [4459, 4573], [4463, 4577], [4467, 4581], [4471, 4585], [4475, 4589], [4479, 4593], [4483, 4597], [4487, 4601], [4491, 4605], [4495, 4609], [4499, 4613], [4503, 4617], [4507, 4621], [4511, 4625], [4515, 4629], [4519, 4633], [4523, 4637], [4527, 4641], [4531, 4645], [4535, 4649], [4560, 4650], [4559, 4561], [4536, 4560, 4562], [4561, 4563], [4562, 4564, 4651], [4563, 4565], [4537, 4564, 4566], [4565, 4567], [4566, 4568, 4652], [4567, 4569], [4538, 4568, 4570], [4569, 4571], [4570, 4572, 4653], [4571, 4573], [4539, 4572, 4574], [4573, 4575], [4574, 4576, 4654], [4575, 4577], [4540, 4576, 4578], [4577, 4579], [4578, 4580, 4655], [4579, 4581], [4541, 4580, 4582], [4581, 4583], [4582, 4584, 4656], [4583, 4585], [4542, 4584, 4586], [4585, 4587], [4586, 4588, 4657], [4587, 4589], [4543, 4588, 4590], [4589, 4591], [4590, 4592, 4658], [4591, 4593], [4544, 4592, 4594], [4593, 4595], [4594, 4596, 4659], [4595, 4597], [4545, 4596, 4598], [4597, 4599], [4598, 4600, 4660], [4599, 4601], [4546, 4600, 4602], [4601, 4603], [4602, 4604, 4661], [4603, 4605], [4547, 4604, 4606], [4605, 4607], [4606, 4608, 4662], [4607, 4609], [4548, 4608, 4610], [4609, 4611], [4610, 4612, 4663], [4611, 4613], [4549, 4612, 4614], [4613, 4615], [4614, 4616, 4664], [4615, 4617], [4550, 4616, 4618], [4617, 4619], [4618, 4620, 4665], [4619, 4621], [4551, 4620, 4622], [4621, 4623], [4622, 4624, 4666], [4623, 4625], [4552, 4624, 4626], [4625, 4627], [4626, 4628, 4667], [4627, 4629], [4553, 4628, 4630], [4629, 4631], [4630, 4632, 4668], [4631, 4633], [4554, 4632, 4634], [4633, 4635], [4634, 4636, 4669], [4635, 4637], [4555, 4636, 4638], [4637, 4639], [4638, 4640, 4670], [4639, 4641], [4556, 4640, 4642], [4641, 4643], [4642, 4644, 4671], [4643, 4645], [4557, 4644, 4646], [4645, 4647], [4646, 4648, 4672], [4647, 4649], [4558, 4648], [4559, 4673], [4563, 4677], [4567, 4681], [4571, 4685], [4575, 4689], [4579, 4693], [4583, 4697], [4587, 4701], [4591, 4705], [4595, 4709], [4599, 4713], [4603, 4717], [4607, 4721], [4611, 4725], [4615, 4729], [4619, 4733], [4623, 4737], [4627, 4741], [4631, 4745], [4635, 4749], [4639, 4753], [4643, 4757], [4647, 4761], [4650, 4674], [4673, 4675], [4674, 4676, 4764], [4675, 4677], [4651, 4676, 4678], [4677, 4679], [4678, 4680, 4765], [4679, 4681], [4652, 4680, 4682], [4681, 4683], [4682, 4684, 4766], [4683, 4685], [4653, 4684, 4686], [4685, 4687], [4686, 4688, 4767], [4687, 4689], [4654, 4688, 4690], [4689, 4691], [4690, 4692, 4768], [4691, 4693], [4655, 4692, 4694], [4693, 4695], [4694, 4696, 4769], [4695, 4697], [4656, 4696, 4698], [4697, 4699], [4698, 4700, 4770], [4699, 4701], [4657, 4700, 4702], [4701, 4703], [4702, 4704, 4771], [4703, 4705], [4658, 4704, 4706], [4705, 4707], [4706, 4708, 4772], [4707, 4709], [4659, 4708, 4710], [4709, 4711], [4710, 4712, 4773], [4711, 4713], [4660, 4712, 4714], [4713, 4715], [4714, 4716, 4774], [4715, 4717], [4661, 4716, 4718], [4717, 4719], [4718, 4720, 4775], [4719, 4721], [4662, 4720, 4722], [4721, 4723], [4722, 4724, 4776], [4723, 4725], [4663, 4724, 4726], [4725, 4727], [4726, 4728, 4777], [4727, 4729], [4664, 4728, 4730], [4729, 4731], [4730, 4732, 4778], [4731, 4733], [4665, 4732, 4734], [4733, 4735], [4734, 4736, 4779], [4735, 4737], [4666, 4736, 4738], [4737, 4739], [4738, 4740, 4780], [4739, 4741], [4667, 4740, 4742], [4741, 4743], [4742, 4744, 4781], [4743, 4745], [4668, 4744, 4746], [4745, 4747], [4746, 4748, 4782], [4747, 4749], [4669, 4748, 4750], [4749, 4751], [4750, 4752, 4783], [4751, 4753], [4670, 4752, 4754], [4753, 4755], [4754, 4756, 4784], [4755, 4757], [4671, 4756, 4758], [4757, 4759], [4758, 4760, 4785], [4759, 4761], [4672, 4760, 4762], [4761, 4763], [4762, 4786], [4675, 4789], [4679, 4793], [4683, 4797], [4687, 4801], [4691, 4805], [4695, 4809], [4699, 4813], [4703, 4817], [4707, 4821], [4711, 4825], [4715, 4829], [4719, 4833], [4723, 4837], [4727, 4841], [4731, 4845], [4735, 4849], [4739, 4853], [4743, 4857], [4747, 4861], [4751, 4865], [4755, 4869], [4759, 4873], [4763, 4877], [4788, 4878], [4787, 4789], [4764, 4788, 4790], [4789, 4791], [4790, 4792, 4879], [4791, 4793], [4765, 4792, 4794], [4793, 4795], [4794, 4796, 4880], [4795, 4797], [4766, 4796, 4798], [4797, 4799], [4798, 4800, 4881], [4799, 4801], [4767, 4800, 4802], [4801, 4803], [4802, 4804, 4882], [4803, 4805], [4768, 4804, 4806], [4805, 4807], [4806, 4808, 4883], [4807, 4809], [4769, 4808, 4810], [4809, 4811], [4810, 4812, 4884], [4811, 4813], [4770, 4812, 4814], [4813, 4815], [4814, 4816, 4885], [4815, 4817], [4771, 4816, 4818], [4817, 4819], [4818, 4820, 4886], [4819, 4821], [4772, 4820, 4822], [4821, 4823], [4822, 4824, 4887], [4823, 4825], [4773, 4824, 4826], [4825, 4827], [4826, 4828, 4888], [4827, 4829], [4774, 4828, 4830], [4829, 4831], [4830, 4832, 4889], [4831, 4833], [4775, 4832, 4834], [4833, 4835], [4834, 4836, 4890], [4835, 4837], [4776, 4836, 4838], [4837, 4839], [4838, 4840, 4891], [4839, 4841], [4777, 4840, 4842], [4841, 4843], [4842, 4844, 4892], [4843, 4845], [4778, 4844, 4846], [4845, 4847], [4846, 4848, 4893], [4847, 4849], [4779, 4848, 4850], [4849, 4851], [4850, 4852, 4894], [4851, 4853], [4780, 4852, 4854], [4853, 4855], [4854, 4856, 4895], [4855, 4857], [4781, 4856, 4858], [4857, 4859], [4858, 4860, 4896], [4859, 4861], [4782, 4860, 4862], [4861, 4863], [4862, 4864, 4897], [4863, 4865], [4783, 4864, 4866], [4865, 4867], [4866, 4868, 4898], [4867, 4869], [4784, 4868, 4870], [4869, 4871], [4870, 4872, 4899], [4871, 4873], [4785, 4872, 4874], [4873, 4875], [4874, 4876, 4900], [4875, 4877], [4786, 4876], [4787, 4901], [4791, 4905], [4795, 4909], [4799, 4913], [4803, 4917], [4807, 4921], [4811, 4925], [4815, 4929], [4819, 4933], [4823, 4937], [4827, 4941], [4831, 4945], [4835, 4949], [4839, 4953], [4843, 4957], [4847, 4961], [4851, 4965], [4855, 4969], [4859, 4973], [4863, 4977], [4867, 4981], [4871, 4985], [4875, 4989], [4878, 4902], [4901, 4903], [4902, 4904, 4992], [4903, 4905], [4879, 4904, 4906], [4905, 4907], [4906, 4908, 4993], [4907, 4909], [4880, 4908, 4910], [4909, 4911], [4910, 4912, 4994], [4911, 4913], [4881, 4912, 4914], [4913, 4915], [4914, 4916, 4995], [4915, 4917], [4882, 4916, 4918], [4917, 4919], [4918, 4920, 4996], [4919, 4921], [4883, 4920, 4922], [4921, 4923], [4922, 4924, 4997], [4923, 4925], [4884, 4924, 4926], [4925, 4927], [4926, 4928, 4998], [4927, 4929], [4885, 4928, 4930], [4929, 4931], [4930, 4932, 4999], [4931, 4933], [4886, 4932, 4934], [4933, 4935], [4934, 4936, 5000], [4935, 4937], [4887, 4936, 4938], [4937, 4939], [4938, 4940, 5001], [4939, 4941], [4888, 4940, 4942], [4941, 4943], [4942, 4944, 5002], [4943, 4945], [4889, 4944, 4946], [4945, 4947], [4946, 4948, 5003], [4947, 4949], [4890, 4948, 4950], [4949, 4951], [4950, 4952, 5004], [4951, 4953], [4891, 4952, 4954], [4953, 4955], [4954, 4956, 5005], [4955, 4957], [4892, 4956, 4958], [4957, 4959], [4958, 4960, 5006], [4959, 4961], [4893, 4960, 4962], [4961, 4963], [4962, 4964, 5007], [4963, 4965], [4894, 4964, 4966], [4965, 4967], [4966, 4968, 5008], [4967, 4969], [4895, 4968, 4970], [4969, 4971], [4970, 4972, 5009], [4971, 4973], [4896, 4972, 4974], [4973, 4975], [4974, 4976, 5010], [4975, 4977], [4897, 4976, 4978], [4977, 4979], [4978, 4980, 5011], [4979, 4981], [4898, 4980, 4982], [4981, 4983], [4982, 4984, 5012], [4983, 4985], [4899, 4984, 4986], [4985, 4987], [4986, 4988, 5013], [4987, 4989], [4900, 4988, 4990], [4989, 4991], [4990, 5014], [4903, 5016], [4907, 5020], [4911, 5024], [4915, 5028], [4919, 5032], [4923, 5036], [4927, 5040], [4931, 5044], [4935, 5048], [4939, 5052], [4943, 5056], [4947, 5060], [4951, 5064], [4955, 5068], [4959, 5072], [4963, 5076], [4967, 5080], [4971, 5084], [4975, 5088], [4979, 5092], [4983, 5096], [4987, 5100], [4991, 5104], [5016], [4992, 5015, 5017], [5016, 5018], [5017, 5019], [5018, 5020], [4993, 5019, 5021], [5020, 5022], [5021, 5023], [5022, 5024], [4994, 5023, 5025], [5024, 5026], [5025, 5027], [5026, 5028], [4995, 5027, 5029], [5028, 5030], [5029, 5031], [5030, 5032], [4996, 5031, 5033], [5032, 5034], [5033, 5035], [5034, 5036], [4997, 5035, 5037], [5036, 5038], [5037, 5039], [5038, 5040], [4998, 5039, 5041], [5040, 5042], [5041, 5043], [5042, 5044], [4999, 5043, 5045], [5044, 5046], [5045, 5047], [5046, 5048], [5000, 5047, 5049], [5048, 5050], [5049, 5051], [5050, 5052], [5001, 5051, 5053], [5052, 5054], [5053, 5055], [5054, 5056], [5002, 5055, 5057], [5056, 5058], [5057, 5059], [5058, 5060], [5003, 5059, 5061], [5060, 5062], [5061, 5063], [5062, 5064], [5004, 5063, 5065], [5064, 5066], [5065, 5067], [5066, 5068], [5005, 5067, 5069], [5068, 5070], [5069, 5071], [5070, 5072], [5006, 5071, 5073], [5072, 5074], [5073, 5075], [5074, 5076], [5007, 5075, 5077], [5076, 5078], [5077, 5079], [5078, 5080], [5008, 5079, 5081], [5080, 5082], [5081, 5083], [5082, 5084], [5009, 5083, 5085], [5084, 5086], [5085, 5087], [5086, 5088], [5010, 5087, 5089], [5088, 5090], [5089, 5091], [5090, 5092], [5011, 5091, 5093], [5092, 5094], [5093, 5095], [5094, 5096], [5012, 5095, 5097], [5096, 5098], [5097, 5099], [5098, 5100], [5013, 5099, 5101], [5100, 5102], [5101, 5103], [5102, 5104], [5014, 5103]] SGERROR: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1, 90], [0, 2], [1, 3], [2, 4], [3, 5, 91], [4, 6], [5, 7], [6, 8], [7, 9, 92], [8, 10], [9, 11], [10, 12], [11, 13, 93], [12, 14], [13, 15], [14, 16], [15, 17, 94], [16, 18], [17, 19], [18, 20], [19, 21, 95], [20, 22], [21, 23], [22, 24], [23, 25, 96], [24, 26], [25, 27], [26, 28], [27, 29, 97], [28, 30], [29, 31], [30, 32], [31, 33, 98], [32, 34], [33, 35], [34, 36], [35, 37, 99], [36, 38], [37, 39], [38, 40], [39, 41, 100], [40, 42], [41, 43], [42, 44], [43, 45, 101], [44, 46], [45, 47], [46, 48], [47, 49, 102], [48, 50], [49, 51], [50, 52], [51, 53, 103], [52, 54], [53, 55], [54, 56], [55, 57, 104], [56, 58], [57, 59], [58, 60], [59, 61, 105], [60, 62], [61, 63], [62, 64], [63, 65, 106], [64, 66], [65, 67], [66, 68], [67, 69, 107], [68, 70], [69, 71], [70, 72], [71, 73, 108], [72, 74], [73, 75], [74, 76], [75, 77, 109], [76, 78], [77, 79], [78, 80], [79, 81, 110], [80, 82], [81, 83], [82, 84], [83, 85, 111], [84, 86], [85, 87], [86, 88], [87, 89, 112], [88], [0, 113], [4, 117], [8, 121], [12, 125], [16, 129], [20, 133], [24, 137], [28, 141], [32, 145], [36, 149], [40, 153], [44, 157], [48, 161], [52, 165], [56, 169], [60, 173], [64, 177], [68, 181], [72, 185], [76, 189], [80, 193], [84, 197], [88, 201], [90, 114], [113, 115], [114, 116, 204], [115, 117], [91, 116, 118], [117, 119], [118, 120, 205], [119, 121], [92, 120, 122], [121, 123], [122, 124, 206], [123, 125], [93, 124, 126], [125, 127], [126, 128, 207], [127, 129], [94, 128, 130], [129, 131], [130, 132, 208], [131, 133], [95, 132, 134], [133, 135], [134, 136, 209], [135, 137], [96, 136, 138], [137, 139], [138, 140, 210], [139, 141], [97, 140, 142], [141, 143], [142, 144, 211], [143, 145], [98, 144, 146], [145, 147], [146, 148, 212], [147, 149], [99, 148, 150], [149, 151], [150, 152, 213], [151, 153], [100, 152, 154], [153, 155], [154, 156, 214], [155, 157], [101, 156, 158], [157, 159], [158, 160, 215], [159, 161], [102, 160, 162], [161, 163], [162, 164, 216], [163, 165], [103, 164, 166], [165, 167], [166, 168, 217], [167, 169], [104, 168, 170], [169, 171], [170, 172, 218], [171, 173], [105, 172, 174], [173, 175], [174, 176, 219], [175, 177], [106, 176, 178], [177, 179], [178, 180, 220], [179, 181], [107, 180, 182], [181, 183], [182, 184, 221], [183, 185], [108, 184, 186], [185, 187], [186, 188, 222], [187, 189], [109, 188, 190], [189, 191], [190, 192, 223], [191, 193], [110, 192, 194], [193, 195], [194, 196, 224], [195, 197], [111, 196, 198], [197, 199], [198, 200, 225], [199, 201], [112, 200, 202], [201, 203], [202, 226], [115, 229], [119, 233], [123, 237], [127, 241], [131, 245], [135, 249], [139, 253], [143, 257], [147, 261], [151, 265], [155, 269], [159, 273], [163, 277], [167, 281], [171, 285], [175, 289], [179, 293], [183, 297], [187, 301], [191, 305], [195, 309], [199, 313], [203, 317], [228, 318], [227, 229], [204, 228, 230], [229, 231], [230, 232, 319], [231, 233], [205, 232, 234], [233, 235], [234, 236, 320], [235, 237], [206, 236, 238], [237, 239], [238, 240, 321], [239, 241], [207, 240, 242], [241, 243], [242, 244, 322], [243, 245], [208, 244, 246], [245, 247], [246, 248, 323], [247, 249], [209, 248, 250], [249, 251], [250, 252, 324], [251, 253], [210, 252, 254], [253, 255], [254, 256, 325], [255, 257], [211, 256, 258], [257, 259], [258, 260, 326], [259, 261], [212, 260, 262], [261, 263], [262, 264, 327], [263, 265], [213, 264, 266], [265, 267], [266, 268, 328], [267, 269], [214, 268, 270], [269, 271], [270, 272, 329], [271, 273], [215, 272, 274], [273, 275], [274, 276, 330], [275, 277], [216, 276, 278], [277, 279], [278, 280, 331], [279, 281], [217, 280, 282], [281, 283], [282, 284, 332], [283, 285], [218, 284, 286], [285, 287], [286, 288, 333], [287, 289], [219, 288, 290], [289, 291], [290, 292, 334], [291, 293], [220, 292, 294], [293, 295], [294, 296, 335], [295, 297], [221, 296, 298], [297, 299], [298, 300, 336], [299, 301], [222, 300, 302], [301, 303], [302, 304, 337], [303, 305], [223, 304, 306], [305, 307], [306, 308, 338], [307, 309], [224, 308, 310], [309, 311], [310, 312, 339], [311, 313], [225, 312, 314], [313, 315], [314, 316, 340], [315, 317], [226, 316], [227, 341], [231, 345], [235, 349], [239, 353], [243, 357], [247, 361], [251, 365], [255, 369], [259, 373], [263, 377], [267, 381], [271, 385], [275, 389], [279, 393], [283, 397], [287, 401], [291, 405], [295, 409], [299, 413], [303, 417], [307, 421], [311, 425], [315, 429], [318, 342], [341, 343], [342, 344, 432], [343, 345], [319, 344, 346], [345, 347], [346, 348, 433], [347, 349], [320, 348, 350], [349, 351], [350, 352, 434], [351, 353], [321, 352, 354], [353, 355], [354, 356, 435], [355, 357], [322, 356, 358], [357, 359], [358, 360, 436], [359, 361], [323, 360, 362], [361, 363], [362, 364, 437], [363, 365], [324, 364, 366], [365, 367], [366, 368, 438], [367, 369], [325, 368, 370], [369, 371], [370, 372, 439], [371, 373], [326, 372, 374], [373, 375], [374, 376, 440], [375, 377], [327, 376, 378], [377, 379], [378, 380, 441], [379, 381], [328, 380, 382], [381, 383], [382, 384, 442], [383, 385], [329, 384, 386], [385, 387], [386, 388, 443], [387, 389], [330, 388, 390], [389, 391], [390, 392, 444], [391, 393], [331, 392, 394], [393, 395], [394, 396, 445], [395, 397], [332, 396, 398], [397, 399], [398, 400, 446], [399, 401], [333, 400, 402], [401, 403], [402, 404, 447], [403, 405], [334, 404, 406], [405, 407], [406, 408, 448], [407, 409], [335, 408, 410], [409, 411], [410, 412, 449], [411, 413], [336, 412, 414], [413, 415], [414, 416, 450], [415, 417], [337, 416, 418], [417, 419], [418, 420, 451], [419, 421], [338, 420, 422], [421, 423], [422, 424, 452], [423, 425], [339, 424, 426], [425, 427], [426, 428, 453], [427, 429], [340, 428, 430], [429, 431], [430, 454], [343, 457], [347, 461], [351, 465], [355, 469], [359, 473], [363, 477], [367, 481], [371, 485], [375, 489], [379, 493], [383, 497], [387, 501], [391, 505], [395, 509], [399, 513], [403, 517], [407, 521], [411, 525], [415, 529], [419, 533], [423, 537], [427, 541], [431, 545], [456, 546], [455, 457], [432, 456, 458], [457, 459], [458, 460, 547], [459, 461], [433, 460, 462], [461, 463], [462, 464, 548], [463, 465], [434, 464, 466], [465, 467], [466, 468, 549], [467, 469], [435, 468, 470], [469, 471], [470, 472, 550], [471, 473], [436, 472, 474], [473, 475], [474, 476, 551], [475, 477], [437, 476, 478], [477, 479], [478, 480, 552], [479, 481], [438, 480, 482], [481, 483], [482, 484, 553], [483, 485], [439, 484, 486], [485, 487], [486, 488, 554], [487, 489], [440, 488, 490], [489, 491], [490, 492, 555], [491, 493], [441, 492, 494], [493, 495], [494, 496, 556], [495, 497], [442, 496, 498], [497, 499], [498, 500, 557], [499, 501], [443, 500, 502], [501, 503], [502, 504, 558], [503, 505], [444, 504, 506], [505, 507], [506, 508, 559], [507, 509], [445, 508, 510], [509, 511], [510, 512, 560], [511, 513], [446, 512, 514], [513, 515], [514, 516, 561], [515, 517], [447, 516, 518], [517, 519], [518, 520, 562], [519, 521], [448, 520, 522], [521, 523], [522, 524, 563], [523, 525], [449, 524, 526], [525, 527], [526, 528, 564], [527, 529], [450, 528, 530], [529, 531], [530, 532, 565], [531, 533], [451, 532, 534], [533, 535], [534, 536, 566], [535, 537], [452, 536, 538], [537, 539], [538, 540, 567], [539, 541], [453, 540, 542], [541, 543], [542, 544, 568], [543, 545], [454, 544], [455, 569], [459, 573], [463, 577], [467, 581], [471, 585], [475, 589], [479, 593], [483, 597], [487, 601], [491, 605], [495, 609], [499, 613], [503, 617], [507, 621], [511, 625], [515, 629], [519, 633], [523, 637], [527, 641], [531, 645], [535, 649], [539, 653], [543, 657], [546, 570], [569, 571], [570, 572, 660], [571, 573], [547, 572, 574], [573, 575], [574, 576, 661], [575, 577], [548, 576, 578], [577, 579], [578, 580, 662], [579, 581], [549, 580, 582], [581, 583], [582, 584, 663], [583, 585], [550, 584, 586], [585, 587], [586, 588, 664], [587, 589], [551, 588, 590], [589, 591], [590, 592, 665], [591, 593], [552, 592, 594], [593, 595], [594, 596, 666], [595, 597], [553, 596, 598], [597, 599], [598, 600, 667], [599, 601], [554, 600, 602], [601, 603], [602, 604, 668], [603, 605], [555, 604, 606], [605, 607], [606, 608, 669], [607, 609], [556, 608, 610], [609, 611], [610, 612, 670], [611, 613], [557, 612, 614], [613, 615], [614, 616, 671], [615, 617], [558, 616, 618], [617, 619], [618, 620, 672], [619, 621], [559, 620, 622], [621, 623], [622, 624, 673], [623, 625], [560, 624, 626], [625, 627], [626, 628, 674], [627, 629], [561, 628, 630], [629, 631], [630, 632, 675], [631, 633], [562, 632, 634], [633, 635], [634, 636, 676], [635, 637], [563, 636, 638], [637, 639], [638, 640, 677], [639, 641], [564, 640, 642], [641, 643], [642, 644, 678], [643, 645], [565, 644, 646], [645, 647], [646, 648, 679], [647, 649], [566, 648, 650], [649, 651], [650, 652, 680], [651, 653], [567, 652, 654], [653, 655], [654, 656, 681], [655, 657], [568, 656, 658], [657, 659], [658, 682], [571, 685], [575, 689], [579, 693], [583, 697], [587, 701], [591, 705], [595, 709], [599, 713], [603, 717], [607, 721], [611, 725], [615, 729], [619, 733], [623, 737], [627, 741], [631, 745], [635, 749], [639, 753], [643, 757], [647, 761], [651, 765], [655, 769], [659, 773], [684, 774], [683, 685], [660, 684, 686], [685, 687], [686, 688, 775], [687, 689], [661, 688, 690], [689, 691], [690, 692, 776], [691, 693], [662, 692, 694], [693, 695], [694, 696, 777], [695, 697], [663, 696, 698], [697, 699], [698, 700, 778], [699, 701], [664, 700, 702], [701, 703], [702, 704, 779], [703, 705], [665, 704, 706], [705, 707], [706, 708, 780], [707, 709], [666, 708, 710], [709, 711], [710, 712, 781], [711, 713], [667, 712, 714], [713, 715], [714, 716, 782], [715, 717], [668, 716, 718], [717, 719], [718, 720, 783], [719, 721], [669, 720, 722], [721, 723], [722, 724, 784], [723, 725], [670, 724, 726], [725, 727], [726, 728, 785], [727, 729], [671, 728, 730], [729, 731], [730, 732, 786], [731, 733], [672, 732, 734], [733, 735], [734, 736, 787], [735, 737], [673, 736, 738], [737, 739], [738, 740, 788], [739, 741], [674, 740, 742], [741, 743], [742, 744, 789], [743, 745], [675, 744, 746], [745, 747], [746, 748, 790], [747, 749], [676, 748, 750], [749, 751], [750, 752, 791], [751, 753], [677, 752, 754], [753, 755], [754, 756, 792], [755, 757], [678, 756, 758], [757, 759], [758, 760, 793], [759, 761], [679, 760, 762], [761, 763], [762, 764, 794], [763, 765], [680, 764, 766], [765, 767], [766, 768, 795], [767, 769], [681, 768, 770], [769, 771], [770, 772, 796], [771, 773], [682, 772], [683, 797], [687, 801], [691, 805], [695, 809], [699, 813], [703, 817], [707, 821], [711, 825], [715, 829], [719, 833], [723, 837], [727, 841], [731, 845], [735, 849], [739, 853], [743, 857], [747, 861], [751, 865], [755, 869], [759, 873], [763, 877], [767, 881], [771, 885], [774, 798], [797, 799], [798, 800, 888], [799, 801], [775, 800, 802], [801, 803], [802, 804, 889], [803, 805], [776, 804, 806], [805, 807], [806, 808, 890], [807, 809], [777, 808, 810], [809, 811], [810, 812, 891], [811, 813], [778, 812, 814], [813, 815], [814, 816, 892], [815, 817], [779, 816, 818], [817, 819], [818, 820, 893], [819, 821], [780, 820, 822], [821, 823], [822, 824, 894], [823, 825], [781, 824, 826], [825, 827], [826, 828, 895], [827, 829], [782, 828, 830], [829, 831], [830, 832, 896], [831, 833], [783, 832, 834], [833, 835], [834, 836, 897], [835, 837], [784, 836, 838], [837, 839], [838, 840, 898], [839, 841], [785, 840, 842], [841, 843], [842, 844, 899], [843, 845], [786, 844, 846], [845, 847], [846, 848, 900], [847, 849], [787, 848, 850], [849, 851], [850, 852, 901], [851, 853], [788, 852, 854], [853, 855], [854, 856, 902], [855, 857], [789, 856, 858], [857, 859], [858, 860, 903], [859, 861], [790, 860, 862], [861, 863], [862, 864, 904], [863, 865], [791, 864, 866], [865, 867], [866, 868, 905], [867, 869], [792, 868, 870], [869, 871], [870, 872, 906], [871, 873], [793, 872, 874], [873, 875], [874, 876, 907], [875, 877], [794, 876, 878], [877, 879], [878, 880, 908], [879, 881], [795, 880, 882], [881, 883], [882, 884, 909], [883, 885], [796, 884, 886], [885, 887], [886, 910], [799, 913], [803, 917], [807, 921], [811, 925], [815, 929], [819, 933], [823, 937], [827, 941], [831, 945], [835, 949], [839, 953], [843, 957], [847, 961], [851, 965], [855, 969], [859, 973], [863, 977], [867, 981], [871, 985], [875, 989], [879, 993], [883, 997], [887, 1001], [912, 1002], [911, 913], [888, 912, 914], [913, 915], [914, 916, 1003], [915, 917], [889, 916, 918], [917, 919], [918, 920, 1004], [919, 921], [890, 920, 922], [921, 923], [922, 924, 1005], [923, 925], [891, 924, 926], [925, 927], [926, 928, 1006], [927, 929], [892, 928, 930], [929, 931], [930, 932, 1007], [931, 933], [893, 932, 934], [933, 935], [934, 936, 1008], [935, 937], [894, 936, 938], [937, 939], [938, 940, 1009], [939, 941], [895, 940, 942], [941, 943], [942, 944, 1010], [943, 945], [896, 944, 946], [945, 947], [946, 948, 1011], [947, 949], [897, 948, 950], [949, 951], [950, 952, 1012], [951, 953], [898, 952, 954], [953, 955], [954, 956, 1013], [955, 957], [899, 956, 958], [957, 959], [958, 960, 1014], [959, 961], [900, 960, 962], [961, 963], [962, 964, 1015], [963, 965], [901, 964, 966], [965, 967], [966, 968, 1016], [967, 969], [902, 968, 970], [969, 971], [970, 972, 1017], [971, 973], [903, 972, 974], [973, 975], [974, 976, 1018], [975, 977], [904, 976, 978], [977, 979], [978, 980, 1019], [979, 981], [905, 980, 982], [981, 983], [982, 984, 1020], [983, 985], [906, 984, 986], [985, 987], [986, 988, 1021], [987, 989], [907, 988, 990], [989, 991], [990, 992, 1022], [991, 993], [908, 992, 994], [993, 995], [994, 996, 1023], [995, 997], [909, 996, 998], [997, 999], [998, 1000, 1024], [999, 1001], [910, 1000], [911, 1025], [915, 1029], [919, 1033], [923, 1037], [927, 1041], [931, 1045], [935, 1049], [939, 1053], [943, 1057], [947, 1061], [951, 1065], [955, 1069], [959, 1073], [963, 1077], [967, 1081], [971, 1085], [975, 1089], [979, 1093], [983, 1097], [987, 1101], [991, 1105], [995, 1109], [999, 1113], [1002, 1026], [1025, 1027], [1026, 1028, 1116], [1027, 1029], [1003, 1028, 1030], [1029, 1031], [1030, 1032, 1117], [1031, 1033], [1004, 1032, 1034], [1033, 1035], [1034, 1036, 1118], [1035, 1037], [1005, 1036, 1038], [1037, 1039], [1038, 1040, 1119], [1039, 1041], [1006, 1040, 1042], [1041, 1043], [1042, 1044, 1120], [1043, 1045], [1007, 1044, 1046], [1045, 1047], [1046, 1048, 1121], [1047, 1049], [1008, 1048, 1050], [1049, 1051], [1050, 1052, 1122], [1051, 1053], [1009, 1052, 1054], [1053, 1055], [1054, 1056, 1123], [1055, 1057], [1010, 1056, 1058], [1057, 1059], [1058, 1060, 1124], [1059, 1061], [1011, 1060, 1062], [1061, 1063], [1062, 1064, 1125], [1063, 1065], [1012, 1064, 1066], [1065, 1067], [1066, 1068, 1126], [1067, 1069], [1013, 1068, 1070], [1069, 1071], [1070, 1072, 1127], [1071, 1073], [1014, 1072, 1074], [1073, 1075], [1074, 1076, 1128], [1075, 1077], [1015, 1076, 1078], [1077, 1079], [1078, 1080, 1129], [1079, 1081], [1016, 1080, 1082], [1081, 1083], [1082, 1084, 1130], [1083, 1085], [1017, 1084, 1086], [1085, 1087], [1086, 1088, 1131], [1087, 1089], [1018, 1088, 1090], [1089, 1091], [1090, 1092, 1132], [1091, 1093], [1019, 1092, 1094], [1093, 1095], [1094, 1096, 1133], [1095, 1097], [1020, 1096, 1098], [1097, 1099], [1098, 1100, 1134], [1099, 1101], [1021, 1100, 1102], [1101, 1103], [1102, 1104, 1135], [1103, 1105], [1022, 1104, 1106], [1105, 1107], [1106, 1108, 1136], [1107, 1109], [1023, 1108, 1110], [1109, 1111], [1110, 1112, 1137], [1111, 1113], [1024, 1112, 1114], [1113, 1115], [1114, 1138], [1027, 1141], [1031, 1145], [1035, 1149], [1039, 1153], [1043, 1157], [1047, 1161], [1051, 1165], [1055, 1169], [1059, 1173], [1063, 1177], [1067, 1181], [1071, 1185], [1075, 1189], [1079, 1193], [1083, 1197], [1087, 1201], [1091, 1205], [1095, 1209], [1099, 1213], [1103, 1217], [1107, 1221], [1111, 1225], [1115, 1229], [1140, 1230], [1139, 1141], [1116, 1140, 1142], [1141, 1143], [1142, 1144, 1231], [1143, 1145], [1117, 1144, 1146], [1145, 1147], [1146, 1148, 1232], [1147, 1149], [1118, 1148, 1150], [1149, 1151], [1150, 1152, 1233], [1151, 1153], [1119, 1152, 1154], [1153, 1155], [1154, 1156, 1234], [1155, 1157], [1120, 1156, 1158], [1157, 1159], [1158, 1160, 1235], [1159, 1161], [1121, 1160, 1162], [1161, 1163], [1162, 1164, 1236], [1163, 1165], [1122, 1164, 1166], [1165, 1167], [1166, 1168, 1237], [1167, 1169], [1123, 1168, 1170], [1169, 1171], [1170, 1172, 1238], [1171, 1173], [1124, 1172, 1174], [1173, 1175], [1174, 1176, 1239], [1175, 1177], [1125, 1176, 1178], [1177, 1179], [1178, 1180, 1240], [1179, 1181], [1126, 1180, 1182], [1181, 1183], [1182, 1184, 1241], [1183, 1185], [1127, 1184, 1186], [1185, 1187], [1186, 1188, 1242], [1187, 1189], [1128, 1188, 1190], [1189, 1191], [1190, 1192, 1243], [1191, 1193], [1129, 1192, 1194], [1193, 1195], [1194, 1196, 1244], [1195, 1197], [1130, 1196, 1198], [1197, 1199], [1198, 1200, 1245], [1199, 1201], [1131, 1200, 1202], [1201, 1203], [1202, 1204, 1246], [1203, 1205], [1132, 1204, 1206], [1205, 1207], [1206, 1208, 1247], [1207, 1209], [1133, 1208, 1210], [1209, 1211], [1210, 1212, 1248], [1211, 1213], [1134, 1212, 1214], [1213, 1215], [1214, 1216, 1249], [1215, 1217], [1135, 1216, 1218], [1217, 1219], [1218, 1220, 1250], [1219, 1221], [1136, 1220, 1222], [1221, 1223], [1222, 1224, 1251], [1223, 1225], [1137, 1224, 1226], [1225, 1227], [1226, 1228, 1252], [1227, 1229], [1138, 1228], [1139, 1253], [1143, 1257], [1147, 1261], [1151, 1265], [1155, 1269], [1159, 1273], [1163, 1277], [1167, 1281], [1171, 1285], [1175, 1289], [1179, 1293], [1183, 1297], [1187, 1301], [1191, 1305], [1195, 1309], [1199, 1313], [1203, 1317], [1207, 1321], [1211, 1325], [1215, 1329], [1219, 1333], [1223, 1337], [1227, 1341], [1230, 1254], [1253, 1255], [1254, 1256, 1344], [1255, 1257], [1231, 1256, 1258], [1257, 1259], [1258, 1260, 1345], [1259, 1261], [1232, 1260, 1262], [1261, 1263], [1262, 1264, 1346], [1263, 1265], [1233, 1264, 1266], [1265, 1267], [1266, 1268, 1347], [1267, 1269], [1234, 1268, 1270], [1269, 1271], [1270, 1272, 1348], [1271, 1273], [1235, 1272, 1274], [1273, 1275], [1274, 1276, 1349], [1275, 1277], [1236, 1276, 1278], [1277, 1279], [1278, 1280, 1350], [1279, 1281], [1237, 1280, 1282], [1281, 1283], [1282, 1284, 1351], [1283, 1285], [1238, 1284, 1286], [1285, 1287], [1286, 1288, 1352], [1287, 1289], [1239, 1288, 1290], [1289, 1291], [1290, 1292, 1353], [1291, 1293], [1240, 1292, 1294], [1293, 1295], [1294, 1296, 1354], [1295, 1297], [1241, 1296, 1298], [1297, 1299], [1298, 1300, 1355], [1299, 1301], [1242, 1300, 1302], [1301, 1303], [1302, 1304, 1356], [1303, 1305], [1243, 1304, 1306], [1305, 1307], [1306, 1308, 1357], [1307, 1309], [1244, 1308, 1310], [1309, 1311], [1310, 1312, 1358], [1311, 1313], [1245, 1312, 1314], [1313, 1315], [1314, 1316, 1359], [1315, 1317], [1246, 1316, 1318], [1317, 1319], [1318, 1320, 1360], [1319, 1321], [1247, 1320, 1322], [1321, 1323], [1322, 1324, 1361], [1323, 1325], [1248, 1324, 1326], [1325, 1327], [1326, 1328, 1362], [1327, 1329], [1249, 1328, 1330], [1329, 1331], [1330, 1332, 1363], [1331, 1333], [1250, 1332, 1334], [1333, 1335], [1334, 1336, 1364], [1335, 1337], [1251, 1336, 1338], [1337, 1339], [1338, 1340, 1365], [1339, 1341], [1252, 1340, 1342], [1341, 1343], [1342, 1366], [1255, 1369], [1259, 1373], [1263, 1377], [1267, 1381], [1271, 1385], [1275, 1389], [1279, 1393], [1283, 1397], [1287, 1401], [1291, 1405], [1295, 1409], [1299, 1413], [1303, 1417], [1307, 1421], [1311, 1425], [1315, 1429], [1319, 1433], [1323, 1437], [1327, 1441], [1331, 1445], [1335, 1449], [1339, 1453], [1343, 1457], [1368, 1458], [1367, 1369], [1344, 1368, 1370], [1369, 1371], [1370, 1372, 1459], [1371, 1373], [1345, 1372, 1374], [1373, 1375], [1374, 1376, 1460], [1375, 1377], [1346, 1376, 1378], [1377, 1379], [1378, 1380, 1461], [1379, 1381], [1347, 1380, 1382], [1381, 1383], [1382, 1384, 1462], [1383, 1385], [1348, 1384, 1386], [1385, 1387], [1386, 1388, 1463], [1387, 1389], [1349, 1388, 1390], [1389, 1391], [1390, 1392, 1464], [1391, 1393], [1350, 1392, 1394], [1393, 1395], [1394, 1396, 1465], [1395, 1397], [1351, 1396, 1398], [1397, 1399], [1398, 1400, 1466], [1399, 1401], [1352, 1400, 1402], [1401, 1403], [1402, 1404, 1467], [1403, 1405], [1353, 1404, 1406], [1405, 1407], [1406, 1408, 1468], [1407, 1409], [1354, 1408, 1410], [1409, 1411], [1410, 1412, 1469], [1411, 1413], [1355, 1412, 1414], [1413, 1415], [1414, 1416, 1470], [1415, 1417], [1356, 1416, 1418], [1417, 1419], [1418, 1420, 1471], [1419, 1421], [1357, 1420, 1422], [1421, 1423], [1422, 1424, 1472], [1423, 1425], [1358, 1424, 1426], [1425, 1427], [1426, 1428, 1473], [1427, 1429], [1359, 1428, 1430], [1429, 1431], [1430, 1432, 1474], [1431, 1433], [1360, 1432, 1434], [1433, 1435], [1434, 1436, 1475], [1435, 1437], [1361, 1436, 1438], [1437, 1439], [1438, 1440, 1476], [1439, 1441], [1362, 1440, 1442], [1441, 1443], [1442, 1444, 1477], [1443, 1445], [1363, 1444, 1446], [1445, 1447], [1446, 1448, 1478], [1447, 1449], [1364, 1448, 1450], [1449, 1451], [1450, 1452, 1479], [1451, 1453], [1365, 1452, 1454], [1453, 1455], [1454, 1456, 1480], [1455, 1457], [1366, 1456], [1367, 1481], [1371, 1485], [1375, 1489], [1379, 1493], [1383, 1497], [1387, 1501], [1391, 1505], [1395, 1509], [1399, 1513], [1403, 1517], [1407, 1521], [1411, 1525], [1415, 1529], [1419, 1533], [1423, 1537], [1427, 1541], [1431, 1545], [1435, 1549], [1439, 1553], [1443, 1557], [1447, 1561], [1451, 1565], [1455, 1569], [1458, 1482], [1481, 1483], [1482, 1484, 1572], [1483, 1485], [1459, 1484, 1486], [1485, 1487], [1486, 1488, 1573], [1487, 1489], [1460, 1488, 1490], [1489, 1491], [1490, 1492, 1574], [1491, 1493], [1461, 1492, 1494], [1493, 1495], [1494, 1496, 1575], [1495, 1497], [1462, 1496, 1498], [1497, 1499], [1498, 1500, 1576], [1499, 1501], [1463, 1500, 1502], [1501, 1503], [1502, 1504, 1577], [1503, 1505], [1464, 1504, 1506], [1505, 1507], [1506, 1508, 1578], [1507, 1509], [1465, 1508, 1510], [1509, 1511], [1510, 1512, 1579], [1511, 1513], [1466, 1512, 1514], [1513, 1515], [1514, 1516, 1580], [1515, 1517], [1467, 1516, 1518], [1517, 1519], [1518, 1520, 1581], [1519, 1521], [1468, 1520, 1522], [1521, 1523], [1522, 1524, 1582], [1523, 1525], [1469, 1524, 1526], [1525, 1527], [1526, 1528, 1583], [1527, 1529], [1470, 1528, 1530], [1529, 1531], [1530, 1532, 1584], [1531, 1533], [1471, 1532, 1534], [1533, 1535], [1534, 1536, 1585], [1535, 1537], [1472, 1536, 1538], [1537, 1539], [1538, 1540, 1586], [1539, 1541], [1473, 1540, 1542], [1541, 1543], [1542, 1544, 1587], [1543, 1545], [1474, 1544, 1546], [1545, 1547], [1546, 1548, 1588], [1547, 1549], [1475, 1548, 1550], [1549, 1551], [1550, 1552, 1589], [1551, 1553], [1476, 1552, 1554], [1553, 1555], [1554, 1556, 1590], [1555, 1557], [1477, 1556, 1558], [1557, 1559], [1558, 1560, 1591], [1559, 1561], [1478, 1560, 1562], [1561, 1563], [1562, 1564, 1592], [1563, 1565], [1479, 1564, 1566], [1565, 1567], [1566, 1568, 1593], [1567, 1569], [1480, 1568, 1570], [1569, 1571], [1570, 1594], [1483, 1597], [1487, 1601], [1491, 1605], [1495, 1609], [1499, 1613], [1503, 1617], [1507, 1621], [1511, 1625], [1515, 1629], [1519, 1633], [1523, 1637], [1527, 1641], [1531, 1645], [1535, 1649], [1539, 1653], [1543, 1657], [1547, 1661], [1551, 1665], [1555, 1669], [1559, 1673], [1563, 1677], [1567, 1681], [1571, 1685], [1596, 1686], [1595, 1597], [1572, 1596, 1598], [1597, 1599], [1598, 1600, 1687], [1599, 1601], [1573, 1600, 1602], [1601, 1603], [1602, 1604, 1688], [1603, 1605], [1574, 1604, 1606], [1605, 1607], [1606, 1608, 1689], [1607, 1609], [1575, 1608, 1610], [1609, 1611], [1610, 1612, 1690], [1611, 1613], [1576, 1612, 1614], [1613, 1615], [1614, 1616, 1691], [1615, 1617], [1577, 1616, 1618], [1617, 1619], [1618, 1620, 1692], [1619, 1621], [1578, 1620, 1622], [1621, 1623], [1622, 1624, 1693], [1623, 1625], [1579, 1624, 1626], [1625, 1627], [1626, 1628, 1694], [1627, 1629], [1580, 1628, 1630], [1629, 1631], [1630, 1632, 1695], [1631, 1633], [1581, 1632, 1634], [1633, 1635], [1634, 1636, 1696], [1635, 1637], [1582, 1636, 1638], [1637, 1639], [1638, 1640, 1697], [1639, 1641], [1583, 1640, 1642], [1641, 1643], [1642, 1644, 1698], [1643, 1645], [1584, 1644, 1646], [1645, 1647], [1646, 1648, 1699], [1647, 1649], [1585, 1648, 1650], [1649, 1651], [1650, 1652, 1700], [1651, 1653], [1586, 1652, 1654], [1653, 1655], [1654, 1656, 1701], [1655, 1657], [1587, 1656, 1658], [1657, 1659], [1658, 1660, 1702], [1659, 1661], [1588, 1660, 1662], [1661, 1663], [1662, 1664, 1703], [1663, 1665], [1589, 1664, 1666], [1665, 1667], [1666, 1668, 1704], [1667, 1669], [1590, 1668, 1670], [1669, 1671], [1670, 1672, 1705], [1671, 1673], [1591, 1672, 1674], [1673, 1675], [1674, 1676, 1706], [1675, 1677], [1592, 1676, 1678], [1677, 1679], [1678, 1680, 1707], [1679, 1681], [1593, 1680, 1682], [1681, 1683], [1682, 1684, 1708], [1683, 1685], [1594, 1684], [1595, 1709], [1599, 1713], [1603, 1717], [1607, 1721], [1611, 1725], [1615, 1729], [1619, 1733], [1623, 1737], [1627, 1741], [1631, 1745], [1635, 1749], [1639, 1753], [1643, 1757], [1647, 1761], [1651, 1765], [1655, 1769], [1659, 1773], [1663, 1777], [1667, 1781], [1671, 1785], [1675, 1789], [1679, 1793], [1683, 1797], [1686, 1710], [1709, 1711], [1710, 1712, 1800], [1711, 1713], [1687, 1712, 1714], [1713, 1715], [1714, 1716, 1801], [1715, 1717], [1688, 1716, 1718], [1717, 1719], [1718, 1720, 1802], [1719, 1721], [1689, 1720, 1722], [1721, 1723], [1722, 1724, 1803], [1723, 1725], [1690, 1724, 1726], [1725, 1727], [1726, 1728, 1804], [1727, 1729], [1691, 1728, 1730], [1729, 1731], [1730, 1732, 1805], [1731, 1733], [1692, 1732, 1734], [1733, 1735], [1734, 1736, 1806], [1735, 1737], [1693, 1736, 1738], [1737, 1739], [1738, 1740, 1807], [1739, 1741], [1694, 1740, 1742], [1741, 1743], [1742, 1744, 1808], [1743, 1745], [1695, 1744, 1746], [1745, 1747], [1746, 1748, 1809], [1747, 1749], [1696, 1748, 1750], [1749, 1751], [1750, 1752, 1810], [1751, 1753], [1697, 1752, 1754], [1753, 1755], [1754, 1756, 1811], [1755, 1757], [1698, 1756, 1758], [1757, 1759], [1758, 1760, 1812], [1759, 1761], [1699, 1760, 1762], [1761, 1763], [1762, 1764, 1813], [1763, 1765], [1700, 1764, 1766], [1765, 1767], [1766, 1768, 1814], [1767, 1769], [1701, 1768, 1770], [1769, 1771], [1770, 1772, 1815], [1771, 1773], [1702, 1772, 1774], [1773, 1775], [1774, 1776, 1816], [1775, 1777], [1703, 1776, 1778], [1777, 1779], [1778, 1780, 1817], [1779, 1781], [1704, 1780, 1782], [1781, 1783], [1782, 1784, 1818], [1783, 1785], [1705, 1784, 1786], [1785, 1787], [1786, 1788, 1819], [1787, 1789], [1706, 1788, 1790], [1789, 1791], [1790, 1792, 1820], [1791, 1793], [1707, 1792, 1794], [1793, 1795], [1794, 1796, 1821], [1795, 1797], [1708, 1796, 1798], [1797, 1799], [1798, 1822], [1711, 1825], [1715, 1829], [1719, 1833], [1723, 1837], [1727, 1841], [1731, 1845], [1735, 1849], [1739, 1853], [1743, 1857], [1747, 1861], [1751, 1865], [1755, 1869], [1759, 1873], [1763, 1877], [1767, 1881], [1771, 1885], [1775, 1889], [1779, 1893], [1783, 1897], [1787, 1901], [1791, 1905], [1795, 1909], [1799, 1913], [1824, 1914], [1823, 1825], [1800, 1824, 1826], [1825, 1827], [1826, 1828, 1915], [1827, 1829], [1801, 1828, 1830], [1829, 1831], [1830, 1832, 1916], [1831, 1833], [1802, 1832, 1834], [1833, 1835], [1834, 1836, 1917], [1835, 1837], [1803, 1836, 1838], [1837, 1839], [1838, 1840, 1918], [1839, 1841], [1804, 1840, 1842], [1841, 1843], [1842, 1844, 1919], [1843, 1845], [1805, 1844, 1846], [1845, 1847], [1846, 1848, 1920], [1847, 1849], [1806, 1848, 1850], [1849, 1851], [1850, 1852, 1921], [1851, 1853], [1807, 1852, 1854], [1853, 1855], [1854, 1856, 1922], [1855, 1857], [1808, 1856, 1858], [1857, 1859], [1858, 1860, 1923], [1859, 1861], [1809, 1860, 1862], [1861, 1863], [1862, 1864, 1924], [1863, 1865], [1810, 1864, 1866], [1865, 1867], [1866, 1868, 1925], [1867, 1869], [1811, 1868, 1870], [1869, 1871], [1870, 1872, 1926], [1871, 1873], [1812, 1872, 1874], [1873, 1875], [1874, 1876, 1927], [1875, 1877], [1813, 1876, 1878], [1877, 1879], [1878, 1880, 1928], [1879, 1881], [1814, 1880, 1882], [1881, 1883], [1882, 1884, 1929], [1883, 1885], [1815, 1884, 1886], [1885, 1887], [1886, 1888, 1930], [1887, 1889], [1816, 1888, 1890], [1889, 1891], [1890, 1892, 1931], [1891, 1893], [1817, 1892, 1894], [1893, 1895], [1894, 1896, 1932], [1895, 1897], [1818, 1896, 1898], [1897, 1899], [1898, 1900, 1933], [1899, 1901], [1819, 1900, 1902], [1901, 1903], [1902, 1904, 1934], [1903, 1905], [1820, 1904, 1906], [1905, 1907], [1906, 1908, 1935], [1907, 1909], [1821, 1908, 1910], [1909, 1911], [1910, 1912, 1936], [1911, 1913], [1822, 1912], [1823, 1937], [1827, 1941], [1831, 1945], [1835, 1949], [1839, 1953], [1843, 1957], [1847, 1961], [1851, 1965], [1855, 1969], [1859, 1973], [1863, 1977], [1867, 1981], [1871, 1985], [1875, 1989], [1879, 1993], [1883, 1997], [1887, 2001], [1891, 2005], [1895, 2009], [1899, 2013], [1903, 2017], [1907, 2021], [1911, 2025], [1914, 1938], [1937, 1939], [1938, 1940, 2028], [1939, 1941], [1915, 1940, 1942], [1941, 1943], [1942, 1944, 2029], [1943, 1945], [1916, 1944, 1946], [1945, 1947], [1946, 1948, 2030], [1947, 1949], [1917, 1948, 1950], [1949, 1951], [1950, 1952, 2031], [1951, 1953], [1918, 1952, 1954], [1953, 1955], [1954, 1956, 2032], [1955, 1957], [1919, 1956, 1958], [1957, 1959], [1958, 1960, 2033], [1959, 1961], [1920, 1960, 1962], [1961, 1963], [1962, 1964, 2034], [1963, 1965], [1921, 1964, 1966], [1965, 1967], [1966, 1968, 2035], [1967, 1969], [1922, 1968, 1970], [1969, 1971], [1970, 1972, 2036], [1971, 1973], [1923, 1972, 1974], [1973, 1975], [1974, 1976, 2037], [1975, 1977], [1924, 1976, 1978], [1977, 1979], [1978, 1980, 2038], [1979, 1981], [1925, 1980, 1982], [1981, 1983], [1982, 1984, 2039], [1983, 1985], [1926, 1984, 1986], [1985, 1987], [1986, 1988, 2040], [1987, 1989], [1927, 1988, 1990], [1989, 1991], [1990, 1992, 2041], [1991, 1993], [1928, 1992, 1994], [1993, 1995], [1994, 1996, 2042], [1995, 1997], [1929, 1996, 1998], [1997, 1999], [1998, 2000, 2043], [1999, 2001], [1930, 2000, 2002], [2001, 2003], [2002, 2004, 2044], [2003, 2005], [1931, 2004, 2006], [2005, 2007], [2006, 2008, 2045], [2007, 2009], [1932, 2008, 2010], [2009, 2011], [2010, 2012, 2046], [2011, 2013], [1933, 2012, 2014], [2013, 2015], [2014, 2016, 2047], [2015, 2017], [1934, 2016, 2018], [2017, 2019], [2018, 2020, 2048], [2019, 2021], [1935, 2020, 2022], [2021, 2023], [2022, 2024, 2049], [2023, 2025], [1936, 2024, 2026], [2025, 2027], [2026, 2050], [1939, 2053], [1943, 2057], [1947, 2061], [1951, 2065], [1955, 2069], [1959, 2073], [1963, 2077], [1967, 2081], [1971, 2085], [1975, 2089], [1979, 2093], [1983, 2097], [1987, 2101], [1991, 2105], [1995, 2109], [1999, 2113], [2003, 2117], [2007, 2121], [2011, 2125], [2015, 2129], [2019, 2133], [2023, 2137], [2027, 2141], [2052, 2142], [2051, 2053], [2028, 2052, 2054], [2053, 2055], [2054, 2056, 2143], [2055, 2057], [2029, 2056, 2058], [2057, 2059], [2058, 2060, 2144], [2059, 2061], [2030, 2060, 2062], [2061, 2063], [2062, 2064, 2145], [2063, 2065], [2031, 2064, 2066], [2065, 2067], [2066, 2068, 2146], [2067, 2069], [2032, 2068, 2070], [2069, 2071], [2070, 2072, 2147], [2071, 2073], [2033, 2072, 2074], [2073, 2075], [2074, 2076, 2148], [2075, 2077], [2034, 2076, 2078], [2077, 2079], [2078, 2080, 2149], [2079, 2081], [2035, 2080, 2082], [2081, 2083], [2082, 2084, 2150], [2083, 2085], [2036, 2084, 2086], [2085, 2087], [2086, 2088, 2151], [2087, 2089], [2037, 2088, 2090], [2089, 2091], [2090, 2092, 2152], [2091, 2093], [2038, 2092, 2094], [2093, 2095], [2094, 2096, 2153], [2095, 2097], [2039, 2096, 2098], [2097, 2099], [2098, 2100, 2154], [2099, 2101], [2040, 2100, 2102], [2101, 2103], [2102, 2104, 2155], [2103, 2105], [2041, 2104, 2106], [2105, 2107], [2106, 2108, 2156], [2107, 2109], [2042, 2108, 2110], [2109, 2111], [2110, 2112, 2157], [2111, 2113], [2043, 2112, 2114], [2113, 2115], [2114, 2116, 2158], [2115, 2117], [2044, 2116, 2118], [2117, 2119], [2118, 2120, 2159], [2119, 2121], [2045, 2120, 2122], [2121, 2123], [2122, 2124, 2160], [2123, 2125], [2046, 2124, 2126], [2125, 2127], [2126, 2128, 2161], [2127, 2129], [2047, 2128, 2130], [2129, 2131], [2130, 2132, 2162], [2131, 2133], [2048, 2132, 2134], [2133, 2135], [2134, 2136, 2163], [2135, 2137], [2049, 2136, 2138], [2137, 2139], [2138, 2140, 2164], [2139, 2141], [2050, 2140], [2051, 2165], [2055, 2169], [2059, 2173], [2063, 2177], [2067, 2181], [2071, 2185], [2075, 2189], [2079, 2193], [2083, 2197], [2087, 2201], [2091, 2205], [2095, 2209], [2099, 2213], [2103, 2217], [2107, 2221], [2111, 2225], [2115, 2229], [2119, 2233], [2123, 2237], [2127, 2241], [2131, 2245], [2135, 2249], [2139, 2253], [2142, 2166], [2165, 2167], [2166, 2168, 2256], [2167, 2169], [2143, 2168, 2170], [2169, 2171], [2170, 2172, 2257], [2171, 2173], [2144, 2172, 2174], [2173, 2175], [2174, 2176, 2258], [2175, 2177], [2145, 2176, 2178], [2177, 2179], [2178, 2180, 2259], [2179, 2181], [2146, 2180, 2182], [2181, 2183], [2182, 2184, 2260], [2183, 2185], [2147, 2184, 2186], [2185, 2187], [2186, 2188, 2261], [2187, 2189], [2148, 2188, 2190], [2189, 2191], [2190, 2192, 2262], [2191, 2193], [2149, 2192, 2194], [2193, 2195], [2194, 2196, 2263], [2195, 2197], [2150, 2196, 2198], [2197, 2199], [2198, 2200, 2264], [2199, 2201], [2151, 2200, 2202], [2201, 2203], [2202, 2204, 2265], [2203, 2205], [2152, 2204, 2206], [2205, 2207], [2206, 2208, 2266], [2207, 2209], [2153, 2208, 2210], [2209, 2211], [2210, 2212, 2267], [2211, 2213], [2154, 2212, 2214], [2213, 2215], [2214, 2216, 2268], [2215, 2217], [2155, 2216, 2218], [2217, 2219], [2218, 2220, 2269], [2219, 2221], [2156, 2220, 2222], [2221, 2223], [2222, 2224, 2270], [2223, 2225], [2157, 2224, 2226], [2225, 2227], [2226, 2228, 2271], [2227, 2229], [2158, 2228, 2230], [2229, 2231], [2230, 2232, 2272], [2231, 2233], [2159, 2232, 2234], [2233, 2235], [2234, 2236, 2273], [2235, 2237], [2160, 2236, 2238], [2237, 2239], [2238, 2240, 2274], [2239, 2241], [2161, 2240, 2242], [2241, 2243], [2242, 2244, 2275], [2243, 2245], [2162, 2244, 2246], [2245, 2247], [2246, 2248, 2276], [2247, 2249], [2163, 2248, 2250], [2249, 2251], [2250, 2252, 2277], [2251, 2253], [2164, 2252, 2254], [2253, 2255], [2254, 2278], [2167, 2281], [2171, 2285], [2175, 2289], [2179, 2293], [2183, 2297], [2187, 2301], [2191, 2305], [2195, 2309], [2199, 2313], [2203, 2317], [2207, 2321], [2211, 2325], [2215, 2329], [2219, 2333], [2223, 2337], [2227, 2341], [2231, 2345], [2235, 2349], [2239, 2353], [2243, 2357], [2247, 2361], [2251, 2365], [2255, 2369], [2280, 2370], [2279, 2281], [2256, 2280, 2282], [2281, 2283], [2282, 2284, 2371], [2283, 2285], [2257, 2284, 2286], [2285, 2287], [2286, 2288, 2372], [2287, 2289], [2258, 2288, 2290], [2289, 2291], [2290, 2292, 2373], [2291, 2293], [2259, 2292, 2294], [2293, 2295], [2294, 2296, 2374], [2295, 2297], [2260, 2296, 2298], [2297, 2299], [2298, 2300, 2375], [2299, 2301], [2261, 2300, 2302], [2301, 2303], [2302, 2304, 2376], [2303, 2305], [2262, 2304, 2306], [2305, 2307], [2306, 2308, 2377], [2307, 2309], [2263, 2308, 2310], [2309, 2311], [2310, 2312, 2378], [2311, 2313], [2264, 2312, 2314], [2313, 2315], [2314, 2316, 2379], [2315, 2317], [2265, 2316, 2318], [2317, 2319], [2318, 2320, 2380], [2319, 2321], [2266, 2320, 2322], [2321, 2323], [2322, 2324, 2381], [2323, 2325], [2267, 2324, 2326], [2325, 2327], [2326, 2328, 2382], [2327, 2329], [2268, 2328, 2330], [2329, 2331], [2330, 2332, 2383], [2331, 2333], [2269, 2332, 2334], [2333, 2335], [2334, 2336, 2384], [2335, 2337], [2270, 2336, 2338], [2337, 2339], [2338, 2340, 2385], [2339, 2341], [2271, 2340, 2342], [2341, 2343], [2342, 2344, 2386], [2343, 2345], [2272, 2344, 2346], [2345, 2347], [2346, 2348, 2387], [2347, 2349], [2273, 2348, 2350], [2349, 2351], [2350, 2352, 2388], [2351, 2353], [2274, 2352, 2354], [2353, 2355], [2354, 2356, 2389], [2355, 2357], [2275, 2356, 2358], [2357, 2359], [2358, 2360, 2390], [2359, 2361], [2276, 2360, 2362], [2361, 2363], [2362, 2364, 2391], [2363, 2365], [2277, 2364, 2366], [2365, 2367], [2366, 2368, 2392], [2367, 2369], [2278, 2368], [2279, 2393], [2283, 2397], [2287, 2401], [2291, 2405], [2295, 2409], [2299, 2413], [2303, 2417], [2307, 2421], [2311, 2425], [2315, 2429], [2319, 2433], [2323, 2437], [2327, 2441], [2331, 2445], [2335, 2449], [2339, 2453], [2343, 2457], [2347, 2461], [2351, 2465], [2355, 2469], [2359, 2473], [2363, 2477], [2367, 2481], [2370, 2394], [2393, 2395], [2394, 2396, 2484], [2395, 2397], [2371, 2396, 2398], [2397, 2399], [2398, 2400, 2485], [2399, 2401], [2372, 2400, 2402], [2401, 2403], [2402, 2404, 2486], [2403, 2405], [2373, 2404, 2406], [2405, 2407], [2406, 2408, 2487], [2407, 2409], [2374, 2408, 2410], [2409, 2411], [2410, 2412, 2488], [2411, 2413], [2375, 2412, 2414], [2413, 2415], [2414, 2416, 2489], [2415, 2417], [2376, 2416, 2418], [2417, 2419], [2418, 2420, 2490], [2419, 2421], [2377, 2420, 2422], [2421, 2423], [2422, 2424, 2491], [2423, 2425], [2378, 2424, 2426], [2425, 2427], [2426, 2428, 2492], [2427, 2429], [2379, 2428, 2430], [2429, 2431], [2430, 2432, 2493], [2431, 2433], [2380, 2432, 2434], [2433, 2435], [2434, 2436, 2494], [2435, 2437], [2381, 2436, 2438], [2437, 2439], [2438, 2440, 2495], [2439, 2441], [2382, 2440, 2442], [2441, 2443], [2442, 2444, 2496], [2443, 2445], [2383, 2444, 2446], [2445, 2447], [2446, 2448, 2497], [2447, 2449], [2384, 2448, 2450], [2449, 2451], [2450, 2452, 2498], [2451, 2453], [2385, 2452, 2454], [2453, 2455], [2454, 2456, 2499], [2455, 2457], [2386, 2456, 2458], [2457, 2459], [2458, 2460, 2500], [2459, 2461], [2387, 2460, 2462], [2461, 2463], [2462, 2464, 2501], [2463, 2465], [2388, 2464, 2466], [2465, 2467], [2466, 2468, 2502], [2467, 2469], [2389, 2468, 2470], [2469, 2471], [2470, 2472, 2503], [2471, 2473], [2390, 2472, 2474], [2473, 2475], [2474, 2476, 2504], [2475, 2477], [2391, 2476, 2478], [2477, 2479], [2478, 2480, 2505], [2479, 2481], [2392, 2480, 2482], [2481, 2483], [2482, 2506], [2395, 2509], [2399, 2513], [2403, 2517], [2407, 2521], [2411, 2525], [2415, 2529], [2419, 2533], [2423, 2537], [2427, 2541], [2431, 2545], [2435, 2549], [2439, 2553], [2443, 2557], [2447, 2561], [2451, 2565], [2455, 2569], [2459, 2573], [2463, 2577], [2467, 2581], [2471, 2585], [2475, 2589], [2479, 2593], [2483, 2597], [2508, 2598], [2507, 2509], [2484, 2508, 2510], [2509, 2511], [2510, 2512, 2599], [2511, 2513], [2485, 2512, 2514], [2513, 2515], [2514, 2516, 2600], [2515, 2517], [2486, 2516, 2518], [2517, 2519], [2518, 2520, 2601], [2519, 2521], [2487, 2520, 2522], [2521, 2523], [2522, 2524, 2602], [2523, 2525], [2488, 2524, 2526], [2525, 2527], [2526, 2528, 2603], [2527, 2529], [2489, 2528, 2530], [2529, 2531], [2530, 2532, 2604], [2531, 2533], [2490, 2532, 2534], [2533, 2535], [2534, 2536, 2605], [2535, 2537], [2491, 2536, 2538], [2537, 2539], [2538, 2540, 2606], [2539, 2541], [2492, 2540, 2542], [2541, 2543], [2542, 2544, 2607], [2543, 2545], [2493, 2544, 2546], [2545, 2547], [2546, 2548, 2608], [2547, 2549], [2494, 2548, 2550], [2549, 2551], [2550, 2552, 2609], [2551, 2553], [2495, 2552, 2554], [2553, 2555], [2554, 2556, 2610], [2555, 2557], [2496, 2556, 2558], [2557, 2559], [2558, 2560, 2611], [2559, 2561], [2497, 2560, 2562], [2561, 2563], [2562, 2564, 2612], [2563, 2565], [2498, 2564, 2566], [2565, 2567], [2566, 2568, 2613], [2567, 2569], [2499, 2568, 2570], [2569, 2571], [2570, 2572, 2614], [2571, 2573], [2500, 2572, 2574], [2573, 2575], [2574, 2576, 2615], [2575, 2577], [2501, 2576, 2578], [2577, 2579], [2578, 2580, 2616], [2579, 2581], [2502, 2580, 2582], [2581, 2583], [2582, 2584, 2617], [2583, 2585], [2503, 2584, 2586], [2585, 2587], [2586, 2588, 2618], [2587, 2589], [2504, 2588, 2590], [2589, 2591], [2590, 2592, 2619], [2591, 2593], [2505, 2592, 2594], [2593, 2595], [2594, 2596, 2620], [2595, 2597], [2506, 2596], [2507, 2621], [2511, 2625], [2515, 2629], [2519, 2633], [2523, 2637], [2527, 2641], [2531, 2645], [2535, 2649], [2539, 2653], [2543, 2657], [2547, 2661], [2551, 2665], [2555, 2669], [2559, 2673], [2563, 2677], [2567, 2681], [2571, 2685], [2575, 2689], [2579, 2693], [2583, 2697], [2587, 2701], [2591, 2705], [2595, 2709], [2598, 2622], [2621, 2623], [2622, 2624, 2712], [2623, 2625], [2599, 2624, 2626], [2625, 2627], [2626, 2628, 2713], [2627, 2629], [2600, 2628, 2630], [2629, 2631], [2630, 2632, 2714], [2631, 2633], [2601, 2632, 2634], [2633, 2635], [2634, 2636, 2715], [2635, 2637], [2602, 2636, 2638], [2637, 2639], [2638, 2640, 2716], [2639, 2641], [2603, 2640, 2642], [2641, 2643], [2642, 2644, 2717], [2643, 2645], [2604, 2644, 2646], [2645, 2647], [2646, 2648, 2718], [2647, 2649], [2605, 2648, 2650], [2649, 2651], [2650, 2652, 2719], [2651, 2653], [2606, 2652, 2654], [2653, 2655], [2654, 2656, 2720], [2655, 2657], [2607, 2656, 2658], [2657, 2659], [2658, 2660, 2721], [2659, 2661], [2608, 2660, 2662], [2661, 2663], [2662, 2664, 2722], [2663, 2665], [2609, 2664, 2666], [2665, 2667], [2666, 2668, 2723], [2667, 2669], [2610, 2668, 2670], [2669, 2671], [2670, 2672, 2724], [2671, 2673], [2611, 2672, 2674], [2673, 2675], [2674, 2676, 2725], [2675, 2677], [2612, 2676, 2678], [2677, 2679], [2678, 2680, 2726], [2679, 2681], [2613, 2680, 2682], [2681, 2683], [2682, 2684, 2727], [2683, 2685], [2614, 2684, 2686], [2685, 2687], [2686, 2688, 2728], [2687, 2689], [2615, 2688, 2690], [2689, 2691], [2690, 2692, 2729], [2691, 2693], [2616, 2692, 2694], [2693, 2695], [2694, 2696, 2730], [2695, 2697], [2617, 2696, 2698], [2697, 2699], [2698, 2700, 2731], [2699, 2701], [2618, 2700, 2702], [2701, 2703], [2702, 2704, 2732], [2703, 2705], [2619, 2704, 2706], [2705, 2707], [2706, 2708, 2733], [2707, 2709], [2620, 2708, 2710], [2709, 2711], [2710, 2734], [2623, 2737], [2627, 2741], [2631, 2745], [2635, 2749], [2639, 2753], [2643, 2757], [2647, 2761], [2651, 2765], [2655, 2769], [2659, 2773], [2663, 2777], [2667, 2781], [2671, 2785], [2675, 2789], [2679, 2793], [2683, 2797], [2687, 2801], [2691, 2805], [2695, 2809], [2699, 2813], [2703, 2817], [2707, 2821], [2711, 2825], [2736, 2826], [2735, 2737], [2712, 2736, 2738], [2737, 2739], [2738, 2740, 2827], [2739, 2741], [2713, 2740, 2742], [2741, 2743], [2742, 2744, 2828], [2743, 2745], [2714, 2744, 2746], [2745, 2747], [2746, 2748, 2829], [2747, 2749], [2715, 2748, 2750], [2749, 2751], [2750, 2752, 2830], [2751, 2753], [2716, 2752, 2754], [2753, 2755], [2754, 2756, 2831], [2755, 2757], [2717, 2756, 2758], [2757, 2759], [2758, 2760, 2832], [2759, 2761], [2718, 2760, 2762], [2761, 2763], [2762, 2764, 2833], [2763, 2765], [2719, 2764, 2766], [2765, 2767], [2766, 2768, 2834], [2767, 2769], [2720, 2768, 2770], [2769, 2771], [2770, 2772, 2835], [2771, 2773], [2721, 2772, 2774], [2773, 2775], [2774, 2776, 2836], [2775, 2777], [2722, 2776, 2778], [2777, 2779], [2778, 2780, 2837], [2779, 2781], [2723, 2780, 2782], [2781, 2783], [2782, 2784, 2838], [2783, 2785], [2724, 2784, 2786], [2785, 2787], [2786, 2788, 2839], [2787, 2789], [2725, 2788, 2790], [2789, 2791], [2790, 2792, 2840], [2791, 2793], [2726, 2792, 2794], [2793, 2795], [2794, 2796, 2841], [2795, 2797], [2727, 2796, 2798], [2797, 2799], [2798, 2800, 2842], [2799, 2801], [2728, 2800, 2802], [2801, 2803], [2802, 2804, 2843], [2803, 2805], [2729, 2804, 2806], [2805, 2807], [2806, 2808, 2844], [2807, 2809], [2730, 2808, 2810], [2809, 2811], [2810, 2812, 2845], [2811, 2813], [2731, 2812, 2814], [2813, 2815], [2814, 2816, 2846], [2815, 2817], [2732, 2816, 2818], [2817, 2819], [2818, 2820, 2847], [2819, 2821], [2733, 2820, 2822], [2821, 2823], [2822, 2824, 2848], [2823, 2825], [2734, 2824], [2735, 2849], [2739, 2853], [2743, 2857], [2747, 2861], [2751, 2865], [2755, 2869], [2759, 2873], [2763, 2877], [2767, 2881], [2771, 2885], [2775, 2889], [2779, 2893], [2783, 2897], [2787, 2901], [2791, 2905], [2795, 2909], [2799, 2913], [2803, 2917], [2807, 2921], [2811, 2925], [2815, 2929], [2819, 2933], [2823, 2937], [2826, 2850], [2849, 2851], [2850, 2852, 2940], [2851, 2853], [2827, 2852, 2854], [2853, 2855], [2854, 2856, 2941], [2855, 2857], [2828, 2856, 2858], [2857, 2859], [2858, 2860, 2942], [2859, 2861], [2829, 2860, 2862], [2861, 2863], [2862, 2864, 2943], [2863, 2865], [2830, 2864, 2866], [2865, 2867], [2866, 2868, 2944], [2867, 2869], [2831, 2868, 2870], [2869, 2871], [2870, 2872, 2945], [2871, 2873], [2832, 2872, 2874], [2873, 2875], [2874, 2876, 2946], [2875, 2877], [2833, 2876, 2878], [2877, 2879], [2878, 2880, 2947], [2879, 2881], [2834, 2880, 2882], [2881, 2883], [2882, 2884, 2948], [2883, 2885], [2835, 2884, 2886], [2885, 2887], [2886, 2888, 2949], [2887, 2889], [2836, 2888, 2890], [2889, 2891], [2890, 2892, 2950], [2891, 2893], [2837, 2892, 2894], [2893, 2895], [2894, 2896, 2951], [2895, 2897], [2838, 2896, 2898], [2897, 2899], [2898, 2900, 2952], [2899, 2901], [2839, 2900, 2902], [2901, 2903], [2902, 2904, 2953], [2903, 2905], [2840, 2904, 2906], [2905, 2907], [2906, 2908, 2954], [2907, 2909], [2841, 2908, 2910], [2909, 2911], [2910, 2912, 2955], [2911, 2913], [2842, 2912, 2914], [2913, 2915], [2914, 2916, 2956], [2915, 2917], [2843, 2916, 2918], [2917, 2919], [2918, 2920, 2957], [2919, 2921], [2844, 2920, 2922], [2921, 2923], [2922, 2924, 2958], [2923, 2925], [2845, 2924, 2926], [2925, 2927], [2926, 2928, 2959], [2927, 2929], [2846, 2928, 2930], [2929, 2931], [2930, 2932, 2960], [2931, 2933], [2847, 2932, 2934], [2933, 2935], [2934, 2936, 2961], [2935, 2937], [2848, 2936, 2938], [2937, 2939], [2938, 2962], [2851, 2965], [2855, 2969], [2859, 2973], [2863, 2977], [2867, 2981], [2871, 2985], [2875, 2989], [2879, 2993], [2883, 2997], [2887, 3001], [2891, 3005], [2895, 3009], [2899, 3013], [2903, 3017], [2907, 3021], [2911, 3025], [2915, 3029], [2919, 3033], [2923, 3037], [2927, 3041], [2931, 3045], [2935, 3049], [2939, 3053], [2964, 3054], [2963, 2965], [2940, 2964, 2966], [2965, 2967], [2966, 2968, 3055], [2967, 2969], [2941, 2968, 2970], [2969, 2971], [2970, 2972, 3056], [2971, 2973], [2942, 2972, 2974], [2973, 2975], [2974, 2976, 3057], [2975, 2977], [2943, 2976, 2978], [2977, 2979], [2978, 2980, 3058], [2979, 2981], [2944, 2980, 2982], [2981, 2983], [2982, 2984, 3059], [2983, 2985], [2945, 2984, 2986], [2985, 2987], [2986, 2988, 3060], [2987, 2989], [2946, 2988, 2990], [2989, 2991], [2990, 2992, 3061], [2991, 2993], [2947, 2992, 2994], [2993, 2995], [2994, 2996, 3062], [2995, 2997], [2948, 2996, 2998], [2997, 2999], [2998, 3000, 3063], [2999, 3001], [2949, 3000, 3002], [3001, 3003], [3002, 3004, 3064], [3003, 3005], [2950, 3004, 3006], [3005, 3007], [3006, 3008, 3065], [3007, 3009], [2951, 3008, 3010], [3009, 3011], [3010, 3012, 3066], [3011, 3013], [2952, 3012, 3014], [3013, 3015], [3014, 3016, 3067], [3015, 3017], [2953, 3016, 3018], [3017, 3019], [3018, 3020, 3068], [3019, 3021], [2954, 3020, 3022], [3021, 3023], [3022, 3024, 3069], [3023, 3025], [2955, 3024, 3026], [3025, 3027], [3026, 3028, 3070], [3027, 3029], [2956, 3028, 3030], [3029, 3031], [3030, 3032, 3071], [3031, 3033], [2957, 3032, 3034], [3033, 3035], [3034, 3036, 3072], [3035, 3037], [2958, 3036, 3038], [3037, 3039], [3038, 3040, 3073], [3039, 3041], [2959, 3040, 3042], [3041, 3043], [3042, 3044, 3074], [3043, 3045], [2960, 3044, 3046], [3045, 3047], [3046, 3048, 3075], [3047, 3049], [2961, 3048, 3050], [3049, 3051], [3050, 3052, 3076], [3051, 3053], [2962, 3052], [2963, 3077], [2967, 3081], [2971, 3085], [2975, 3089], [2979, 3093], [2983, 3097], [2987, 3101], [2991, 3105], [2995, 3109], [2999, 3113], [3003, 3117], [3007, 3121], [3011, 3125], [3015, 3129], [3019, 3133], [3023, 3137], [3027, 3141], [3031, 3145], [3035, 3149], [3039, 3153], [3043, 3157], [3047, 3161], [3051, 3165], [3054, 3078], [3077, 3079], [3078, 3080, 3168], [3079, 3081], [3055, 3080, 3082], [3081, 3083], [3082, 3084, 3169], [3083, 3085], [3056, 3084, 3086], [3085, 3087], [3086, 3088, 3170], [3087, 3089], [3057, 3088, 3090], [3089, 3091], [3090, 3092, 3171], [3091, 3093], [3058, 3092, 3094], [3093, 3095], [3094, 3096, 3172], [3095, 3097], [3059, 3096, 3098], [3097, 3099], [3098, 3100, 3173], [3099, 3101], [3060, 3100, 3102], [3101, 3103], [3102, 3104, 3174], [3103, 3105], [3061, 3104, 3106], [3105, 3107], [3106, 3108, 3175], [3107, 3109], [3062, 3108, 3110], [3109, 3111], [3110, 3112, 3176], [3111, 3113], [3063, 3112, 3114], [3113, 3115], [3114, 3116, 3177], [3115, 3117], [3064, 3116, 3118], [3117, 3119], [3118, 3120, 3178], [3119, 3121], [3065, 3120, 3122], [3121, 3123], [3122, 3124, 3179], [3123, 3125], [3066, 3124, 3126], [3125, 3127], [3126, 3128, 3180], [3127, 3129], [3067, 3128, 3130], [3129, 3131], [3130, 3132, 3181], [3131, 3133], [3068, 3132, 3134], [3133, 3135], [3134, 3136, 3182], [3135, 3137], [3069, 3136, 3138], [3137, 3139], [3138, 3140, 3183], [3139, 3141], [3070, 3140, 3142], [3141, 3143], [3142, 3144, 3184], [3143, 3145], [3071, 3144, 3146], [3145, 3147], [3146, 3148, 3185], [3147, 3149], [3072, 3148, 3150], [3149, 3151], [3150, 3152, 3186], [3151, 3153], [3073, 3152, 3154], [3153, 3155], [3154, 3156, 3187], [3155, 3157], [3074, 3156, 3158], [3157, 3159], [3158, 3160, 3188], [3159, 3161], [3075, 3160, 3162], [3161, 3163], [3162, 3164, 3189], [3163, 3165], [3076, 3164, 3166], [3165, 3167], [3166, 3190], [3079, 3193], [3083, 3197], [3087, 3201], [3091, 3205], [3095, 3209], [3099, 3213], [3103, 3217], [3107, 3221], [3111, 3225], [3115, 3229], [3119, 3233], [3123, 3237], [3127, 3241], [3131, 3245], [3135, 3249], [3139, 3253], [3143, 3257], [3147, 3261], [3151, 3265], [3155, 3269], [3159, 3273], [3163, 3277], [3167, 3281], [3192, 3282], [3191, 3193], [3168, 3192, 3194], [3193, 3195], [3194, 3196, 3283], [3195, 3197], [3169, 3196, 3198], [3197, 3199], [3198, 3200, 3284], [3199, 3201], [3170, 3200, 3202], [3201, 3203], [3202, 3204, 3285], [3203, 3205], [3171, 3204, 3206], [3205, 3207], [3206, 3208, 3286], [3207, 3209], [3172, 3208, 3210], [3209, 3211], [3210, 3212, 3287], [3211, 3213], [3173, 3212, 3214], [3213, 3215], [3214, 3216, 3288], [3215, 3217], [3174, 3216, 3218], [3217, 3219], [3218, 3220, 3289], [3219, 3221], [3175, 3220, 3222], [3221, 3223], [3222, 3224, 3290], [3223, 3225], [3176, 3224, 3226], [3225, 3227], [3226, 3228, 3291], [3227, 3229], [3177, 3228, 3230], [3229, 3231], [3230, 3232, 3292], [3231, 3233], [3178, 3232, 3234], [3233, 3235], [3234, 3236, 3293], [3235, 3237], [3179, 3236, 3238], [3237, 3239], [3238, 3240, 3294], [3239, 3241], [3180, 3240, 3242], [3241, 3243], [3242, 3244, 3295], [3243, 3245], [3181, 3244, 3246], [3245, 3247], [3246, 3248, 3296], [3247, 3249], [3182, 3248, 3250], [3249, 3251], [3250, 3252, 3297], [3251, 3253], [3183, 3252, 3254], [3253, 3255], [3254, 3256, 3298], [3255, 3257], [3184, 3256, 3258], [3257, 3259], [3258, 3260, 3299], [3259, 3261], [3185, 3260, 3262], [3261, 3263], [3262, 3264, 3300], [3263, 3265], [3186, 3264, 3266], [3265, 3267], [3266, 3268, 3301], [3267, 3269], [3187, 3268, 3270], [3269, 3271], [3270, 3272, 3302], [3271, 3273], [3188, 3272, 3274], [3273, 3275], [3274, 3276, 3303], [3275, 3277], [3189, 3276, 3278], [3277, 3279], [3278, 3280, 3304], [3279, 3281], [3190, 3280], [3191, 3305], [3195, 3309], [3199, 3313], [3203, 3317], [3207, 3321], [3211, 3325], [3215, 3329], [3219, 3333], [3223, 3337], [3227, 3341], [3231, 3345], [3235, 3349], [3239, 3353], [3243, 3357], [3247, 3361], [3251, 3365], [3255, 3369], [3259, 3373], [3263, 3377], [3267, 3381], [3271, 3385], [3275, 3389], [3279, 3393], [3282, 3306], [3305, 3307], [3306, 3308, 3396], [3307, 3309], [3283, 3308, 3310], [3309, 3311], [3310, 3312, 3397], [3311, 3313], [3284, 3312, 3314], [3313, 3315], [3314, 3316, 3398], [3315, 3317], [3285, 3316, 3318], [3317, 3319], [3318, 3320, 3399], [3319, 3321], [3286, 3320, 3322], [3321, 3323], [3322, 3324, 3400], [3323, 3325], [3287, 3324, 3326], [3325, 3327], [3326, 3328, 3401], [3327, 3329], [3288, 3328, 3330], [3329, 3331], [3330, 3332, 3402], [3331, 3333], [3289, 3332, 3334], [3333, 3335], [3334, 3336, 3403], [3335, 3337], [3290, 3336, 3338], [3337, 3339], [3338, 3340, 3404], [3339, 3341], [3291, 3340, 3342], [3341, 3343], [3342, 3344, 3405], [3343, 3345], [3292, 3344, 3346], [3345, 3347], [3346, 3348, 3406], [3347, 3349], [3293, 3348, 3350], [3349, 3351], [3350, 3352, 3407], [3351, 3353], [3294, 3352, 3354], [3353, 3355], [3354, 3356, 3408], [3355, 3357], [3295, 3356, 3358], [3357, 3359], [3358, 3360, 3409], [3359, 3361], [3296, 3360, 3362], [3361, 3363], [3362, 3364, 3410], [3363, 3365], [3297, 3364, 3366], [3365, 3367], [3366, 3368, 3411], [3367, 3369], [3298, 3368, 3370], [3369, 3371], [3370, 3372, 3412], [3371, 3373], [3299, 3372, 3374], [3373, 3375], [3374, 3376, 3413], [3375, 3377], [3300, 3376, 3378], [3377, 3379], [3378, 3380, 3414], [3379, 3381], [3301, 3380, 3382], [3381, 3383], [3382, 3384, 3415], [3383, 3385], [3302, 3384, 3386], [3385, 3387], [3386, 3388, 3416], [3387, 3389], [3303, 3388, 3390], [3389, 3391], [3390, 3392, 3417], [3391, 3393], [3304, 3392, 3394], [3393, 3395], [3394, 3418], [3307, 3421], [3311, 3425], [3315, 3429], [3319, 3433], [3323, 3437], [3327, 3441], [3331, 3445], [3335, 3449], [3339, 3453], [3343, 3457], [3347, 3461], [3351, 3465], [3355, 3469], [3359, 3473], [3363, 3477], [3367, 3481], [3371, 3485], [3375, 3489], [3379, 3493], [3383, 3497], [3387, 3501], [3391, 3505], [3395, 3509], [3420, 3510], [3419, 3421], [3396, 3420, 3422], [3421, 3423], [3422, 3424, 3511], [3423, 3425], [3397, 3424, 3426], [3425, 3427], [3426, 3428, 3512], [3427, 3429], [3398, 3428, 3430], [3429, 3431], [3430, 3432, 3513], [3431, 3433], [3399, 3432, 3434], [3433, 3435], [3434, 3436, 3514], [3435, 3437], [3400, 3436, 3438], [3437, 3439], [3438, 3440, 3515], [3439, 3441], [3401, 3440, 3442], [3441, 3443], [3442, 3444, 3516], [3443, 3445], [3402, 3444, 3446], [3445, 3447], [3446, 3448, 3517], [3447, 3449], [3403, 3448, 3450], [3449, 3451], [3450, 3452, 3518], [3451, 3453], [3404, 3452, 3454], [3453, 3455], [3454, 3456, 3519], [3455, 3457], [3405, 3456, 3458], [3457, 3459], [3458, 3460, 3520], [3459, 3461], [3406, 3460, 3462], [3461, 3463], [3462, 3464, 3521], [3463, 3465], [3407, 3464, 3466], [3465, 3467], [3466, 3468, 3522], [3467, 3469], [3408, 3468, 3470], [3469, 3471], [3470, 3472, 3523], [3471, 3473], [3409, 3472, 3474], [3473, 3475], [3474, 3476, 3524], [3475, 3477], [3410, 3476, 3478], [3477, 3479], [3478, 3480, 3525], [3479, 3481], [3411, 3480, 3482], [3481, 3483], [3482, 3484, 3526], [3483, 3485], [3412, 3484, 3486], [3485, 3487], [3486, 3488, 3527], [3487, 3489], [3413, 3488, 3490], [3489, 3491], [3490, 3492, 3528], [3491, 3493], [3414, 3492, 3494], [3493, 3495], [3494, 3496, 3529], [3495, 3497], [3415, 3496, 3498], [3497, 3499], [3498, 3500, 3530], [3499, 3501], [3416, 3500, 3502], [3501, 3503], [3502, 3504, 3531], [3503, 3505], [3417, 3504, 3506], [3505, 3507], [3506, 3508, 3532], [3507, 3509], [3418, 3508], [3419, 3533], [3423, 3537], [3427, 3541], [3431, 3545], [3435, 3549], [3439, 3553], [3443, 3557], [3447, 3561], [3451, 3565], [3455, 3569], [3459, 3573], [3463, 3577], [3467, 3581], [3471, 3585], [3475, 3589], [3479, 3593], [3483, 3597], [3487, 3601], [3491, 3605], [3495, 3609], [3499, 3613], [3503, 3617], [3507, 3621], [3510, 3534], [3533, 3535], [3534, 3536, 3624], [3535, 3537], [3511, 3536, 3538], [3537, 3539], [3538, 3540, 3625], [3539, 3541], [3512, 3540, 3542], [3541, 3543], [3542, 3544, 3626], [3543, 3545], [3513, 3544, 3546], [3545, 3547], [3546, 3548, 3627], [3547, 3549], [3514, 3548, 3550], [3549, 3551], [3550, 3552, 3628], [3551, 3553], [3515, 3552, 3554], [3553, 3555], [3554, 3556, 3629], [3555, 3557], [3516, 3556, 3558], [3557, 3559], [3558, 3560, 3630], [3559, 3561], [3517, 3560, 3562], [3561, 3563], [3562, 3564, 3631], [3563, 3565], [3518, 3564, 3566], [3565, 3567], [3566, 3568, 3632], [3567, 3569], [3519, 3568, 3570], [3569, 3571], [3570, 3572, 3633], [3571, 3573], [3520, 3572, 3574], [3573, 3575], [3574, 3576, 3634], [3575, 3577], [3521, 3576, 3578], [3577, 3579], [3578, 3580, 3635], [3579, 3581], [3522, 3580, 3582], [3581, 3583], [3582, 3584, 3636], [3583, 3585], [3523, 3584, 3586], [3585, 3587], [3586, 3588, 3637], [3587, 3589], [3524, 3588, 3590], [3589, 3591], [3590, 3592, 3638], [3591, 3593], [3525, 3592, 3594], [3593, 3595], [3594, 3596, 3639], [3595, 3597], [3526, 3596, 3598], [3597, 3599], [3598, 3600, 3640], [3599, 3601], [3527, 3600, 3602], [3601, 3603], [3602, 3604, 3641], [3603, 3605], [3528, 3604, 3606], [3605, 3607], [3606, 3608, 3642], [3607, 3609], [3529, 3608, 3610], [3609, 3611], [3610, 3612, 3643], [3611, 3613], [3530, 3612, 3614], [3613, 3615], [3614, 3616, 3644], [3615, 3617], [3531, 3616, 3618], [3617, 3619], [3618, 3620, 3645], [3619, 3621], [3532, 3620, 3622], [3621, 3623], [3622, 3646], [3535, 3649], [3539, 3653], [3543, 3657], [3547, 3661], [3551, 3665], [3555, 3669], [3559, 3673], [3563, 3677], [3567, 3681], [3571, 3685], [3575, 3689], [3579, 3693], [3583, 3697], [3587, 3701], [3591, 3705], [3595, 3709], [3599, 3713], [3603, 3717], [3607, 3721], [3611, 3725], [3615, 3729], [3619, 3733], [3623, 3737], [3648, 3738], [3647, 3649], [3624, 3648, 3650], [3649, 3651], [3650, 3652, 3739], [3651, 3653], [3625, 3652, 3654], [3653, 3655], [3654, 3656, 3740], [3655, 3657], [3626, 3656, 3658], [3657, 3659], [3658, 3660, 3741], [3659, 3661], [3627, 3660, 3662], [3661, 3663], [3662, 3664, 3742], [3663, 3665], [3628, 3664, 3666], [3665, 3667], [3666, 3668, 3743], [3667, 3669], [3629, 3668, 3670], [3669, 3671], [3670, 3672, 3744], [3671, 3673], [3630, 3672, 3674], [3673, 3675], [3674, 3676, 3745], [3675, 3677], [3631, 3676, 3678], [3677, 3679], [3678, 3680, 3746], [3679, 3681], [3632, 3680, 3682], [3681, 3683], [3682, 3684, 3747], [3683, 3685], [3633, 3684, 3686], [3685, 3687], [3686, 3688, 3748], [3687, 3689], [3634, 3688, 3690], [3689, 3691], [3690, 3692, 3749], [3691, 3693], [3635, 3692, 3694], [3693, 3695], [3694, 3696, 3750], [3695, 3697], [3636, 3696, 3698], [3697, 3699], [3698, 3700, 3751], [3699, 3701], [3637, 3700, 3702], [3701, 3703], [3702, 3704, 3752], [3703, 3705], [3638, 3704, 3706], [3705, 3707], [3706, 3708, 3753], [3707, 3709], [3639, 3708, 3710], [3709, 3711], [3710, 3712, 3754], [3711, 3713], [3640, 3712, 3714], [3713, 3715], [3714, 3716, 3755], [3715, 3717], [3641, 3716, 3718], [3717, 3719], [3718, 3720, 3756], [3719, 3721], [3642, 3720, 3722], [3721, 3723], [3722, 3724, 3757], [3723, 3725], [3643, 3724, 3726], [3725, 3727], [3726, 3728, 3758], [3727, 3729], [3644, 3728, 3730], [3729, 3731], [3730, 3732, 3759], [3731, 3733], [3645, 3732, 3734], [3733, 3735], [3734, 3736, 3760], [3735, 3737], [3646, 3736], [3647, 3761], [3651, 3765], [3655, 3769], [3659, 3773], [3663, 3777], [3667, 3781], [3671, 3785], [3675, 3789], [3679, 3793], [3683, 3797], [3687, 3801], [3691, 3805], [3695, 3809], [3699, 3813], [3703, 3817], [3707, 3821], [3711, 3825], [3715, 3829], [3719, 3833], [3723, 3837], [3727, 3841], [3731, 3845], [3735, 3849], [3738, 3762], [3761, 3763], [3762, 3764, 3852], [3763, 3765], [3739, 3764, 3766], [3765, 3767], [3766, 3768, 3853], [3767, 3769], [3740, 3768, 3770], [3769, 3771], [3770, 3772, 3854], [3771, 3773], [3741, 3772, 3774], [3773, 3775], [3774, 3776, 3855], [3775, 3777], [3742, 3776, 3778], [3777, 3779], [3778, 3780, 3856], [3779, 3781], [3743, 3780, 3782], [3781, 3783], [3782, 3784, 3857], [3783, 3785], [3744, 3784, 3786], [3785, 3787], [3786, 3788, 3858], [3787, 3789], [3745, 3788, 3790], [3789, 3791], [3790, 3792, 3859], [3791, 3793], [3746, 3792, 3794], [3793, 3795], [3794, 3796, 3860], [3795, 3797], [3747, 3796, 3798], [3797, 3799], [3798, 3800, 3861], [3799, 3801], [3748, 3800, 3802], [3801, 3803], [3802, 3804, 3862], [3803, 3805], [3749, 3804, 3806], [3805, 3807], [3806, 3808, 3863], [3807, 3809], [3750, 3808, 3810], [3809, 3811], [3810, 3812, 3864], [3811, 3813], [3751, 3812, 3814], [3813, 3815], [3814, 3816, 3865], [3815, 3817], [3752, 3816, 3818], [3817, 3819], [3818, 3820, 3866], [3819, 3821], [3753, 3820, 3822], [3821, 3823], [3822, 3824, 3867], [3823, 3825], [3754, 3824, 3826], [3825, 3827], [3826, 3828, 3868], [3827, 3829], [3755, 3828, 3830], [3829, 3831], [3830, 3832, 3869], [3831, 3833], [3756, 3832, 3834], [3833, 3835], [3834, 3836, 3870], [3835, 3837], [3757, 3836, 3838], [3837, 3839], [3838, 3840, 3871], [3839, 3841], [3758, 3840, 3842], [3841, 3843], [3842, 3844, 3872], [3843, 3845], [3759, 3844, 3846], [3845, 3847], [3846, 3848, 3873], [3847, 3849], [3760, 3848, 3850], [3849, 3851], [3850, 3874], [3763, 3877], [3767, 3881], [3771, 3885], [3775, 3889], [3779, 3893], [3783, 3897], [3787, 3901], [3791, 3905], [3795, 3909], [3799, 3913], [3803, 3917], [3807, 3921], [3811, 3925], [3815, 3929], [3819, 3933], [3823, 3937], [3827, 3941], [3831, 3945], [3835, 3949], [3839, 3953], [3843, 3957], [3847, 3961], [3851, 3965], [3876, 3966], [3875, 3877], [3852, 3876, 3878], [3877, 3879], [3878, 3880, 3967], [3879, 3881], [3853, 3880, 3882], [3881, 3883], [3882, 3884, 3968], [3883, 3885], [3854, 3884, 3886], [3885, 3887], [3886, 3888, 3969], [3887, 3889], [3855, 3888, 3890], [3889, 3891], [3890, 3892, 3970], [3891, 3893], [3856, 3892, 3894], [3893, 3895], [3894, 3896, 3971], [3895, 3897], [3857, 3896, 3898], [3897, 3899], [3898, 3900, 3972], [3899, 3901], [3858, 3900, 3902], [3901, 3903], [3902, 3904, 3973], [3903, 3905], [3859, 3904, 3906], [3905, 3907], [3906, 3908, 3974], [3907, 3909], [3860, 3908, 3910], [3909, 3911], [3910, 3912, 3975], [3911, 3913], [3861, 3912, 3914], [3913, 3915], [3914, 3916, 3976], [3915, 3917], [3862, 3916, 3918], [3917, 3919], [3918, 3920, 3977], [3919, 3921], [3863, 3920, 3922], [3921, 3923], [3922, 3924, 3978], [3923, 3925], [3864, 3924, 3926], [3925, 3927], [3926, 3928, 3979], [3927, 3929], [3865, 3928, 3930], [3929, 3931], [3930, 3932, 3980], [3931, 3933], [3866, 3932, 3934], [3933, 3935], [3934, 3936, 3981], [3935, 3937], [3867, 3936, 3938], [3937, 3939], [3938, 3940, 3982], [3939, 3941], [3868, 3940, 3942], [3941, 3943], [3942, 3944, 3983], [3943, 3945], [3869, 3944, 3946], [3945, 3947], [3946, 3948, 3984], [3947, 3949], [3870, 3948, 3950], [3949, 3951], [3950, 3952, 3985], [3951, 3953], [3871, 3952, 3954], [3953, 3955], [3954, 3956, 3986], [3955, 3957], [3872, 3956, 3958], [3957, 3959], [3958, 3960, 3987], [3959, 3961], [3873, 3960, 3962], [3961, 3963], [3962, 3964, 3988], [3963, 3965], [3874, 3964], [3875, 3989], [3879, 3993], [3883, 3997], [3887, 4001], [3891, 4005], [3895, 4009], [3899, 4013], [3903, 4017], [3907, 4021], [3911, 4025], [3915, 4029], [3919, 4033], [3923, 4037], [3927, 4041], [3931, 4045], [3935, 4049], [3939, 4053], [3943, 4057], [3947, 4061], [3951, 4065], [3955, 4069], [3959, 4073], [3963, 4077], [3966, 3990], [3989, 3991], [3990, 3992, 4080], [3991, 3993], [3967, 3992, 3994], [3993, 3995], [3994, 3996, 4081], [3995, 3997], [3968, 3996, 3998], [3997, 3999], [3998, 4000, 4082], [3999, 4001], [3969, 4000, 4002], [4001, 4003], [4002, 4004, 4083], [4003, 4005], [3970, 4004, 4006], [4005, 4007], [4006, 4008, 4084], [4007, 4009], [3971, 4008, 4010], [4009, 4011], [4010, 4012, 4085], [4011, 4013], [3972, 4012, 4014], [4013, 4015], [4014, 4016, 4086], [4015, 4017], [3973, 4016, 4018], [4017, 4019], [4018, 4020, 4087], [4019, 4021], [3974, 4020, 4022], [4021, 4023], [4022, 4024, 4088], [4023, 4025], [3975, 4024, 4026], [4025, 4027], [4026, 4028, 4089], [4027, 4029], [3976, 4028, 4030], [4029, 4031], [4030, 4032, 4090], [4031, 4033], [3977, 4032, 4034], [4033, 4035], [4034, 4036, 4091], [4035, 4037], [3978, 4036, 4038], [4037, 4039], [4038, 4040, 4092], [4039, 4041], [3979, 4040, 4042], [4041, 4043], [4042, 4044, 4093], [4043, 4045], [3980, 4044, 4046], [4045, 4047], [4046, 4048, 4094], [4047, 4049], [3981, 4048, 4050], [4049, 4051], [4050, 4052, 4095], [4051, 4053], [3982, 4052, 4054], [4053, 4055], [4054, 4056, 4096], [4055, 4057], [3983, 4056, 4058], [4057, 4059], [4058, 4060, 4097], [4059, 4061], [3984, 4060, 4062], [4061, 4063], [4062, 4064, 4098], [4063, 4065], [3985, 4064, 4066], [4065, 4067], [4066, 4068, 4099], [4067, 4069], [3986, 4068, 4070], [4069, 4071], [4070, 4072, 4100], [4071, 4073], [3987, 4072, 4074], [4073, 4075], [4074, 4076, 4101], [4075, 4077], [3988, 4076, 4078], [4077, 4079], [4078, 4102], [3991, 4105], [3995, 4109], [3999, 4113], [4003, 4117], [4007, 4121], [4011, 4125], [4015, 4129], [4019, 4133], [4023, 4137], [4027, 4141], [4031, 4145], [4035, 4149], [4039, 4153], [4043, 4157], [4047, 4161], [4051, 4165], [4055, 4169], [4059, 4173], [4063, 4177], [4067, 4181], [4071, 4185], [4075, 4189], [4079, 4193], [4104, 4194], [4103, 4105], [4080, 4104, 4106], [4105, 4107], [4106, 4108, 4195], [4107, 4109], [4081, 4108, 4110], [4109, 4111], [4110, 4112, 4196], [4111, 4113], [4082, 4112, 4114], [4113, 4115], [4114, 4116, 4197], [4115, 4117], [4083, 4116, 4118], [4117, 4119], [4118, 4120, 4198], [4119, 4121], [4084, 4120, 4122], [4121, 4123], [4122, 4124, 4199], [4123, 4125], [4085, 4124, 4126], [4125, 4127], [4126, 4128, 4200], [4127, 4129], [4086, 4128, 4130], [4129, 4131], [4130, 4132, 4201], [4131, 4133], [4087, 4132, 4134], [4133, 4135], [4134, 4136, 4202], [4135, 4137], [4088, 4136, 4138], [4137, 4139], [4138, 4140, 4203], [4139, 4141], [4089, 4140, 4142], [4141, 4143], [4142, 4144, 4204], [4143, 4145], [4090, 4144, 4146], [4145, 4147], [4146, 4148, 4205], [4147, 4149], [4091, 4148, 4150], [4149, 4151], [4150, 4152, 4206], [4151, 4153], [4092, 4152, 4154], [4153, 4155], [4154, 4156, 4207], [4155, 4157], [4093, 4156, 4158], [4157, 4159], [4158, 4160, 4208], [4159, 4161], [4094, 4160, 4162], [4161, 4163], [4162, 4164, 4209], [4163, 4165], [4095, 4164, 4166], [4165, 4167], [4166, 4168, 4210], [4167, 4169], [4096, 4168, 4170], [4169, 4171], [4170, 4172, 4211], [4171, 4173], [4097, 4172, 4174], [4173, 4175], [4174, 4176, 4212], [4175, 4177], [4098, 4176, 4178], [4177, 4179], [4178, 4180, 4213], [4179, 4181], [4099, 4180, 4182], [4181, 4183], [4182, 4184, 4214], [4183, 4185], [4100, 4184, 4186], [4185, 4187], [4186, 4188, 4215], [4187, 4189], [4101, 4188, 4190], [4189, 4191], [4190, 4192, 4216], [4191, 4193], [4102, 4192], [4103, 4217], [4107, 4221], [4111, 4225], [4115, 4229], [4119, 4233], [4123, 4237], [4127, 4241], [4131, 4245], [4135, 4249], [4139, 4253], [4143, 4257], [4147, 4261], [4151, 4265], [4155, 4269], [4159, 4273], [4163, 4277], [4167, 4281], [4171, 4285], [4175, 4289], [4179, 4293], [4183, 4297], [4187, 4301], [4191, 4305], [4194, 4218], [4217, 4219], [4218, 4220, 4308], [4219, 4221], [4195, 4220, 4222], [4221, 4223], [4222, 4224, 4309], [4223, 4225], [4196, 4224, 4226], [4225, 4227], [4226, 4228, 4310], [4227, 4229], [4197, 4228, 4230], [4229, 4231], [4230, 4232, 4311], [4231, 4233], [4198, 4232, 4234], [4233, 4235], [4234, 4236, 4312], [4235, 4237], [4199, 4236, 4238], [4237, 4239], [4238, 4240, 4313], [4239, 4241], [4200, 4240, 4242], [4241, 4243], [4242, 4244, 4314], [4243, 4245], [4201, 4244, 4246], [4245, 4247], [4246, 4248, 4315], [4247, 4249], [4202, 4248, 4250], [4249, 4251], [4250, 4252, 4316], [4251, 4253], [4203, 4252, 4254], [4253, 4255], [4254, 4256, 4317], [4255, 4257], [4204, 4256, 4258], [4257, 4259], [4258, 4260, 4318], [4259, 4261], [4205, 4260, 4262], [4261, 4263], [4262, 4264, 4319], [4263, 4265], [4206, 4264, 4266], [4265, 4267], [4266, 4268, 4320], [4267, 4269], [4207, 4268, 4270], [4269, 4271], [4270, 4272, 4321], [4271, 4273], [4208, 4272, 4274], [4273, 4275], [4274, 4276, 4322], [4275, 4277], [4209, 4276, 4278], [4277, 4279], [4278, 4280, 4323], [4279, 4281], [4210, 4280, 4282], [4281, 4283], [4282, 4284, 4324], [4283, 4285], [4211, 4284, 4286], [4285, 4287], [4286, 4288, 4325], [4287, 4289], [4212, 4288, 4290], [4289, 4291], [4290, 4292, 4326], [4291, 4293], [4213, 4292, 4294], [4293, 4295], [4294, 4296, 4327], [4295, 4297], [4214, 4296, 4298], [4297, 4299], [4298, 4300, 4328], [4299, 4301], [4215, 4300, 4302], [4301, 4303], [4302, 4304, 4329], [4303, 4305], [4216, 4304, 4306], [4305, 4307], [4306, 4330], [4219, 4333], [4223, 4337], [4227, 4341], [4231, 4345], [4235, 4349], [4239, 4353], [4243, 4357], [4247, 4361], [4251, 4365], [4255, 4369], [4259, 4373], [4263, 4377], [4267, 4381], [4271, 4385], [4275, 4389], [4279, 4393], [4283, 4397], [4287, 4401], [4291, 4405], [4295, 4409], [4299, 4413], [4303, 4417], [4307, 4421], [4332, 4422], [4331, 4333], [4308, 4332, 4334], [4333, 4335], [4334, 4336, 4423], [4335, 4337], [4309, 4336, 4338], [4337, 4339], [4338, 4340, 4424], [4339, 4341], [4310, 4340, 4342], [4341, 4343], [4342, 4344, 4425], [4343, 4345], [4311, 4344, 4346], [4345, 4347], [4346, 4348, 4426], [4347, 4349], [4312, 4348, 4350], [4349, 4351], [4350, 4352, 4427], [4351, 4353], [4313, 4352, 4354], [4353, 4355], [4354, 4356, 4428], [4355, 4357], [4314, 4356, 4358], [4357, 4359], [4358, 4360, 4429], [4359, 4361], [4315, 4360, 4362], [4361, 4363], [4362, 4364, 4430], [4363, 4365], [4316, 4364, 4366], [4365, 4367], [4366, 4368, 4431], [4367, 4369], [4317, 4368, 4370], [4369, 4371], [4370, 4372, 4432], [4371, 4373], [4318, 4372, 4374], [4373, 4375], [4374, 4376, 4433], [4375, 4377], [4319, 4376, 4378], [4377, 4379], [4378, 4380, 4434], [4379, 4381], [4320, 4380, 4382], [4381, 4383], [4382, 4384, 4435], [4383, 4385], [4321, 4384, 4386], [4385, 4387], [4386, 4388, 4436], [4387, 4389], [4322, 4388, 4390], [4389, 4391], [4390, 4392, 4437], [4391, 4393], [4323, 4392, 4394], [4393, 4395], [4394, 4396, 4438], [4395, 4397], [4324, 4396, 4398], [4397, 4399], [4398, 4400, 4439], [4399, 4401], [4325, 4400, 4402], [4401, 4403], [4402, 4404, 4440], [4403, 4405], [4326, 4404, 4406], [4405, 4407], [4406, 4408, 4441], [4407, 4409], [4327, 4408, 4410], [4409, 4411], [4410, 4412, 4442], [4411, 4413], [4328, 4412, 4414], [4413, 4415], [4414, 4416, 4443], [4415, 4417], [4329, 4416, 4418], [4417, 4419], [4418, 4420, 4444], [4419, 4421], [4330, 4420], [4331, 4445], [4335, 4449], [4339, 4453], [4343, 4457], [4347, 4461], [4351, 4465], [4355, 4469], [4359, 4473], [4363, 4477], [4367, 4481], [4371, 4485], [4375, 4489], [4379, 4493], [4383, 4497], [4387, 4501], [4391, 4505], [4395, 4509], [4399, 4513], [4403, 4517], [4407, 4521], [4411, 4525], [4415, 4529], [4419, 4533], [4422, 4446], [4445, 4447], [4446, 4448, 4536], [4447, 4449], [4423, 4448, 4450], [4449, 4451], [4450, 4452, 4537], [4451, 4453], [4424, 4452, 4454], [4453, 4455], [4454, 4456, 4538], [4455, 4457], [4425, 4456, 4458], [4457, 4459], [4458, 4460, 4539], [4459, 4461], [4426, 4460, 4462], [4461, 4463], [4462, 4464, 4540], [4463, 4465], [4427, 4464, 4466], [4465, 4467], [4466, 4468, 4541], [4467, 4469], [4428, 4468, 4470], [4469, 4471], [4470, 4472, 4542], [4471, 4473], [4429, 4472, 4474], [4473, 4475], [4474, 4476, 4543], [4475, 4477], [4430, 4476, 4478], [4477, 4479], [4478, 4480, 4544], [4479, 4481], [4431, 4480, 4482], [4481, 4483], [4482, 4484, 4545], [4483, 4485], [4432, 4484, 4486], [4485, 4487], [4486, 4488, 4546], [4487, 4489], [4433, 4488, 4490], [4489, 4491], [4490, 4492, 4547], [4491, 4493], [4434, 4492, 4494], [4493, 4495], [4494, 4496, 4548], [4495, 4497], [4435, 4496, 4498], [4497, 4499], [4498, 4500, 4549], [4499, 4501], [4436, 4500, 4502], [4501, 4503], [4502, 4504, 4550], [4503, 4505], [4437, 4504, 4506], [4505, 4507], [4506, 4508, 4551], [4507, 4509], [4438, 4508, 4510], [4509, 4511], [4510, 4512, 4552], [4511, 4513], [4439, 4512, 4514], [4513, 4515], [4514, 4516, 4553], [4515, 4517], [4440, 4516, 4518], [4517, 4519], [4518, 4520, 4554], [4519, 4521], [4441, 4520, 4522], [4521, 4523], [4522, 4524, 4555], [4523, 4525], [4442, 4524, 4526], [4525, 4527], [4526, 4528, 4556], [4527, 4529], [4443, 4528, 4530], [4529, 4531], [4530, 4532, 4557], [4531, 4533], [4444, 4532, 4534], [4533, 4535], [4534, 4558], [4447, 4561], [4451, 4565], [4455, 4569], [4459, 4573], [4463, 4577], [4467, 4581], [4471, 4585], [4475, 4589], [4479, 4593], [4483, 4597], [4487, 4601], [4491, 4605], [4495, 4609], [4499, 4613], [4503, 4617], [4507, 4621], [4511, 4625], [4515, 4629], [4519, 4633], [4523, 4637], [4527, 4641], [4531, 4645], [4535, 4649], [4560, 4650], [4559, 4561], [4536, 4560, 4562], [4561, 4563], [4562, 4564, 4651], [4563, 4565], [4537, 4564, 4566], [4565, 4567], [4566, 4568, 4652], [4567, 4569], [4538, 4568, 4570], [4569, 4571], [4570, 4572, 4653], [4571, 4573], [4539, 4572, 4574], [4573, 4575], [4574, 4576, 4654], [4575, 4577], [4540, 4576, 4578], [4577, 4579], [4578, 4580, 4655], [4579, 4581], [4541, 4580, 4582], [4581, 4583], [4582, 4584, 4656], [4583, 4585], [4542, 4584, 4586], [4585, 4587], [4586, 4588, 4657], [4587, 4589], [4543, 4588, 4590], [4589, 4591], [4590, 4592, 4658], [4591, 4593], [4544, 4592, 4594], [4593, 4595], [4594, 4596, 4659], [4595, 4597], [4545, 4596, 4598], [4597, 4599], [4598, 4600, 4660], [4599, 4601], [4546, 4600, 4602], [4601, 4603], [4602, 4604, 4661], [4603, 4605], [4547, 4604, 4606], [4605, 4607], [4606, 4608, 4662], [4607, 4609], [4548, 4608, 4610], [4609, 4611], [4610, 4612, 4663], [4611, 4613], [4549, 4612, 4614], [4613, 4615], [4614, 4616, 4664], [4615, 4617], [4550, 4616, 4618], [4617, 4619], [4618, 4620, 4665], [4619, 4621], [4551, 4620, 4622], [4621, 4623], [4622, 4624, 4666], [4623, 4625], [4552, 4624, 4626], [4625, 4627], [4626, 4628, 4667], [4627, 4629], [4553, 4628, 4630], [4629, 4631], [4630, 4632, 4668], [4631, 4633], [4554, 4632, 4634], [4633, 4635], [4634, 4636, 4669], [4635, 4637], [4555, 4636, 4638], [4637, 4639], [4638, 4640, 4670], [4639, 4641], [4556, 4640, 4642], [4641, 4643], [4642, 4644, 4671], [4643, 4645], [4557, 4644, 4646], [4645, 4647], [4646, 4648, 4672], [4647, 4649], [4558, 4648], [4559, 4673], [4563, 4677], [4567, 4681], [4571, 4685], [4575, 4689], [4579, 4693], [4583, 4697], [4587, 4701], [4591, 4705], [4595, 4709], [4599, 4713], [4603, 4717], [4607, 4721], [4611, 4725], [4615, 4729], [4619, 4733], [4623, 4737], [4627, 4741], [4631, 4745], [4635, 4749], [4639, 4753], [4643, 4757], [4647, 4761], [4650, 4674], [4673, 4675], [4674, 4676, 4764], [4675, 4677], [4651, 4676, 4678], [4677, 4679], [4678, 4680, 4765], [4679, 4681], [4652, 4680, 4682], [4681, 4683], [4682, 4684, 4766], [4683, 4685], [4653, 4684, 4686], [4685, 4687], [4686, 4688, 4767], [4687, 4689], [4654, 4688, 4690], [4689, 4691], [4690, 4692, 4768], [4691, 4693], [4655, 4692, 4694], [4693, 4695], [4694, 4696, 4769], [4695, 4697], [4656, 4696, 4698], [4697, 4699], [4698, 4700, 4770], [4699, 4701], [4657, 4700, 4702], [4701, 4703], [4702, 4704, 4771], [4703, 4705], [4658, 4704, 4706], [4705, 4707], [4706, 4708, 4772], [4707, 4709], [4659, 4708, 4710], [4709, 4711], [4710, 4712, 4773], [4711, 4713], [4660, 4712, 4714], [4713, 4715], [4714, 4716, 4774], [4715, 4717], [4661, 4716, 4718], [4717, 4719], [4718, 4720, 4775], [4719, 4721], [4662, 4720, 4722], [4721, 4723], [4722, 4724, 4776], [4723, 4725], [4663, 4724, 4726], [4725, 4727], [4726, 4728, 4777], [4727, 4729], [4664, 4728, 4730], [4729, 4731], [4730, 4732, 4778], [4731, 4733], [4665, 4732, 4734], [4733, 4735], [4734, 4736, 4779], [4735, 4737], [4666, 4736, 4738], [4737, 4739], [4738, 4740, 4780], [4739, 4741], [4667, 4740, 4742], [4741, 4743], [4742, 4744, 4781], [4743, 4745], [4668, 4744, 4746], [4745, 4747], [4746, 4748, 4782], [4747, 4749], [4669, 4748, 4750], [4749, 4751], [4750, 4752, 4783], [4751, 4753], [4670, 4752, 4754], [4753, 4755], [4754, 4756, 4784], [4755, 4757], [4671, 4756, 4758], [4757, 4759], [4758, 4760, 4785], [4759, 4761], [4672, 4760, 4762], [4761, 4763], [4762, 4786], [4675, 4789], [4679, 4793], [4683, 4797], [4687, 4801], [4691, 4805], [4695, 4809], [4699, 4813], [4703, 4817], [4707, 4821], [4711, 4825], [4715, 4829], [4719, 4833], [4723, 4837], [4727, 4841], [4731, 4845], [4735, 4849], [4739, 4853], [4743, 4857], [4747, 4861], [4751, 4865], [4755, 4869], [4759, 4873], [4763, 4877], [4788, 4878], [4787, 4789], [4764, 4788, 4790], [4789, 4791], [4790, 4792, 4879], [4791, 4793], [4765, 4792, 4794], [4793, 4795], [4794, 4796, 4880], [4795, 4797], [4766, 4796, 4798], [4797, 4799], [4798, 4800, 4881], [4799, 4801], [4767, 4800, 4802], [4801, 4803], [4802, 4804, 4882], [4803, 4805], [4768, 4804, 4806], [4805, 4807], [4806, 4808, 4883], [4807, 4809], [4769, 4808, 4810], [4809, 4811], [4810, 4812, 4884], [4811, 4813], [4770, 4812, 4814], [4813, 4815], [4814, 4816, 4885], [4815, 4817], [4771, 4816, 4818], [4817, 4819], [4818, 4820, 4886], [4819, 4821], [4772, 4820, 4822], [4821, 4823], [4822, 4824, 4887], [4823, 4825], [4773, 4824, 4826], [4825, 4827], [4826, 4828, 4888], [4827, 4829], [4774, 4828, 4830], [4829, 4831], [4830, 4832, 4889], [4831, 4833], [4775, 4832, 4834], [4833, 4835], [4834, 4836, 4890], [4835, 4837], [4776, 4836, 4838], [4837, 4839], [4838, 4840, 4891], [4839, 4841], [4777, 4840, 4842], [4841, 4843], [4842, 4844, 4892], [4843, 4845], [4778, 4844, 4846], [4845, 4847], [4846, 4848, 4893], [4847, 4849], [4779, 4848, 4850], [4849, 4851], [4850, 4852, 4894], [4851, 4853], [4780, 4852, 4854], [4853, 4855], [4854, 4856, 4895], [4855, 4857], [4781, 4856, 4858], [4857, 4859], [4858, 4860, 4896], [4859, 4861], [4782, 4860, 4862], [4861, 4863], [4862, 4864, 4897], [4863, 4865], [4783, 4864, 4866], [4865, 4867], [4866, 4868, 4898], [4867, 4869], [4784, 4868, 4870], [4869, 4871], [4870, 4872, 4899], [4871, 4873], [4785, 4872, 4874], [4873, 4875], [4874, 4876, 4900], [4875, 4877], [4786, 4876], [4787, 4901], [4791, 4905], [4795, 4909], [4799, 4913], [4803, 4917], [4807, 4921], [4811, 4925], [4815, 4929], [4819, 4933], [4823, 4937], [4827, 4941], [4831, 4945], [4835, 4949], [4839, 4953], [4843, 4957], [4847, 4961], [4851, 4965], [4855, 4969], [4859, 4973], [4863, 4977], [4867, 4981], [4871, 4985], [4875, 4989], [4878, 4902], [4901, 4903], [4902, 4904, 4992], [4903, 4905], [4879, 4904, 4906], [4905, 4907], [4906, 4908, 4993], [4907, 4909], [4880, 4908, 4910], [4909, 4911], [4910, 4912, 4994], [4911, 4913], [4881, 4912, 4914], [4913, 4915], [4914, 4916, 4995], [4915, 4917], [4882, 4916, 4918], [4917, 4919], [4918, 4920, 4996], [4919, 4921], [4883, 4920, 4922], [4921, 4923], [4922, 4924, 4997], [4923, 4925], [4884, 4924, 4926], [4925, 4927], [4926, 4928, 4998], [4927, 4929], [4885, 4928, 4930], [4929, 4931], [4930, 4932, 4999], [4931, 4933], [4886, 4932, 4934], [4933, 4935], [4934, 4936, 5000], [4935, 4937], [4887, 4936, 4938], [4937, 4939], [4938, 4940, 5001], [4939, 4941], [4888, 4940, 4942], [4941, 4943], [4942, 4944, 5002], [4943, 4945], [4889, 4944, 4946], [4945, 4947], [4946, 4948, 5003], [4947, 4949], [4890, 4948, 4950], [4949, 4951], [4950, 4952, 5004], [4951, 4953], [4891, 4952, 4954], [4953, 4955], [4954, 4956, 5005], [4955, 4957], [4892, 4956, 4958], [4957, 4959], [4958, 4960, 5006], [4959, 4961], [4893, 4960, 4962], [4961, 4963], [4962, 4964, 5007], [4963, 4965], [4894, 4964, 4966], [4965, 4967], [4966, 4968, 5008], [4967, 4969], [4895, 4968, 4970], [4969, 4971], [4970, 4972, 5009], [4971, 4973], [4896, 4972, 4974], [4973, 4975], [4974, 4976, 5010], [4975, 4977], [4897, 4976, 4978], [4977, 4979], [4978, 4980, 5011], [4979, 4981], [4898, 4980, 4982], [4981, 4983], [4982, 4984, 5012], [4983, 4985], [4899, 4984, 4986], [4985, 4987], [4986, 4988, 5013], [4987, 4989], [4900, 4988, 4990], [4989, 4991], [4990, 5014], [4903, 5016], [4907, 5020], [4911, 5024], [4915, 5028], [4919, 5032], [4923, 5036], [4927, 5040], [4931, 5044], [4935, 5048], [4939, 5052], [4943, 5056], [4947, 5060], [4951, 5064], [4955, 5068], [4959, 5072], [4963, 5076], [4967, 5080], [4971, 5084], [4975, 5088], [4979, 5092], [4983, 5096], [4987, 5100], [4991, 5104], [5016], [4992, 5015, 5017], [5016, 5018], [5017, 5019], [5018, 5020], [4993, 5019, 5021], [5020, 5022], [5021, 5023], [5022, 5024], [4994, 5023, 5025], [5024, 5026], [5025, 5027], [5026, 5028], [4995, 5027, 5029], [5028, 5030], [5029, 5031], [5030, 5032], [4996, 5031, 5033], [5032, 5034], [5033, 5035], [5034, 5036], [4997, 5035, 5037], [5036, 5038], [5037, 5039], [5038, 5040], [4998, 5039, 5041], [5040, 5042], [5041, 5043], [5042, 5044], [4999, 5043, 5045], [5044, 5046], [5045, 5047], [5046, 5048], [5000, 5047, 5049], [5048, 5050], [5049, 5051], [5050, 5052], [5001, 5051, 5053], [5052, 5054], [5053, 5055], [5054, 5056], [5002, 5055, 5057], [5056, 5058], [5057, 5059], [5058, 5060], [5003, 5059, 5061], [5060, 5062], [5061, 5063], [5062, 5064], [5004, 5063, 5065], [5064, 5066], [5065, 5067], [5066, 5068], [5005, 5067, 5069], [5068, 5070], [5069, 5071], [5070, 5072], [5006, 5071, 5073], [5072, 5074], [5073, 5075], [5074, 5076], [5007, 5075, 5077], [5076, 5078], [5077, 5079], [5078, 5080], [5008, 5079, 5081], [5080, 5082], [5081, 5083], [5082, 5084], [5009, 5083, 5085], [5084, 5086], [5085, 5087], [5086, 5088], [5010, 5087, 5089], [5088, 5090], [5089, 5091], [5090, 5092], [5011, 5091, 5093], [5092, 5094], [5093, 5095], [5094, 5096], [5012, 5095, 5097], [5096, 5098], [5097, 5099], [5098, 5100], [5013, 5099, 5101], [5100, 5102], [5101, 5103], [5102, 5104], [5014, 5103]] -CNOTTIME: [[1, 90], [0, 2], [1, 3], [2, 4], [3, 5, 91], [4, 6], [5, 7], [6, 8], [7, 9, 92], [8, 10], [9, 11], [10, 12], [11, 13, 93], [12, 14], [13, 15], [14, 16], [15, 17, 94], [16, 18], [17, 19], [18, 20], [19, 21, 95], [20, 22], [21, 23], [22, 24], [23, 25, 96], [24, 26], [25, 27], [26, 28], [27, 29, 97], [28, 30], [29, 31], [30, 32], [31, 33, 98], [32, 34], [33, 35], [34, 36], [35, 37, 99], [36, 38], [37, 39], [38, 40], [39, 41, 100], [40, 42], [41, 43], [42, 44], [43, 45, 101], [44, 46], [45, 47], [46, 48], [47, 49, 102], [48, 50], [49, 51], [50, 52], [51, 53, 103], [52, 54], [53, 55], [54, 56], [55, 57, 104], [56, 58], [57, 59], [58, 60], [59, 61, 105], [60, 62], [61, 63], [62, 64], [63, 65, 106], [64, 66], [65, 67], [66, 68], [67, 69, 107], [68, 70], [69, 71], [70, 72], [71, 73, 108], [72, 74], [73, 75], [74, 76], [75, 77, 109], [76, 78], [77, 79], [78, 80], [79, 81, 110], [80, 82], [81, 83], [82, 84], [83, 85, 111], [84, 86], [85, 87], [86, 88], [87, 89, 112], [88], [0, 113], [4, 117], [8, 121], [12, 125], [16, 129], [20, 133], [24, 137], [28, 141], [32, 145], [36, 149], [40, 153], [44, 157], [48, 161], [52, 165], [56, 169], [60, 173], [64, 177], [68, 181], [72, 185], [76, 189], [80, 193], [84, 197], [88, 201], [90, 114], [113, 115], [114, 116, 204], [115, 117], [91, 116, 118], [117, 119], [118, 120, 205], [119, 121], [92, 120, 122], [121, 123], [122, 124, 206], [123, 125], [93, 124, 126], [125, 127], [126, 128, 207], [127, 129], [94, 128, 130], [129, 131], [130, 132, 208], [131, 133], [95, 132, 134], [133, 135], [134, 136, 209], [135, 137], [96, 136, 138], [137, 139], [138, 140, 210], [139, 141], [97, 140, 142], [141, 143], [142, 144, 211], [143, 145], [98, 144, 146], [145, 147], [146, 148, 212], [147, 149], [99, 148, 150], [149, 151], [150, 152, 213], [151, 153], [100, 152, 154], [153, 155], [154, 156, 214], [155, 157], [101, 156, 158], [157, 159], [158, 160, 215], [159, 161], [102, 160, 162], [161, 163], [162, 164, 216], [163, 165], [103, 164, 166], [165, 167], [166, 168, 217], [167, 169], [104, 168, 170], [169, 171], [170, 172, 218], [171, 173], [105, 172, 174], [173, 175], [174, 176, 219], [175, 177], [106, 176, 178], [177, 179], [178, 180, 220], [179, 181], [107, 180, 182], [181, 183], [182, 184, 221], [183, 185], [108, 184, 186], [185, 187], [186, 188, 222], [187, 189], [109, 188, 190], [189, 191], [190, 192, 223], [191, 193], [110, 192, 194], [193, 195], [194, 196, 224], [195, 197], [111, 196, 198], [197, 199], [198, 200, 225], [199, 201], [112, 200, 202], [201, 203], [202, 226], [115, 229], [119, 233], [123, 237], [127, 241], [131, 245], [135, 249], [139, 253], [143, 257], [147, 261], [151, 265], [155, 269], [159, 273], [163, 277], [167, 281], [171, 285], [175, 289], [179, 293], [183, 297], [187, 301], [191, 305], [195, 309], [199, 313], [203, 317], [228, 318], [227, 229], [204, 228, 230], [229, 231], [230, 232, 319], [231, 233], [205, 232, 234], [233, 235], [234, 236, 320], [235, 237], [206, 236, 238], [237, 239], [238, 240, 321], [239, 241], [207, 240, 242], [241, 243], [242, 244, 322], [243, 245], [208, 244, 246], [245, 247], [246, 248, 323], [247, 249], [209, 248, 250], [249, 251], [250, 252, 324], [251, 253], [210, 252, 254], [253, 255], [254, 256, 325], [255, 257], [211, 256, 258], [257, 259], [258, 260, 326], [259, 261], [212, 260, 262], [261, 263], [262, 264, 327], [263, 265], [213, 264, 266], [265, 267], [266, 268, 328], [267, 269], [214, 268, 270], [269, 271], [270, 272, 329], [271, 273], [215, 272, 274], [273, 275], [274, 276, 330], [275, 277], [216, 276, 278], [277, 279], [278, 280, 331], [279, 281], [217, 280, 282], [281, 283], [282, 284, 332], [283, 285], [218, 284, 286], [285, 287], [286, 288, 333], [287, 289], [219, 288, 290], [289, 291], [290, 292, 334], [291, 293], [220, 292, 294], [293, 295], [294, 296, 335], [295, 297], [221, 296, 298], [297, 299], [298, 300, 336], [299, 301], [222, 300, 302], [301, 303], [302, 304, 337], [303, 305], [223, 304, 306], [305, 307], [306, 308, 338], [307, 309], [224, 308, 310], [309, 311], [310, 312, 339], [311, 313], [225, 312, 314], [313, 315], [314, 316, 340], [315, 317], [226, 316], [227, 341], [231, 345], [235, 349], [239, 353], [243, 357], [247, 361], [251, 365], [255, 369], [259, 373], [263, 377], [267, 381], [271, 385], [275, 389], [279, 393], [283, 397], [287, 401], [291, 405], [295, 409], [299, 413], [303, 417], [307, 421], [311, 425], [315, 429], [318, 342], [341, 343], [342, 344, 432], [343, 345], [319, 344, 346], [345, 347], [346, 348, 433], [347, 349], [320, 348, 350], [349, 351], [350, 352, 434], [351, 353], [321, 352, 354], [353, 355], [354, 356, 435], [355, 357], [322, 356, 358], [357, 359], [358, 360, 436], [359, 361], [323, 360, 362], [361, 363], [362, 364, 437], [363, 365], [324, 364, 366], [365, 367], [366, 368, 438], [367, 369], [325, 368, 370], [369, 371], [370, 372, 439], [371, 373], [326, 372, 374], [373, 375], [374, 376, 440], [375, 377], [327, 376, 378], [377, 379], [378, 380, 441], [379, 381], [328, 380, 382], [381, 383], [382, 384, 442], [383, 385], [329, 384, 386], [385, 387], [386, 388, 443], [387, 389], [330, 388, 390], [389, 391], [390, 392, 444], [391, 393], [331, 392, 394], [393, 395], [394, 396, 445], [395, 397], [332, 396, 398], [397, 399], [398, 400, 446], [399, 401], [333, 400, 402], [401, 403], [402, 404, 447], [403, 405], [334, 404, 406], [405, 407], [406, 408, 448], [407, 409], [335, 408, 410], [409, 411], [410, 412, 449], [411, 413], [336, 412, 414], [413, 415], [414, 416, 450], [415, 417], [337, 416, 418], [417, 419], [418, 420, 451], [419, 421], [338, 420, 422], [421, 423], [422, 424, 452], [423, 425], [339, 424, 426], [425, 427], [426, 428, 453], [427, 429], [340, 428, 430], [429, 431], [430, 454], [343, 457], [347, 461], [351, 465], [355, 469], [359, 473], [363, 477], [367, 481], [371, 485], [375, 489], [379, 493], [383, 497], [387, 501], [391, 505], [395, 509], [399, 513], [403, 517], [407, 521], [411, 525], [415, 529], [419, 533], [423, 537], [427, 541], [431, 545], [456, 546], [455, 457], [432, 456, 458], [457, 459], [458, 460, 547], [459, 461], [433, 460, 462], [461, 463], [462, 464, 548], [463, 465], [434, 464, 466], [465, 467], [466, 468, 549], [467, 469], [435, 468, 470], [469, 471], [470, 472, 550], [471, 473], [436, 472, 474], [473, 475], [474, 476, 551], [475, 477], [437, 476, 478], [477, 479], [478, 480, 552], [479, 481], [438, 480, 482], [481, 483], [482, 484, 553], [483, 485], [439, 484, 486], [485, 487], [486, 488, 554], [487, 489], [440, 488, 490], [489, 491], [490, 492, 555], [491, 493], [441, 492, 494], [493, 495], [494, 496, 556], [495, 497], [442, 496, 498], [497, 499], [498, 500, 557], [499, 501], [443, 500, 502], [501, 503], [502, 504, 558], [503, 505], [444, 504, 506], [505, 507], [506, 508, 559], [507, 509], [445, 508, 510], [509, 511], [510, 512, 560], [511, 513], [446, 512, 514], [513, 515], [514, 516, 561], [515, 517], [447, 516, 518], [517, 519], [518, 520, 562], [519, 521], [448, 520, 522], [521, 523], [522, 524, 563], [523, 525], [449, 524, 526], [525, 527], [526, 528, 564], [527, 529], [450, 528, 530], [529, 531], [530, 532, 565], [531, 533], [451, 532, 534], [533, 535], [534, 536, 566], [535, 537], [452, 536, 538], [537, 539], [538, 540, 567], [539, 541], [453, 540, 542], [541, 543], [542, 544, 568], [543, 545], [454, 544], [455, 569], [459, 573], [463, 577], [467, 581], [471, 585], [475, 589], [479, 593], [483, 597], [487, 601], [491, 605], [495, 609], [499, 613], [503, 617], [507, 621], [511, 625], [515, 629], [519, 633], [523, 637], [527, 641], [531, 645], [535, 649], [539, 653], [543, 657], [546, 570], [569, 571], [570, 572, 660], [571, 573], [547, 572, 574], [573, 575], [574, 576, 661], [575, 577], [548, 576, 578], [577, 579], [578, 580, 662], [579, 581], [549, 580, 582], [581, 583], [582, 584, 663], [583, 585], [550, 584, 586], [585, 587], [586, 588, 664], [587, 589], [551, 588, 590], [589, 591], [590, 592, 665], [591, 593], [552, 592, 594], [593, 595], [594, 596, 666], [595, 597], [553, 596, 598], [597, 599], [598, 600, 667], [599, 601], [554, 600, 602], [601, 603], [602, 604, 668], [603, 605], [555, 604, 606], [605, 607], [606, 608, 669], [607, 609], [556, 608, 610], [609, 611], [610, 612, 670], [611, 613], [557, 612, 614], [613, 615], [614, 616, 671], [615, 617], [558, 616, 618], [617, 619], [618, 620, 672], [619, 621], [559, 620, 622], [621, 623], [622, 624, 673], [623, 625], [560, 624, 626], [625, 627], [626, 628, 674], [627, 629], [561, 628, 630], [629, 631], [630, 632, 675], [631, 633], [562, 632, 634], [633, 635], [634, 636, 676], [635, 637], [563, 636, 638], [637, 639], [638, 640, 677], [639, 641], [564, 640, 642], [641, 643], [642, 644, 678], [643, 645], [565, 644, 646], [645, 647], [646, 648, 679], [647, 649], [566, 648, 650], [649, 651], [650, 652, 680], [651, 653], [567, 652, 654], [653, 655], [654, 656, 681], [655, 657], [568, 656, 658], [657, 659], [658, 682], [571, 685], [575, 689], [579, 693], [583, 697], [587, 701], [591, 705], [595, 709], [599, 713], [603, 717], [607, 721], [611, 725], [615, 729], [619, 733], [623, 737], [627, 741], [631, 745], [635, 749], [639, 753], [643, 757], [647, 761], [651, 765], [655, 769], [659, 773], [684, 774], [683, 685], [660, 684, 686], [685, 687], [686, 688, 775], [687, 689], [661, 688, 690], [689, 691], [690, 692, 776], [691, 693], [662, 692, 694], [693, 695], [694, 696, 777], [695, 697], [663, 696, 698], [697, 699], [698, 700, 778], [699, 701], [664, 700, 702], [701, 703], [702, 704, 779], [703, 705], [665, 704, 706], [705, 707], [706, 708, 780], [707, 709], [666, 708, 710], [709, 711], [710, 712, 781], [711, 713], [667, 712, 714], [713, 715], [714, 716, 782], [715, 717], [668, 716, 718], [717, 719], [718, 720, 783], [719, 721], [669, 720, 722], [721, 723], [722, 724, 784], [723, 725], [670, 724, 726], [725, 727], [726, 728, 785], [727, 729], [671, 728, 730], [729, 731], [730, 732, 786], [731, 733], [672, 732, 734], [733, 735], [734, 736, 787], [735, 737], [673, 736, 738], [737, 739], [738, 740, 788], [739, 741], [674, 740, 742], [741, 743], [742, 744, 789], [743, 745], [675, 744, 746], [745, 747], [746, 748, 790], [747, 749], [676, 748, 750], [749, 751], [750, 752, 791], [751, 753], [677, 752, 754], [753, 755], [754, 756, 792], [755, 757], [678, 756, 758], [757, 759], [758, 760, 793], [759, 761], [679, 760, 762], [761, 763], [762, 764, 794], [763, 765], [680, 764, 766], [765, 767], [766, 768, 795], [767, 769], [681, 768, 770], [769, 771], [770, 772, 796], [771, 773], [682, 772], [683, 797], [687, 801], [691, 805], [695, 809], [699, 813], [703, 817], [707, 821], [711, 825], [715, 829], [719, 833], [723, 837], [727, 841], [731, 845], [735, 849], [739, 853], [743, 857], [747, 861], [751, 865], [755, 869], [759, 873], [763, 877], [767, 881], [771, 885], [774, 798], [797, 799], [798, 800, 888], [799, 801], [775, 800, 802], [801, 803], [802, 804, 889], [803, 805], [776, 804, 806], [805, 807], [806, 808, 890], [807, 809], [777, 808, 810], [809, 811], [810, 812, 891], [811, 813], [778, 812, 814], [813, 815], [814, 816, 892], [815, 817], [779, 816, 818], [817, 819], [818, 820, 893], [819, 821], [780, 820, 822], [821, 823], [822, 824, 894], [823, 825], [781, 824, 826], [825, 827], [826, 828, 895], [827, 829], [782, 828, 830], [829, 831], [830, 832, 896], [831, 833], [783, 832, 834], [833, 835], [834, 836, 897], [835, 837], [784, 836, 838], [837, 839], [838, 840, 898], [839, 841], [785, 840, 842], [841, 843], [842, 844, 899], [843, 845], [786, 844, 846], [845, 847], [846, 848, 900], [847, 849], [787, 848, 850], [849, 851], [850, 852, 901], [851, 853], [788, 852, 854], [853, 855], [854, 856, 902], [855, 857], [789, 856, 858], [857, 859], [858, 860, 903], [859, 861], [790, 860, 862], [861, 863], [862, 864, 904], [863, 865], [791, 864, 866], [865, 867], [866, 868, 905], [867, 869], [792, 868, 870], [869, 871], [870, 872, 906], [871, 873], [793, 872, 874], [873, 875], [874, 876, 907], [875, 877], [794, 876, 878], [877, 879], [878, 880, 908], [879, 881], [795, 880, 882], [881, 883], [882, 884, 909], [883, 885], [796, 884, 886], [885, 887], [886, 910], [799, 913], [803, 917], [807, 921], [811, 925], [815, 929], [819, 933], [823, 937], [827, 941], [831, 945], [835, 949], [839, 953], [843, 957], [847, 961], [851, 965], [855, 969], [859, 973], [863, 977], [867, 981], [871, 985], [875, 989], [879, 993], [883, 997], [887, 1001], [912, 1002], [911, 913], [888, 912, 914], [913, 915], [914, 916, 1003], [915, 917], [889, 916, 918], [917, 919], [918, 920, 1004], [919, 921], [890, 920, 922], [921, 923], [922, 924, 1005], [923, 925], [891, 924, 926], [925, 927], [926, 928, 1006], [927, 929], [892, 928, 930], [929, 931], [930, 932, 1007], [931, 933], [893, 932, 934], [933, 935], [934, 936, 1008], [935, 937], [894, 936, 938], [937, 939], [938, 940, 1009], [939, 941], [895, 940, 942], [941, 943], [942, 944, 1010], [943, 945], [896, 944, 946], [945, 947], [946, 948, 1011], [947, 949], [897, 948, 950], [949, 951], [950, 952, 1012], [951, 953], [898, 952, 954], [953, 955], [954, 956, 1013], [955, 957], [899, 956, 958], [957, 959], [958, 960, 1014], [959, 961], [900, 960, 962], [961, 963], [962, 964, 1015], [963, 965], [901, 964, 966], [965, 967], [966, 968, 1016], [967, 969], [902, 968, 970], [969, 971], [970, 972, 1017], [971, 973], [903, 972, 974], [973, 975], [974, 976, 1018], [975, 977], [904, 976, 978], [977, 979], [978, 980, 1019], [979, 981], [905, 980, 982], [981, 983], [982, 984, 1020], [983, 985], [906, 984, 986], [985, 987], [986, 988, 1021], [987, 989], [907, 988, 990], [989, 991], [990, 992, 1022], [991, 993], [908, 992, 994], [993, 995], [994, 996, 1023], [995, 997], [909, 996, 998], [997, 999], [998, 1000, 1024], [999, 1001], [910, 1000], [911, 1025], [915, 1029], [919, 1033], [923, 1037], [927, 1041], [931, 1045], [935, 1049], [939, 1053], [943, 1057], [947, 1061], [951, 1065], [955, 1069], [959, 1073], [963, 1077], [967, 1081], [971, 1085], [975, 1089], [979, 1093], [983, 1097], [987, 1101], [991, 1105], [995, 1109], [999, 1113], [1002, 1026], [1025, 1027], [1026, 1028, 1116], [1027, 1029], [1003, 1028, 1030], [1029, 1031], [1030, 1032, 1117], [1031, 1033], [1004, 1032, 1034], [1033, 1035], [1034, 1036, 1118], [1035, 1037], [1005, 1036, 1038], [1037, 1039], [1038, 1040, 1119], [1039, 1041], [1006, 1040, 1042], [1041, 1043], [1042, 1044, 1120], [1043, 1045], [1007, 1044, 1046], [1045, 1047], [1046, 1048, 1121], [1047, 1049], [1008, 1048, 1050], [1049, 1051], [1050, 1052, 1122], [1051, 1053], [1009, 1052, 1054], [1053, 1055], [1054, 1056, 1123], [1055, 1057], [1010, 1056, 1058], [1057, 1059], [1058, 1060, 1124], [1059, 1061], [1011, 1060, 1062], [1061, 1063], [1062, 1064, 1125], [1063, 1065], [1012, 1064, 1066], [1065, 1067], [1066, 1068, 1126], [1067, 1069], [1013, 1068, 1070], [1069, 1071], [1070, 1072, 1127], [1071, 1073], [1014, 1072, 1074], [1073, 1075], [1074, 1076, 1128], [1075, 1077], [1015, 1076, 1078], [1077, 1079], [1078, 1080, 1129], [1079, 1081], [1016, 1080, 1082], [1081, 1083], [1082, 1084, 1130], [1083, 1085], [1017, 1084, 1086], [1085, 1087], [1086, 1088, 1131], [1087, 1089], [1018, 1088, 1090], [1089, 1091], [1090, 1092, 1132], [1091, 1093], [1019, 1092, 1094], [1093, 1095], [1094, 1096, 1133], [1095, 1097], [1020, 1096, 1098], [1097, 1099], [1098, 1100, 1134], [1099, 1101], [1021, 1100, 1102], [1101, 1103], [1102, 1104, 1135], [1103, 1105], [1022, 1104, 1106], [1105, 1107], [1106, 1108, 1136], [1107, 1109], [1023, 1108, 1110], [1109, 1111], [1110, 1112, 1137], [1111, 1113], [1024, 1112, 1114], [1113, 1115], [1114, 1138], [1027, 1141], [1031, 1145], [1035, 1149], [1039, 1153], [1043, 1157], [1047, 1161], [1051, 1165], [1055, 1169], [1059, 1173], [1063, 1177], [1067, 1181], [1071, 1185], [1075, 1189], [1079, 1193], [1083, 1197], [1087, 1201], [1091, 1205], [1095, 1209], [1099, 1213], [1103, 1217], [1107, 1221], [1111, 1225], [1115, 1229], [1140, 1230], [1139, 1141], [1116, 1140, 1142], [1141, 1143], [1142, 1144, 1231], [1143, 1145], [1117, 1144, 1146], [1145, 1147], [1146, 1148, 1232], [1147, 1149], [1118, 1148, 1150], [1149, 1151], [1150, 1152, 1233], [1151, 1153], [1119, 1152, 1154], [1153, 1155], [1154, 1156, 1234], [1155, 1157], [1120, 1156, 1158], [1157, 1159], [1158, 1160, 1235], [1159, 1161], [1121, 1160, 1162], [1161, 1163], [1162, 1164, 1236], [1163, 1165], [1122, 1164, 1166], [1165, 1167], [1166, 1168, 1237], [1167, 1169], [1123, 1168, 1170], [1169, 1171], [1170, 1172, 1238], [1171, 1173], [1124, 1172, 1174], [1173, 1175], [1174, 1176, 1239], [1175, 1177], [1125, 1176, 1178], [1177, 1179], [1178, 1180, 1240], [1179, 1181], [1126, 1180, 1182], [1181, 1183], [1182, 1184, 1241], [1183, 1185], [1127, 1184, 1186], [1185, 1187], [1186, 1188, 1242], [1187, 1189], [1128, 1188, 1190], [1189, 1191], [1190, 1192, 1243], [1191, 1193], [1129, 1192, 1194], [1193, 1195], [1194, 1196, 1244], [1195, 1197], [1130, 1196, 1198], [1197, 1199], [1198, 1200, 1245], [1199, 1201], [1131, 1200, 1202], [1201, 1203], [1202, 1204, 1246], [1203, 1205], [1132, 1204, 1206], [1205, 1207], [1206, 1208, 1247], [1207, 1209], [1133, 1208, 1210], [1209, 1211], [1210, 1212, 1248], [1211, 1213], [1134, 1212, 1214], [1213, 1215], [1214, 1216, 1249], [1215, 1217], [1135, 1216, 1218], [1217, 1219], [1218, 1220, 1250], [1219, 1221], [1136, 1220, 1222], [1221, 1223], [1222, 1224, 1251], [1223, 1225], [1137, 1224, 1226], [1225, 1227], [1226, 1228, 1252], [1227, 1229], [1138, 1228], [1139, 1253], [1143, 1257], [1147, 1261], [1151, 1265], [1155, 1269], [1159, 1273], [1163, 1277], [1167, 1281], [1171, 1285], [1175, 1289], [1179, 1293], [1183, 1297], [1187, 1301], [1191, 1305], [1195, 1309], [1199, 1313], [1203, 1317], [1207, 1321], [1211, 1325], [1215, 1329], [1219, 1333], [1223, 1337], [1227, 1341], [1230, 1254], [1253, 1255], [1254, 1256, 1344], [1255, 1257], [1231, 1256, 1258], [1257, 1259], [1258, 1260, 1345], [1259, 1261], [1232, 1260, 1262], [1261, 1263], [1262, 1264, 1346], [1263, 1265], [1233, 1264, 1266], [1265, 1267], [1266, 1268, 1347], [1267, 1269], [1234, 1268, 1270], [1269, 1271], [1270, 1272, 1348], [1271, 1273], [1235, 1272, 1274], [1273, 1275], [1274, 1276, 1349], [1275, 1277], [1236, 1276, 1278], [1277, 1279], [1278, 1280, 1350], [1279, 1281], [1237, 1280, 1282], [1281, 1283], [1282, 1284, 1351], [1283, 1285], [1238, 1284, 1286], [1285, 1287], [1286, 1288, 1352], [1287, 1289], [1239, 1288, 1290], [1289, 1291], [1290, 1292, 1353], [1291, 1293], [1240, 1292, 1294], [1293, 1295], [1294, 1296, 1354], [1295, 1297], [1241, 1296, 1298], [1297, 1299], [1298, 1300, 1355], [1299, 1301], [1242, 1300, 1302], [1301, 1303], [1302, 1304, 1356], [1303, 1305], [1243, 1304, 1306], [1305, 1307], [1306, 1308, 1357], [1307, 1309], [1244, 1308, 1310], [1309, 1311], [1310, 1312, 1358], [1311, 1313], [1245, 1312, 1314], [1313, 1315], [1314, 1316, 1359], [1315, 1317], [1246, 1316, 1318], [1317, 1319], [1318, 1320, 1360], [1319, 1321], [1247, 1320, 1322], [1321, 1323], [1322, 1324, 1361], [1323, 1325], [1248, 1324, 1326], [1325, 1327], [1326, 1328, 1362], [1327, 1329], [1249, 1328, 1330], [1329, 1331], [1330, 1332, 1363], [1331, 1333], [1250, 1332, 1334], [1333, 1335], [1334, 1336, 1364], [1335, 1337], [1251, 1336, 1338], [1337, 1339], [1338, 1340, 1365], [1339, 1341], [1252, 1340, 1342], [1341, 1343], [1342, 1366], [1255, 1369], [1259, 1373], [1263, 1377], [1267, 1381], [1271, 1385], [1275, 1389], [1279, 1393], [1283, 1397], [1287, 1401], [1291, 1405], [1295, 1409], [1299, 1413], [1303, 1417], [1307, 1421], [1311, 1425], [1315, 1429], [1319, 1433], [1323, 1437], [1327, 1441], [1331, 1445], [1335, 1449], [1339, 1453], [1343, 1457], [1368, 1458], [1367, 1369], [1344, 1368, 1370], [1369, 1371], [1370, 1372, 1459], [1371, 1373], [1345, 1372, 1374], [1373, 1375], [1374, 1376, 1460], [1375, 1377], [1346, 1376, 1378], [1377, 1379], [1378, 1380, 1461], [1379, 1381], [1347, 1380, 1382], [1381, 1383], [1382, 1384, 1462], [1383, 1385], [1348, 1384, 1386], [1385, 1387], [1386, 1388, 1463], [1387, 1389], [1349, 1388, 1390], [1389, 1391], [1390, 1392, 1464], [1391, 1393], [1350, 1392, 1394], [1393, 1395], [1394, 1396, 1465], [1395, 1397], [1351, 1396, 1398], [1397, 1399], [1398, 1400, 1466], [1399, 1401], [1352, 1400, 1402], [1401, 1403], [1402, 1404, 1467], [1403, 1405], [1353, 1404, 1406], [1405, 1407], [1406, 1408, 1468], [1407, 1409], [1354, 1408, 1410], [1409, 1411], [1410, 1412, 1469], [1411, 1413], [1355, 1412, 1414], [1413, 1415], [1414, 1416, 1470], [1415, 1417], [1356, 1416, 1418], [1417, 1419], [1418, 1420, 1471], [1419, 1421], [1357, 1420, 1422], [1421, 1423], [1422, 1424, 1472], [1423, 1425], [1358, 1424, 1426], [1425, 1427], [1426, 1428, 1473], [1427, 1429], [1359, 1428, 1430], [1429, 1431], [1430, 1432, 1474], [1431, 1433], [1360, 1432, 1434], [1433, 1435], [1434, 1436, 1475], [1435, 1437], [1361, 1436, 1438], [1437, 1439], [1438, 1440, 1476], [1439, 1441], [1362, 1440, 1442], [1441, 1443], [1442, 1444, 1477], [1443, 1445], [1363, 1444, 1446], [1445, 1447], [1446, 1448, 1478], [1447, 1449], [1364, 1448, 1450], [1449, 1451], [1450, 1452, 1479], [1451, 1453], [1365, 1452, 1454], [1453, 1455], [1454, 1456, 1480], [1455, 1457], [1366, 1456], [1367, 1481], [1371, 1485], [1375, 1489], [1379, 1493], [1383, 1497], [1387, 1501], [1391, 1505], [1395, 1509], [1399, 1513], [1403, 1517], [1407, 1521], [1411, 1525], [1415, 1529], [1419, 1533], [1423, 1537], [1427, 1541], [1431, 1545], [1435, 1549], [1439, 1553], [1443, 1557], [1447, 1561], [1451, 1565], [1455, 1569], [1458, 1482], [1481, 1483], [1482, 1484, 1572], [1483, 1485], [1459, 1484, 1486], [1485, 1487], [1486, 1488, 1573], [1487, 1489], [1460, 1488, 1490], [1489, 1491], [1490, 1492, 1574], [1491, 1493], [1461, 1492, 1494], [1493, 1495], [1494, 1496, 1575], [1495, 1497], [1462, 1496, 1498], [1497, 1499], [1498, 1500, 1576], [1499, 1501], [1463, 1500, 1502], [1501, 1503], [1502, 1504, 1577], [1503, 1505], [1464, 1504, 1506], [1505, 1507], [1506, 1508, 1578], [1507, 1509], [1465, 1508, 1510], [1509, 1511], [1510, 1512, 1579], [1511, 1513], [1466, 1512, 1514], [1513, 1515], [1514, 1516, 1580], [1515, 1517], [1467, 1516, 1518], [1517, 1519], [1518, 1520, 1581], [1519, 1521], [1468, 1520, 1522], [1521, 1523], [1522, 1524, 1582], [1523, 1525], [1469, 1524, 1526], [1525, 1527], [1526, 1528, 1583], [1527, 1529], [1470, 1528, 1530], [1529, 1531], [1530, 1532, 1584], [1531, 1533], [1471, 1532, 1534], [1533, 1535], [1534, 1536, 1585], [1535, 1537], [1472, 1536, 1538], [1537, 1539], [1538, 1540, 1586], [1539, 1541], [1473, 1540, 1542], [1541, 1543], [1542, 1544, 1587], [1543, 1545], [1474, 1544, 1546], [1545, 1547], [1546, 1548, 1588], [1547, 1549], [1475, 1548, 1550], [1549, 1551], [1550, 1552, 1589], [1551, 1553], [1476, 1552, 1554], [1553, 1555], [1554, 1556, 1590], [1555, 1557], [1477, 1556, 1558], [1557, 1559], [1558, 1560, 1591], [1559, 1561], [1478, 1560, 1562], [1561, 1563], [1562, 1564, 1592], [1563, 1565], [1479, 1564, 1566], [1565, 1567], [1566, 1568, 1593], [1567, 1569], [1480, 1568, 1570], [1569, 1571], [1570, 1594], [1483, 1597], [1487, 1601], [1491, 1605], [1495, 1609], [1499, 1613], [1503, 1617], [1507, 1621], [1511, 1625], [1515, 1629], [1519, 1633], [1523, 1637], [1527, 1641], [1531, 1645], [1535, 1649], [1539, 1653], [1543, 1657], [1547, 1661], [1551, 1665], [1555, 1669], [1559, 1673], [1563, 1677], [1567, 1681], [1571, 1685], [1596, 1686], [1595, 1597], [1572, 1596, 1598], [1597, 1599], [1598, 1600, 1687], [1599, 1601], [1573, 1600, 1602], [1601, 1603], [1602, 1604, 1688], [1603, 1605], [1574, 1604, 1606], [1605, 1607], [1606, 1608, 1689], [1607, 1609], [1575, 1608, 1610], [1609, 1611], [1610, 1612, 1690], [1611, 1613], [1576, 1612, 1614], [1613, 1615], [1614, 1616, 1691], [1615, 1617], [1577, 1616, 1618], [1617, 1619], [1618, 1620, 1692], [1619, 1621], [1578, 1620, 1622], [1621, 1623], [1622, 1624, 1693], [1623, 1625], [1579, 1624, 1626], [1625, 1627], [1626, 1628, 1694], [1627, 1629], [1580, 1628, 1630], [1629, 1631], [1630, 1632, 1695], [1631, 1633], [1581, 1632, 1634], [1633, 1635], [1634, 1636, 1696], [1635, 1637], [1582, 1636, 1638], [1637, 1639], [1638, 1640, 1697], [1639, 1641], [1583, 1640, 1642], [1641, 1643], [1642, 1644, 1698], [1643, 1645], [1584, 1644, 1646], [1645, 1647], [1646, 1648, 1699], [1647, 1649], [1585, 1648, 1650], [1649, 1651], [1650, 1652, 1700], [1651, 1653], [1586, 1652, 1654], [1653, 1655], [1654, 1656, 1701], [1655, 1657], [1587, 1656, 1658], [1657, 1659], [1658, 1660, 1702], [1659, 1661], [1588, 1660, 1662], [1661, 1663], [1662, 1664, 1703], [1663, 1665], [1589, 1664, 1666], [1665, 1667], [1666, 1668, 1704], [1667, 1669], [1590, 1668, 1670], [1669, 1671], [1670, 1672, 1705], [1671, 1673], [1591, 1672, 1674], [1673, 1675], [1674, 1676, 1706], [1675, 1677], [1592, 1676, 1678], [1677, 1679], [1678, 1680, 1707], [1679, 1681], [1593, 1680, 1682], [1681, 1683], [1682, 1684, 1708], [1683, 1685], [1594, 1684], [1595, 1709], [1599, 1713], [1603, 1717], [1607, 1721], [1611, 1725], [1615, 1729], [1619, 1733], [1623, 1737], [1627, 1741], [1631, 1745], [1635, 1749], [1639, 1753], [1643, 1757], [1647, 1761], [1651, 1765], [1655, 1769], [1659, 1773], [1663, 1777], [1667, 1781], [1671, 1785], [1675, 1789], [1679, 1793], [1683, 1797], [1686, 1710], [1709, 1711], [1710, 1712, 1800], [1711, 1713], [1687, 1712, 1714], [1713, 1715], [1714, 1716, 1801], [1715, 1717], [1688, 1716, 1718], [1717, 1719], [1718, 1720, 1802], [1719, 1721], [1689, 1720, 1722], [1721, 1723], [1722, 1724, 1803], [1723, 1725], [1690, 1724, 1726], [1725, 1727], [1726, 1728, 1804], [1727, 1729], [1691, 1728, 1730], [1729, 1731], [1730, 1732, 1805], [1731, 1733], [1692, 1732, 1734], [1733, 1735], [1734, 1736, 1806], [1735, 1737], [1693, 1736, 1738], [1737, 1739], [1738, 1740, 1807], [1739, 1741], [1694, 1740, 1742], [1741, 1743], [1742, 1744, 1808], [1743, 1745], [1695, 1744, 1746], [1745, 1747], [1746, 1748, 1809], [1747, 1749], [1696, 1748, 1750], [1749, 1751], [1750, 1752, 1810], [1751, 1753], [1697, 1752, 1754], [1753, 1755], [1754, 1756, 1811], [1755, 1757], [1698, 1756, 1758], [1757, 1759], [1758, 1760, 1812], [1759, 1761], [1699, 1760, 1762], [1761, 1763], [1762, 1764, 1813], [1763, 1765], [1700, 1764, 1766], [1765, 1767], [1766, 1768, 1814], [1767, 1769], [1701, 1768, 1770], [1769, 1771], [1770, 1772, 1815], [1771, 1773], [1702, 1772, 1774], [1773, 1775], [1774, 1776, 1816], [1775, 1777], [1703, 1776, 1778], [1777, 1779], [1778, 1780, 1817], [1779, 1781], [1704, 1780, 1782], [1781, 1783], [1782, 1784, 1818], [1783, 1785], [1705, 1784, 1786], [1785, 1787], [1786, 1788, 1819], [1787, 1789], [1706, 1788, 1790], [1789, 1791], [1790, 1792, 1820], [1791, 1793], [1707, 1792, 1794], [1793, 1795], [1794, 1796, 1821], [1795, 1797], [1708, 1796, 1798], [1797, 1799], [1798, 1822], [1711, 1825], [1715, 1829], [1719, 1833], [1723, 1837], [1727, 1841], [1731, 1845], [1735, 1849], [1739, 1853], [1743, 1857], [1747, 1861], [1751, 1865], [1755, 1869], [1759, 1873], [1763, 1877], [1767, 1881], [1771, 1885], [1775, 1889], [1779, 1893], [1783, 1897], [1787, 1901], [1791, 1905], [1795, 1909], [1799, 1913], [1824, 1914], [1823, 1825], [1800, 1824, 1826], [1825, 1827], [1826, 1828, 1915], [1827, 1829], [1801, 1828, 1830], [1829, 1831], [1830, 1832, 1916], [1831, 1833], [1802, 1832, 1834], [1833, 1835], [1834, 1836, 1917], [1835, 1837], [1803, 1836, 1838], [1837, 1839], [1838, 1840, 1918], [1839, 1841], [1804, 1840, 1842], [1841, 1843], [1842, 1844, 1919], [1843, 1845], [1805, 1844, 1846], [1845, 1847], [1846, 1848, 1920], [1847, 1849], [1806, 1848, 1850], [1849, 1851], [1850, 1852, 1921], [1851, 1853], [1807, 1852, 1854], [1853, 1855], [1854, 1856, 1922], [1855, 1857], [1808, 1856, 1858], [1857, 1859], [1858, 1860, 1923], [1859, 1861], [1809, 1860, 1862], [1861, 1863], [1862, 1864, 1924], [1863, 1865], [1810, 1864, 1866], [1865, 1867], [1866, 1868, 1925], [1867, 1869], [1811, 1868, 1870], [1869, 1871], [1870, 1872, 1926], [1871, 1873], [1812, 1872, 1874], [1873, 1875], [1874, 1876, 1927], [1875, 1877], [1813, 1876, 1878], [1877, 1879], [1878, 1880, 1928], [1879, 1881], [1814, 1880, 1882], [1881, 1883], [1882, 1884, 1929], [1883, 1885], [1815, 1884, 1886], [1885, 1887], [1886, 1888, 1930], [1887, 1889], [1816, 1888, 1890], [1889, 1891], [1890, 1892, 1931], [1891, 1893], [1817, 1892, 1894], [1893, 1895], [1894, 1896, 1932], [1895, 1897], [1818, 1896, 1898], [1897, 1899], [1898, 1900, 1933], [1899, 1901], [1819, 1900, 1902], [1901, 1903], [1902, 1904, 1934], [1903, 1905], [1820, 1904, 1906], [1905, 1907], [1906, 1908, 1935], [1907, 1909], [1821, 1908, 1910], [1909, 1911], [1910, 1912, 1936], [1911, 1913], [1822, 1912], [1823, 1937], [1827, 1941], [1831, 1945], [1835, 1949], [1839, 1953], [1843, 1957], [1847, 1961], [1851, 1965], [1855, 1969], [1859, 1973], [1863, 1977], [1867, 1981], [1871, 1985], [1875, 1989], [1879, 1993], [1883, 1997], [1887, 2001], [1891, 2005], [1895, 2009], [1899, 2013], [1903, 2017], [1907, 2021], [1911, 2025], [1914, 1938], [1937, 1939], [1938, 1940, 2028], [1939, 1941], [1915, 1940, 1942], [1941, 1943], [1942, 1944, 2029], [1943, 1945], [1916, 1944, 1946], [1945, 1947], [1946, 1948, 2030], [1947, 1949], [1917, 1948, 1950], [1949, 1951], [1950, 1952, 2031], [1951, 1953], [1918, 1952, 1954], [1953, 1955], [1954, 1956, 2032], [1955, 1957], [1919, 1956, 1958], [1957, 1959], [1958, 1960, 2033], [1959, 1961], [1920, 1960, 1962], [1961, 1963], [1962, 1964, 2034], [1963, 1965], [1921, 1964, 1966], [1965, 1967], [1966, 1968, 2035], [1967, 1969], [1922, 1968, 1970], [1969, 1971], [1970, 1972, 2036], [1971, 1973], [1923, 1972, 1974], [1973, 1975], [1974, 1976, 2037], [1975, 1977], [1924, 1976, 1978], [1977, 1979], [1978, 1980, 2038], [1979, 1981], [1925, 1980, 1982], [1981, 1983], [1982, 1984, 2039], [1983, 1985], [1926, 1984, 1986], [1985, 1987], [1986, 1988, 2040], [1987, 1989], [1927, 1988, 1990], [1989, 1991], [1990, 1992, 2041], [1991, 1993], [1928, 1992, 1994], [1993, 1995], [1994, 1996, 2042], [1995, 1997], [1929, 1996, 1998], [1997, 1999], [1998, 2000, 2043], [1999, 2001], [1930, 2000, 2002], [2001, 2003], [2002, 2004, 2044], [2003, 2005], [1931, 2004, 2006], [2005, 2007], [2006, 2008, 2045], [2007, 2009], [1932, 2008, 2010], [2009, 2011], [2010, 2012, 2046], [2011, 2013], [1933, 2012, 2014], [2013, 2015], [2014, 2016, 2047], [2015, 2017], [1934, 2016, 2018], [2017, 2019], [2018, 2020, 2048], [2019, 2021], [1935, 2020, 2022], [2021, 2023], [2022, 2024, 2049], [2023, 2025], [1936, 2024, 2026], [2025, 2027], [2026, 2050], [1939, 2053], [1943, 2057], [1947, 2061], [1951, 2065], [1955, 2069], [1959, 2073], [1963, 2077], [1967, 2081], [1971, 2085], [1975, 2089], [1979, 2093], [1983, 2097], [1987, 2101], [1991, 2105], [1995, 2109], [1999, 2113], [2003, 2117], [2007, 2121], [2011, 2125], [2015, 2129], [2019, 2133], [2023, 2137], [2027, 2141], [2052, 2142], [2051, 2053], [2028, 2052, 2054], [2053, 2055], [2054, 2056, 2143], [2055, 2057], [2029, 2056, 2058], [2057, 2059], [2058, 2060, 2144], [2059, 2061], [2030, 2060, 2062], [2061, 2063], [2062, 2064, 2145], [2063, 2065], [2031, 2064, 2066], [2065, 2067], [2066, 2068, 2146], [2067, 2069], [2032, 2068, 2070], [2069, 2071], [2070, 2072, 2147], [2071, 2073], [2033, 2072, 2074], [2073, 2075], [2074, 2076, 2148], [2075, 2077], [2034, 2076, 2078], [2077, 2079], [2078, 2080, 2149], [2079, 2081], [2035, 2080, 2082], [2081, 2083], [2082, 2084, 2150], [2083, 2085], [2036, 2084, 2086], [2085, 2087], [2086, 2088, 2151], [2087, 2089], [2037, 2088, 2090], [2089, 2091], [2090, 2092, 2152], [2091, 2093], [2038, 2092, 2094], [2093, 2095], [2094, 2096, 2153], [2095, 2097], [2039, 2096, 2098], [2097, 2099], [2098, 2100, 2154], [2099, 2101], [2040, 2100, 2102], [2101, 2103], [2102, 2104, 2155], [2103, 2105], [2041, 2104, 2106], [2105, 2107], [2106, 2108, 2156], [2107, 2109], [2042, 2108, 2110], [2109, 2111], [2110, 2112, 2157], [2111, 2113], [2043, 2112, 2114], [2113, 2115], [2114, 2116, 2158], [2115, 2117], [2044, 2116, 2118], [2117, 2119], [2118, 2120, 2159], [2119, 2121], [2045, 2120, 2122], [2121, 2123], [2122, 2124, 2160], [2123, 2125], [2046, 2124, 2126], [2125, 2127], [2126, 2128, 2161], [2127, 2129], [2047, 2128, 2130], [2129, 2131], [2130, 2132, 2162], [2131, 2133], [2048, 2132, 2134], [2133, 2135], [2134, 2136, 2163], [2135, 2137], [2049, 2136, 2138], [2137, 2139], [2138, 2140, 2164], [2139, 2141], [2050, 2140], [2051, 2165], [2055, 2169], [2059, 2173], [2063, 2177], [2067, 2181], [2071, 2185], [2075, 2189], [2079, 2193], [2083, 2197], [2087, 2201], [2091, 2205], [2095, 2209], [2099, 2213], [2103, 2217], [2107, 2221], [2111, 2225], [2115, 2229], [2119, 2233], [2123, 2237], [2127, 2241], [2131, 2245], [2135, 2249], [2139, 2253], [2142, 2166], [2165, 2167], [2166, 2168, 2256], [2167, 2169], [2143, 2168, 2170], [2169, 2171], [2170, 2172, 2257], [2171, 2173], [2144, 2172, 2174], [2173, 2175], [2174, 2176, 2258], [2175, 2177], [2145, 2176, 2178], [2177, 2179], [2178, 2180, 2259], [2179, 2181], [2146, 2180, 2182], [2181, 2183], [2182, 2184, 2260], [2183, 2185], [2147, 2184, 2186], [2185, 2187], [2186, 2188, 2261], [2187, 2189], [2148, 2188, 2190], [2189, 2191], [2190, 2192, 2262], [2191, 2193], [2149, 2192, 2194], [2193, 2195], [2194, 2196, 2263], [2195, 2197], [2150, 2196, 2198], [2197, 2199], [2198, 2200, 2264], [2199, 2201], [2151, 2200, 2202], [2201, 2203], [2202, 2204, 2265], [2203, 2205], [2152, 2204, 2206], [2205, 2207], [2206, 2208, 2266], [2207, 2209], [2153, 2208, 2210], [2209, 2211], [2210, 2212, 2267], [2211, 2213], [2154, 2212, 2214], [2213, 2215], [2214, 2216, 2268], [2215, 2217], [2155, 2216, 2218], [2217, 2219], [2218, 2220, 2269], [2219, 2221], [2156, 2220, 2222], [2221, 2223], [2222, 2224, 2270], [2223, 2225], [2157, 2224, 2226], [2225, 2227], [2226, 2228, 2271], [2227, 2229], [2158, 2228, 2230], [2229, 2231], [2230, 2232, 2272], [2231, 2233], [2159, 2232, 2234], [2233, 2235], [2234, 2236, 2273], [2235, 2237], [2160, 2236, 2238], [2237, 2239], [2238, 2240, 2274], [2239, 2241], [2161, 2240, 2242], [2241, 2243], [2242, 2244, 2275], [2243, 2245], [2162, 2244, 2246], [2245, 2247], [2246, 2248, 2276], [2247, 2249], [2163, 2248, 2250], [2249, 2251], [2250, 2252, 2277], [2251, 2253], [2164, 2252, 2254], [2253, 2255], [2254, 2278], [2167, 2281], [2171, 2285], [2175, 2289], [2179, 2293], [2183, 2297], [2187, 2301], [2191, 2305], [2195, 2309], [2199, 2313], [2203, 2317], [2207, 2321], [2211, 2325], [2215, 2329], [2219, 2333], [2223, 2337], [2227, 2341], [2231, 2345], [2235, 2349], [2239, 2353], [2243, 2357], [2247, 2361], [2251, 2365], [2255, 2369], [2280, 2370], [2279, 2281], [2256, 2280, 2282], [2281, 2283], [2282, 2284, 2371], [2283, 2285], [2257, 2284, 2286], [2285, 2287], [2286, 2288, 2372], [2287, 2289], [2258, 2288, 2290], [2289, 2291], [2290, 2292, 2373], [2291, 2293], [2259, 2292, 2294], [2293, 2295], [2294, 2296, 2374], [2295, 2297], [2260, 2296, 2298], [2297, 2299], [2298, 2300, 2375], [2299, 2301], [2261, 2300, 2302], [2301, 2303], [2302, 2304, 2376], [2303, 2305], [2262, 2304, 2306], [2305, 2307], [2306, 2308, 2377], [2307, 2309], [2263, 2308, 2310], [2309, 2311], [2310, 2312, 2378], [2311, 2313], [2264, 2312, 2314], [2313, 2315], [2314, 2316, 2379], [2315, 2317], [2265, 2316, 2318], [2317, 2319], [2318, 2320, 2380], [2319, 2321], [2266, 2320, 2322], [2321, 2323], [2322, 2324, 2381], [2323, 2325], [2267, 2324, 2326], [2325, 2327], [2326, 2328, 2382], [2327, 2329], [2268, 2328, 2330], [2329, 2331], [2330, 2332, 2383], [2331, 2333], [2269, 2332, 2334], [2333, 2335], [2334, 2336, 2384], [2335, 2337], [2270, 2336, 2338], [2337, 2339], [2338, 2340, 2385], [2339, 2341], [2271, 2340, 2342], [2341, 2343], [2342, 2344, 2386], [2343, 2345], [2272, 2344, 2346], [2345, 2347], [2346, 2348, 2387], [2347, 2349], [2273, 2348, 2350], [2349, 2351], [2350, 2352, 2388], [2351, 2353], [2274, 2352, 2354], [2353, 2355], [2354, 2356, 2389], [2355, 2357], [2275, 2356, 2358], [2357, 2359], [2358, 2360, 2390], [2359, 2361], [2276, 2360, 2362], [2361, 2363], [2362, 2364, 2391], [2363, 2365], [2277, 2364, 2366], [2365, 2367], [2366, 2368, 2392], [2367, 2369], [2278, 2368], [2279, 2393], [2283, 2397], [2287, 2401], [2291, 2405], [2295, 2409], [2299, 2413], [2303, 2417], [2307, 2421], [2311, 2425], [2315, 2429], [2319, 2433], [2323, 2437], [2327, 2441], [2331, 2445], [2335, 2449], [2339, 2453], [2343, 2457], [2347, 2461], [2351, 2465], [2355, 2469], [2359, 2473], [2363, 2477], [2367, 2481], [2370, 2394], [2393, 2395], [2394, 2396, 2484], [2395, 2397], [2371, 2396, 2398], [2397, 2399], [2398, 2400, 2485], [2399, 2401], [2372, 2400, 2402], [2401, 2403], [2402, 2404, 2486], [2403, 2405], [2373, 2404, 2406], [2405, 2407], [2406, 2408, 2487], [2407, 2409], [2374, 2408, 2410], [2409, 2411], [2410, 2412, 2488], [2411, 2413], [2375, 2412, 2414], [2413, 2415], [2414, 2416, 2489], [2415, 2417], [2376, 2416, 2418], [2417, 2419], [2418, 2420, 2490], [2419, 2421], [2377, 2420, 2422], [2421, 2423], [2422, 2424, 2491], [2423, 2425], [2378, 2424, 2426], [2425, 2427], [2426, 2428, 2492], [2427, 2429], [2379, 2428, 2430], [2429, 2431], [2430, 2432, 2493], [2431, 2433], [2380, 2432, 2434], [2433, 2435], [2434, 2436, 2494], [2435, 2437], [2381, 2436, 2438], [2437, 2439], [2438, 2440, 2495], [2439, 2441], [2382, 2440, 2442], [2441, 2443], [2442, 2444, 2496], [2443, 2445], [2383, 2444, 2446], [2445, 2447], [2446, 2448, 2497], [2447, 2449], [2384, 2448, 2450], [2449, 2451], [2450, 2452, 2498], [2451, 2453], [2385, 2452, 2454], [2453, 2455], [2454, 2456, 2499], [2455, 2457], [2386, 2456, 2458], [2457, 2459], [2458, 2460, 2500], [2459, 2461], [2387, 2460, 2462], [2461, 2463], [2462, 2464, 2501], [2463, 2465], [2388, 2464, 2466], [2465, 2467], [2466, 2468, 2502], [2467, 2469], [2389, 2468, 2470], [2469, 2471], [2470, 2472, 2503], [2471, 2473], [2390, 2472, 2474], [2473, 2475], [2474, 2476, 2504], [2475, 2477], [2391, 2476, 2478], [2477, 2479], [2478, 2480, 2505], [2479, 2481], [2392, 2480, 2482], [2481, 2483], [2482, 2506], [2395, 2509], [2399, 2513], [2403, 2517], [2407, 2521], [2411, 2525], [2415, 2529], [2419, 2533], [2423, 2537], [2427, 2541], [2431, 2545], [2435, 2549], [2439, 2553], [2443, 2557], [2447, 2561], [2451, 2565], [2455, 2569], [2459, 2573], [2463, 2577], [2467, 2581], [2471, 2585], [2475, 2589], [2479, 2593], [2483, 2597], [2508, 2598], [2507, 2509], [2484, 2508, 2510], [2509, 2511], [2510, 2512, 2599], [2511, 2513], [2485, 2512, 2514], [2513, 2515], [2514, 2516, 2600], [2515, 2517], [2486, 2516, 2518], [2517, 2519], [2518, 2520, 2601], [2519, 2521], [2487, 2520, 2522], [2521, 2523], [2522, 2524, 2602], [2523, 2525], [2488, 2524, 2526], [2525, 2527], [2526, 2528, 2603], [2527, 2529], [2489, 2528, 2530], [2529, 2531], [2530, 2532, 2604], [2531, 2533], [2490, 2532, 2534], [2533, 2535], [2534, 2536, 2605], [2535, 2537], [2491, 2536, 2538], [2537, 2539], [2538, 2540, 2606], [2539, 2541], [2492, 2540, 2542], [2541, 2543], [2542, 2544, 2607], [2543, 2545], [2493, 2544, 2546], [2545, 2547], [2546, 2548, 2608], [2547, 2549], [2494, 2548, 2550], [2549, 2551], [2550, 2552, 2609], [2551, 2553], [2495, 2552, 2554], [2553, 2555], [2554, 2556, 2610], [2555, 2557], [2496, 2556, 2558], [2557, 2559], [2558, 2560, 2611], [2559, 2561], [2497, 2560, 2562], [2561, 2563], [2562, 2564, 2612], [2563, 2565], [2498, 2564, 2566], [2565, 2567], [2566, 2568, 2613], [2567, 2569], [2499, 2568, 2570], [2569, 2571], [2570, 2572, 2614], [2571, 2573], [2500, 2572, 2574], [2573, 2575], [2574, 2576, 2615], [2575, 2577], [2501, 2576, 2578], [2577, 2579], [2578, 2580, 2616], [2579, 2581], [2502, 2580, 2582], [2581, 2583], [2582, 2584, 2617], [2583, 2585], [2503, 2584, 2586], [2585, 2587], [2586, 2588, 2618], [2587, 2589], [2504, 2588, 2590], [2589, 2591], [2590, 2592, 2619], [2591, 2593], [2505, 2592, 2594], [2593, 2595], [2594, 2596, 2620], [2595, 2597], [2506, 2596], [2507, 2621], [2511, 2625], [2515, 2629], [2519, 2633], [2523, 2637], [2527, 2641], [2531, 2645], [2535, 2649], [2539, 2653], [2543, 2657], [2547, 2661], [2551, 2665], [2555, 2669], [2559, 2673], [2563, 2677], [2567, 2681], [2571, 2685], [2575, 2689], [2579, 2693], [2583, 2697], [2587, 2701], [2591, 2705], [2595, 2709], [2598, 2622], [2621, 2623], [2622, 2624, 2712], [2623, 2625], [2599, 2624, 2626], [2625, 2627], [2626, 2628, 2713], [2627, 2629], [2600, 2628, 2630], [2629, 2631], [2630, 2632, 2714], [2631, 2633], [2601, 2632, 2634], [2633, 2635], [2634, 2636, 2715], [2635, 2637], [2602, 2636, 2638], [2637, 2639], [2638, 2640, 2716], [2639, 2641], [2603, 2640, 2642], [2641, 2643], [2642, 2644, 2717], [2643, 2645], [2604, 2644, 2646], [2645, 2647], [2646, 2648, 2718], [2647, 2649], [2605, 2648, 2650], [2649, 2651], [2650, 2652, 2719], [2651, 2653], [2606, 2652, 2654], [2653, 2655], [2654, 2656, 2720], [2655, 2657], [2607, 2656, 2658], [2657, 2659], [2658, 2660, 2721], [2659, 2661], [2608, 2660, 2662], [2661, 2663], [2662, 2664, 2722], [2663, 2665], [2609, 2664, 2666], [2665, 2667], [2666, 2668, 2723], [2667, 2669], [2610, 2668, 2670], [2669, 2671], [2670, 2672, 2724], [2671, 2673], [2611, 2672, 2674], [2673, 2675], [2674, 2676, 2725], [2675, 2677], [2612, 2676, 2678], [2677, 2679], [2678, 2680, 2726], [2679, 2681], [2613, 2680, 2682], [2681, 2683], [2682, 2684, 2727], [2683, 2685], [2614, 2684, 2686], [2685, 2687], [2686, 2688, 2728], [2687, 2689], [2615, 2688, 2690], [2689, 2691], [2690, 2692, 2729], [2691, 2693], [2616, 2692, 2694], [2693, 2695], [2694, 2696, 2730], [2695, 2697], [2617, 2696, 2698], [2697, 2699], [2698, 2700, 2731], [2699, 2701], [2618, 2700, 2702], [2701, 2703], [2702, 2704, 2732], [2703, 2705], [2619, 2704, 2706], [2705, 2707], [2706, 2708, 2733], [2707, 2709], [2620, 2708, 2710], [2709, 2711], [2710, 2734], [2623, 2737], [2627, 2741], [2631, 2745], [2635, 2749], [2639, 2753], [2643, 2757], [2647, 2761], [2651, 2765], [2655, 2769], [2659, 2773], [2663, 2777], [2667, 2781], [2671, 2785], [2675, 2789], [2679, 2793], [2683, 2797], [2687, 2801], [2691, 2805], [2695, 2809], [2699, 2813], [2703, 2817], [2707, 2821], [2711, 2825], [2736, 2826], [2735, 2737], [2712, 2736, 2738], [2737, 2739], [2738, 2740, 2827], [2739, 2741], [2713, 2740, 2742], [2741, 2743], [2742, 2744, 2828], [2743, 2745], [2714, 2744, 2746], [2745, 2747], [2746, 2748, 2829], [2747, 2749], [2715, 2748, 2750], [2749, 2751], [2750, 2752, 2830], [2751, 2753], [2716, 2752, 2754], [2753, 2755], [2754, 2756, 2831], [2755, 2757], [2717, 2756, 2758], [2757, 2759], [2758, 2760, 2832], [2759, 2761], [2718, 2760, 2762], [2761, 2763], [2762, 2764, 2833], [2763, 2765], [2719, 2764, 2766], [2765, 2767], [2766, 2768, 2834], [2767, 2769], [2720, 2768, 2770], [2769, 2771], [2770, 2772, 2835], [2771, 2773], [2721, 2772, 2774], [2773, 2775], [2774, 2776, 2836], [2775, 2777], [2722, 2776, 2778], [2777, 2779], [2778, 2780, 2837], [2779, 2781], [2723, 2780, 2782], [2781, 2783], [2782, 2784, 2838], [2783, 2785], [2724, 2784, 2786], [2785, 2787], [2786, 2788, 2839], [2787, 2789], [2725, 2788, 2790], [2789, 2791], [2790, 2792, 2840], [2791, 2793], [2726, 2792, 2794], [2793, 2795], [2794, 2796, 2841], [2795, 2797], [2727, 2796, 2798], [2797, 2799], [2798, 2800, 2842], [2799, 2801], [2728, 2800, 2802], [2801, 2803], [2802, 2804, 2843], [2803, 2805], [2729, 2804, 2806], [2805, 2807], [2806, 2808, 2844], [2807, 2809], [2730, 2808, 2810], [2809, 2811], [2810, 2812, 2845], [2811, 2813], [2731, 2812, 2814], [2813, 2815], [2814, 2816, 2846], [2815, 2817], [2732, 2816, 2818], [2817, 2819], [2818, 2820, 2847], [2819, 2821], [2733, 2820, 2822], [2821, 2823], [2822, 2824, 2848], [2823, 2825], [2734, 2824], [2735, 2849], [2739, 2853], [2743, 2857], [2747, 2861], [2751, 2865], [2755, 2869], [2759, 2873], [2763, 2877], [2767, 2881], [2771, 2885], [2775, 2889], [2779, 2893], [2783, 2897], [2787, 2901], [2791, 2905], [2795, 2909], [2799, 2913], [2803, 2917], [2807, 2921], [2811, 2925], [2815, 2929], [2819, 2933], [2823, 2937], [2826, 2850], [2849, 2851], [2850, 2852, 2940], [2851, 2853], [2827, 2852, 2854], [2853, 2855], [2854, 2856, 2941], [2855, 2857], [2828, 2856, 2858], [2857, 2859], [2858, 2860, 2942], [2859, 2861], [2829, 2860, 2862], [2861, 2863], [2862, 2864, 2943], [2863, 2865], [2830, 2864, 2866], [2865, 2867], [2866, 2868, 2944], [2867, 2869], [2831, 2868, 2870], [2869, 2871], [2870, 2872, 2945], [2871, 2873], [2832, 2872, 2874], [2873, 2875], [2874, 2876, 2946], [2875, 2877], [2833, 2876, 2878], [2877, 2879], [2878, 2880, 2947], [2879, 2881], [2834, 2880, 2882], [2881, 2883], [2882, 2884, 2948], [2883, 2885], [2835, 2884, 2886], [2885, 2887], [2886, 2888, 2949], [2887, 2889], [2836, 2888, 2890], [2889, 2891], [2890, 2892, 2950], [2891, 2893], [2837, 2892, 2894], [2893, 2895], [2894, 2896, 2951], [2895, 2897], [2838, 2896, 2898], [2897, 2899], [2898, 2900, 2952], [2899, 2901], [2839, 2900, 2902], [2901, 2903], [2902, 2904, 2953], [2903, 2905], [2840, 2904, 2906], [2905, 2907], [2906, 2908, 2954], [2907, 2909], [2841, 2908, 2910], [2909, 2911], [2910, 2912, 2955], [2911, 2913], [2842, 2912, 2914], [2913, 2915], [2914, 2916, 2956], [2915, 2917], [2843, 2916, 2918], [2917, 2919], [2918, 2920, 2957], [2919, 2921], [2844, 2920, 2922], [2921, 2923], [2922, 2924, 2958], [2923, 2925], [2845, 2924, 2926], [2925, 2927], [2926, 2928, 2959], [2927, 2929], [2846, 2928, 2930], [2929, 2931], [2930, 2932, 2960], [2931, 2933], [2847, 2932, 2934], [2933, 2935], [2934, 2936, 2961], [2935, 2937], [2848, 2936, 2938], [2937, 2939], [2938, 2962], [2851, 2965], [2855, 2969], [2859, 2973], [2863, 2977], [2867, 2981], [2871, 2985], [2875, 2989], [2879, 2993], [2883, 2997], [2887, 3001], [2891, 3005], [2895, 3009], [2899, 3013], [2903, 3017], [2907, 3021], [2911, 3025], [2915, 3029], [2919, 3033], [2923, 3037], [2927, 3041], [2931, 3045], [2935, 3049], [2939, 3053], [2964, 3054], [2963, 2965], [2940, 2964, 2966], [2965, 2967], [2966, 2968, 3055], [2967, 2969], [2941, 2968, 2970], [2969, 2971], [2970, 2972, 3056], [2971, 2973], [2942, 2972, 2974], [2973, 2975], [2974, 2976, 3057], [2975, 2977], [2943, 2976, 2978], [2977, 2979], [2978, 2980, 3058], [2979, 2981], [2944, 2980, 2982], [2981, 2983], [2982, 2984, 3059], [2983, 2985], [2945, 2984, 2986], [2985, 2987], [2986, 2988, 3060], [2987, 2989], [2946, 2988, 2990], [2989, 2991], [2990, 2992, 3061], [2991, 2993], [2947, 2992, 2994], [2993, 2995], [2994, 2996, 3062], [2995, 2997], [2948, 2996, 2998], [2997, 2999], [2998, 3000, 3063], [2999, 3001], [2949, 3000, 3002], [3001, 3003], [3002, 3004, 3064], [3003, 3005], [2950, 3004, 3006], [3005, 3007], [3006, 3008, 3065], [3007, 3009], [2951, 3008, 3010], [3009, 3011], [3010, 3012, 3066], [3011, 3013], [2952, 3012, 3014], [3013, 3015], [3014, 3016, 3067], [3015, 3017], [2953, 3016, 3018], [3017, 3019], [3018, 3020, 3068], [3019, 3021], [2954, 3020, 3022], [3021, 3023], [3022, 3024, 3069], [3023, 3025], [2955, 3024, 3026], [3025, 3027], [3026, 3028, 3070], [3027, 3029], [2956, 3028, 3030], [3029, 3031], [3030, 3032, 3071], [3031, 3033], [2957, 3032, 3034], [3033, 3035], [3034, 3036, 3072], [3035, 3037], [2958, 3036, 3038], [3037, 3039], [3038, 3040, 3073], [3039, 3041], [2959, 3040, 3042], [3041, 3043], [3042, 3044, 3074], [3043, 3045], [2960, 3044, 3046], [3045, 3047], [3046, 3048, 3075], [3047, 3049], [2961, 3048, 3050], [3049, 3051], [3050, 3052, 3076], [3051, 3053], [2962, 3052], [2963, 3077], [2967, 3081], [2971, 3085], [2975, 3089], [2979, 3093], [2983, 3097], [2987, 3101], [2991, 3105], [2995, 3109], [2999, 3113], [3003, 3117], [3007, 3121], [3011, 3125], [3015, 3129], [3019, 3133], [3023, 3137], [3027, 3141], [3031, 3145], [3035, 3149], [3039, 3153], [3043, 3157], [3047, 3161], [3051, 3165], [3054, 3078], [3077, 3079], [3078, 3080, 3168], [3079, 3081], [3055, 3080, 3082], [3081, 3083], [3082, 3084, 3169], [3083, 3085], [3056, 3084, 3086], [3085, 3087], [3086, 3088, 3170], [3087, 3089], [3057, 3088, 3090], [3089, 3091], [3090, 3092, 3171], [3091, 3093], [3058, 3092, 3094], [3093, 3095], [3094, 3096, 3172], [3095, 3097], [3059, 3096, 3098], [3097, 3099], [3098, 3100, 3173], [3099, 3101], [3060, 3100, 3102], [3101, 3103], [3102, 3104, 3174], [3103, 3105], [3061, 3104, 3106], [3105, 3107], [3106, 3108, 3175], [3107, 3109], [3062, 3108, 3110], [3109, 3111], [3110, 3112, 3176], [3111, 3113], [3063, 3112, 3114], [3113, 3115], [3114, 3116, 3177], [3115, 3117], [3064, 3116, 3118], [3117, 3119], [3118, 3120, 3178], [3119, 3121], [3065, 3120, 3122], [3121, 3123], [3122, 3124, 3179], [3123, 3125], [3066, 3124, 3126], [3125, 3127], [3126, 3128, 3180], [3127, 3129], [3067, 3128, 3130], [3129, 3131], [3130, 3132, 3181], [3131, 3133], [3068, 3132, 3134], [3133, 3135], [3134, 3136, 3182], [3135, 3137], [3069, 3136, 3138], [3137, 3139], [3138, 3140, 3183], [3139, 3141], [3070, 3140, 3142], [3141, 3143], [3142, 3144, 3184], [3143, 3145], [3071, 3144, 3146], [3145, 3147], [3146, 3148, 3185], [3147, 3149], [3072, 3148, 3150], [3149, 3151], [3150, 3152, 3186], [3151, 3153], [3073, 3152, 3154], [3153, 3155], [3154, 3156, 3187], [3155, 3157], [3074, 3156, 3158], [3157, 3159], [3158, 3160, 3188], [3159, 3161], [3075, 3160, 3162], [3161, 3163], [3162, 3164, 3189], [3163, 3165], [3076, 3164, 3166], [3165, 3167], [3166, 3190], [3079, 3193], [3083, 3197], [3087, 3201], [3091, 3205], [3095, 3209], [3099, 3213], [3103, 3217], [3107, 3221], [3111, 3225], [3115, 3229], [3119, 3233], [3123, 3237], [3127, 3241], [3131, 3245], [3135, 3249], [3139, 3253], [3143, 3257], [3147, 3261], [3151, 3265], [3155, 3269], [3159, 3273], [3163, 3277], [3167, 3281], [3192, 3282], [3191, 3193], [3168, 3192, 3194], [3193, 3195], [3194, 3196, 3283], [3195, 3197], [3169, 3196, 3198], [3197, 3199], [3198, 3200, 3284], [3199, 3201], [3170, 3200, 3202], [3201, 3203], [3202, 3204, 3285], [3203, 3205], [3171, 3204, 3206], [3205, 3207], [3206, 3208, 3286], [3207, 3209], [3172, 3208, 3210], [3209, 3211], [3210, 3212, 3287], [3211, 3213], [3173, 3212, 3214], [3213, 3215], [3214, 3216, 3288], [3215, 3217], [3174, 3216, 3218], [3217, 3219], [3218, 3220, 3289], [3219, 3221], [3175, 3220, 3222], [3221, 3223], [3222, 3224, 3290], [3223, 3225], [3176, 3224, 3226], [3225, 3227], [3226, 3228, 3291], [3227, 3229], [3177, 3228, 3230], [3229, 3231], [3230, 3232, 3292], [3231, 3233], [3178, 3232, 3234], [3233, 3235], [3234, 3236, 3293], [3235, 3237], [3179, 3236, 3238], [3237, 3239], [3238, 3240, 3294], [3239, 3241], [3180, 3240, 3242], [3241, 3243], [3242, 3244, 3295], [3243, 3245], [3181, 3244, 3246], [3245, 3247], [3246, 3248, 3296], [3247, 3249], [3182, 3248, 3250], [3249, 3251], [3250, 3252, 3297], [3251, 3253], [3183, 3252, 3254], [3253, 3255], [3254, 3256, 3298], [3255, 3257], [3184, 3256, 3258], [3257, 3259], [3258, 3260, 3299], [3259, 3261], [3185, 3260, 3262], [3261, 3263], [3262, 3264, 3300], [3263, 3265], [3186, 3264, 3266], [3265, 3267], [3266, 3268, 3301], [3267, 3269], [3187, 3268, 3270], [3269, 3271], [3270, 3272, 3302], [3271, 3273], [3188, 3272, 3274], [3273, 3275], [3274, 3276, 3303], [3275, 3277], [3189, 3276, 3278], [3277, 3279], [3278, 3280, 3304], [3279, 3281], [3190, 3280], [3191, 3305], [3195, 3309], [3199, 3313], [3203, 3317], [3207, 3321], [3211, 3325], [3215, 3329], [3219, 3333], [3223, 3337], [3227, 3341], [3231, 3345], [3235, 3349], [3239, 3353], [3243, 3357], [3247, 3361], [3251, 3365], [3255, 3369], [3259, 3373], [3263, 3377], [3267, 3381], [3271, 3385], [3275, 3389], [3279, 3393], [3282, 3306], [3305, 3307], [3306, 3308, 3396], [3307, 3309], [3283, 3308, 3310], [3309, 3311], [3310, 3312, 3397], [3311, 3313], [3284, 3312, 3314], [3313, 3315], [3314, 3316, 3398], [3315, 3317], [3285, 3316, 3318], [3317, 3319], [3318, 3320, 3399], [3319, 3321], [3286, 3320, 3322], [3321, 3323], [3322, 3324, 3400], [3323, 3325], [3287, 3324, 3326], [3325, 3327], [3326, 3328, 3401], [3327, 3329], [3288, 3328, 3330], [3329, 3331], [3330, 3332, 3402], [3331, 3333], [3289, 3332, 3334], [3333, 3335], [3334, 3336, 3403], [3335, 3337], [3290, 3336, 3338], [3337, 3339], [3338, 3340, 3404], [3339, 3341], [3291, 3340, 3342], [3341, 3343], [3342, 3344, 3405], [3343, 3345], [3292, 3344, 3346], [3345, 3347], [3346, 3348, 3406], [3347, 3349], [3293, 3348, 3350], [3349, 3351], [3350, 3352, 3407], [3351, 3353], [3294, 3352, 3354], [3353, 3355], [3354, 3356, 3408], [3355, 3357], [3295, 3356, 3358], [3357, 3359], [3358, 3360, 3409], [3359, 3361], [3296, 3360, 3362], [3361, 3363], [3362, 3364, 3410], [3363, 3365], [3297, 3364, 3366], [3365, 3367], [3366, 3368, 3411], [3367, 3369], [3298, 3368, 3370], [3369, 3371], [3370, 3372, 3412], [3371, 3373], [3299, 3372, 3374], [3373, 3375], [3374, 3376, 3413], [3375, 3377], [3300, 3376, 3378], [3377, 3379], [3378, 3380, 3414], [3379, 3381], [3301, 3380, 3382], [3381, 3383], [3382, 3384, 3415], [3383, 3385], [3302, 3384, 3386], [3385, 3387], [3386, 3388, 3416], [3387, 3389], [3303, 3388, 3390], [3389, 3391], [3390, 3392, 3417], [3391, 3393], [3304, 3392, 3394], [3393, 3395], [3394, 3418], [3307, 3421], [3311, 3425], [3315, 3429], [3319, 3433], [3323, 3437], [3327, 3441], [3331, 3445], [3335, 3449], [3339, 3453], [3343, 3457], [3347, 3461], [3351, 3465], [3355, 3469], [3359, 3473], [3363, 3477], [3367, 3481], [3371, 3485], [3375, 3489], [3379, 3493], [3383, 3497], [3387, 3501], [3391, 3505], [3395, 3509], [3420, 3510], [3419, 3421], [3396, 3420, 3422], [3421, 3423], [3422, 3424, 3511], [3423, 3425], [3397, 3424, 3426], [3425, 3427], [3426, 3428, 3512], [3427, 3429], [3398, 3428, 3430], [3429, 3431], [3430, 3432, 3513], [3431, 3433], [3399, 3432, 3434], [3433, 3435], [3434, 3436, 3514], [3435, 3437], [3400, 3436, 3438], [3437, 3439], [3438, 3440, 3515], [3439, 3441], [3401, 3440, 3442], [3441, 3443], [3442, 3444, 3516], [3443, 3445], [3402, 3444, 3446], [3445, 3447], [3446, 3448, 3517], [3447, 3449], [3403, 3448, 3450], [3449, 3451], [3450, 3452, 3518], [3451, 3453], [3404, 3452, 3454], [3453, 3455], [3454, 3456, 3519], [3455, 3457], [3405, 3456, 3458], [3457, 3459], [3458, 3460, 3520], [3459, 3461], [3406, 3460, 3462], [3461, 3463], [3462, 3464, 3521], [3463, 3465], [3407, 3464, 3466], [3465, 3467], [3466, 3468, 3522], [3467, 3469], [3408, 3468, 3470], [3469, 3471], [3470, 3472, 3523], [3471, 3473], [3409, 3472, 3474], [3473, 3475], [3474, 3476, 3524], [3475, 3477], [3410, 3476, 3478], [3477, 3479], [3478, 3480, 3525], [3479, 3481], [3411, 3480, 3482], [3481, 3483], [3482, 3484, 3526], [3483, 3485], [3412, 3484, 3486], [3485, 3487], [3486, 3488, 3527], [3487, 3489], [3413, 3488, 3490], [3489, 3491], [3490, 3492, 3528], [3491, 3493], [3414, 3492, 3494], [3493, 3495], [3494, 3496, 3529], [3495, 3497], [3415, 3496, 3498], [3497, 3499], [3498, 3500, 3530], [3499, 3501], [3416, 3500, 3502], [3501, 3503], [3502, 3504, 3531], [3503, 3505], [3417, 3504, 3506], [3505, 3507], [3506, 3508, 3532], [3507, 3509], [3418, 3508], [3419, 3533], [3423, 3537], [3427, 3541], [3431, 3545], [3435, 3549], [3439, 3553], [3443, 3557], [3447, 3561], [3451, 3565], [3455, 3569], [3459, 3573], [3463, 3577], [3467, 3581], [3471, 3585], [3475, 3589], [3479, 3593], [3483, 3597], [3487, 3601], [3491, 3605], [3495, 3609], [3499, 3613], [3503, 3617], [3507, 3621], [3510, 3534], [3533, 3535], [3534, 3536, 3624], [3535, 3537], [3511, 3536, 3538], [3537, 3539], [3538, 3540, 3625], [3539, 3541], [3512, 3540, 3542], [3541, 3543], [3542, 3544, 3626], [3543, 3545], [3513, 3544, 3546], [3545, 3547], [3546, 3548, 3627], [3547, 3549], [3514, 3548, 3550], [3549, 3551], [3550, 3552, 3628], [3551, 3553], [3515, 3552, 3554], [3553, 3555], [3554, 3556, 3629], [3555, 3557], [3516, 3556, 3558], [3557, 3559], [3558, 3560, 3630], [3559, 3561], [3517, 3560, 3562], [3561, 3563], [3562, 3564, 3631], [3563, 3565], [3518, 3564, 3566], [3565, 3567], [3566, 3568, 3632], [3567, 3569], [3519, 3568, 3570], [3569, 3571], [3570, 3572, 3633], [3571, 3573], [3520, 3572, 3574], [3573, 3575], [3574, 3576, 3634], [3575, 3577], [3521, 3576, 3578], [3577, 3579], [3578, 3580, 3635], [3579, 3581], [3522, 3580, 3582], [3581, 3583], [3582, 3584, 3636], [3583, 3585], [3523, 3584, 3586], [3585, 3587], [3586, 3588, 3637], [3587, 3589], [3524, 3588, 3590], [3589, 3591], [3590, 3592, 3638], [3591, 3593], [3525, 3592, 3594], [3593, 3595], [3594, 3596, 3639], [3595, 3597], [3526, 3596, 3598], [3597, 3599], [3598, 3600, 3640], [3599, 3601], [3527, 3600, 3602], [3601, 3603], [3602, 3604, 3641], [3603, 3605], [3528, 3604, 3606], [3605, 3607], [3606, 3608, 3642], [3607, 3609], [3529, 3608, 3610], [3609, 3611], [3610, 3612, 3643], [3611, 3613], [3530, 3612, 3614], [3613, 3615], [3614, 3616, 3644], [3615, 3617], [3531, 3616, 3618], [3617, 3619], [3618, 3620, 3645], [3619, 3621], [3532, 3620, 3622], [3621, 3623], [3622, 3646], [3535, 3649], [3539, 3653], [3543, 3657], [3547, 3661], [3551, 3665], [3555, 3669], [3559, 3673], [3563, 3677], [3567, 3681], [3571, 3685], [3575, 3689], [3579, 3693], [3583, 3697], [3587, 3701], [3591, 3705], [3595, 3709], [3599, 3713], [3603, 3717], [3607, 3721], [3611, 3725], [3615, 3729], [3619, 3733], [3623, 3737], [3648, 3738], [3647, 3649], [3624, 3648, 3650], [3649, 3651], [3650, 3652, 3739], [3651, 3653], [3625, 3652, 3654], [3653, 3655], [3654, 3656, 3740], [3655, 3657], [3626, 3656, 3658], [3657, 3659], [3658, 3660, 3741], [3659, 3661], [3627, 3660, 3662], [3661, 3663], [3662, 3664, 3742], [3663, 3665], [3628, 3664, 3666], [3665, 3667], [3666, 3668, 3743], [3667, 3669], [3629, 3668, 3670], [3669, 3671], [3670, 3672, 3744], [3671, 3673], [3630, 3672, 3674], [3673, 3675], [3674, 3676, 3745], [3675, 3677], [3631, 3676, 3678], [3677, 3679], [3678, 3680, 3746], [3679, 3681], [3632, 3680, 3682], [3681, 3683], [3682, 3684, 3747], [3683, 3685], [3633, 3684, 3686], [3685, 3687], [3686, 3688, 3748], [3687, 3689], [3634, 3688, 3690], [3689, 3691], [3690, 3692, 3749], [3691, 3693], [3635, 3692, 3694], [3693, 3695], [3694, 3696, 3750], [3695, 3697], [3636, 3696, 3698], [3697, 3699], [3698, 3700, 3751], [3699, 3701], [3637, 3700, 3702], [3701, 3703], [3702, 3704, 3752], [3703, 3705], [3638, 3704, 3706], [3705, 3707], [3706, 3708, 3753], [3707, 3709], [3639, 3708, 3710], [3709, 3711], [3710, 3712, 3754], [3711, 3713], [3640, 3712, 3714], [3713, 3715], [3714, 3716, 3755], [3715, 3717], [3641, 3716, 3718], [3717, 3719], [3718, 3720, 3756], [3719, 3721], [3642, 3720, 3722], [3721, 3723], [3722, 3724, 3757], [3723, 3725], [3643, 3724, 3726], [3725, 3727], [3726, 3728, 3758], [3727, 3729], [3644, 3728, 3730], [3729, 3731], [3730, 3732, 3759], [3731, 3733], [3645, 3732, 3734], [3733, 3735], [3734, 3736, 3760], [3735, 3737], [3646, 3736], [3647, 3761], [3651, 3765], [3655, 3769], [3659, 3773], [3663, 3777], [3667, 3781], [3671, 3785], [3675, 3789], [3679, 3793], [3683, 3797], [3687, 3801], [3691, 3805], [3695, 3809], [3699, 3813], [3703, 3817], [3707, 3821], [3711, 3825], [3715, 3829], [3719, 3833], [3723, 3837], [3727, 3841], [3731, 3845], [3735, 3849], [3738, 3762], [3761, 3763], [3762, 3764, 3852], [3763, 3765], [3739, 3764, 3766], [3765, 3767], [3766, 3768, 3853], [3767, 3769], [3740, 3768, 3770], [3769, 3771], [3770, 3772, 3854], [3771, 3773], [3741, 3772, 3774], [3773, 3775], [3774, 3776, 3855], [3775, 3777], [3742, 3776, 3778], [3777, 3779], [3778, 3780, 3856], [3779, 3781], [3743, 3780, 3782], [3781, 3783], [3782, 3784, 3857], [3783, 3785], [3744, 3784, 3786], [3785, 3787], [3786, 3788, 3858], [3787, 3789], [3745, 3788, 3790], [3789, 3791], [3790, 3792, 3859], [3791, 3793], [3746, 3792, 3794], [3793, 3795], [3794, 3796, 3860], [3795, 3797], [3747, 3796, 3798], [3797, 3799], [3798, 3800, 3861], [3799, 3801], [3748, 3800, 3802], [3801, 3803], [3802, 3804, 3862], [3803, 3805], [3749, 3804, 3806], [3805, 3807], [3806, 3808, 3863], [3807, 3809], [3750, 3808, 3810], [3809, 3811], [3810, 3812, 3864], [3811, 3813], [3751, 3812, 3814], [3813, 3815], [3814, 3816, 3865], [3815, 3817], [3752, 3816, 3818], [3817, 3819], [3818, 3820, 3866], [3819, 3821], [3753, 3820, 3822], [3821, 3823], [3822, 3824, 3867], [3823, 3825], [3754, 3824, 3826], [3825, 3827], [3826, 3828, 3868], [3827, 3829], [3755, 3828, 3830], [3829, 3831], [3830, 3832, 3869], [3831, 3833], [3756, 3832, 3834], [3833, 3835], [3834, 3836, 3870], [3835, 3837], [3757, 3836, 3838], [3837, 3839], [3838, 3840, 3871], [3839, 3841], [3758, 3840, 3842], [3841, 3843], [3842, 3844, 3872], [3843, 3845], [3759, 3844, 3846], [3845, 3847], [3846, 3848, 3873], [3847, 3849], [3760, 3848, 3850], [3849, 3851], [3850, 3874], [3763, 3877], [3767, 3881], [3771, 3885], [3775, 3889], [3779, 3893], [3783, 3897], [3787, 3901], [3791, 3905], [3795, 3909], [3799, 3913], [3803, 3917], [3807, 3921], [3811, 3925], [3815, 3929], [3819, 3933], [3823, 3937], [3827, 3941], [3831, 3945], [3835, 3949], [3839, 3953], [3843, 3957], [3847, 3961], [3851, 3965], [3876, 3966], [3875, 3877], [3852, 3876, 3878], [3877, 3879], [3878, 3880, 3967], [3879, 3881], [3853, 3880, 3882], [3881, 3883], [3882, 3884, 3968], [3883, 3885], [3854, 3884, 3886], [3885, 3887], [3886, 3888, 3969], [3887, 3889], [3855, 3888, 3890], [3889, 3891], [3890, 3892, 3970], [3891, 3893], [3856, 3892, 3894], [3893, 3895], [3894, 3896, 3971], [3895, 3897], [3857, 3896, 3898], [3897, 3899], [3898, 3900, 3972], [3899, 3901], [3858, 3900, 3902], [3901, 3903], [3902, 3904, 3973], [3903, 3905], [3859, 3904, 3906], [3905, 3907], [3906, 3908, 3974], [3907, 3909], [3860, 3908, 3910], [3909, 3911], [3910, 3912, 3975], [3911, 3913], [3861, 3912, 3914], [3913, 3915], [3914, 3916, 3976], [3915, 3917], [3862, 3916, 3918], [3917, 3919], [3918, 3920, 3977], [3919, 3921], [3863, 3920, 3922], [3921, 3923], [3922, 3924, 3978], [3923, 3925], [3864, 3924, 3926], [3925, 3927], [3926, 3928, 3979], [3927, 3929], [3865, 3928, 3930], [3929, 3931], [3930, 3932, 3980], [3931, 3933], [3866, 3932, 3934], [3933, 3935], [3934, 3936, 3981], [3935, 3937], [3867, 3936, 3938], [3937, 3939], [3938, 3940, 3982], [3939, 3941], [3868, 3940, 3942], [3941, 3943], [3942, 3944, 3983], [3943, 3945], [3869, 3944, 3946], [3945, 3947], [3946, 3948, 3984], [3947, 3949], [3870, 3948, 3950], [3949, 3951], [3950, 3952, 3985], [3951, 3953], [3871, 3952, 3954], [3953, 3955], [3954, 3956, 3986], [3955, 3957], [3872, 3956, 3958], [3957, 3959], [3958, 3960, 3987], [3959, 3961], [3873, 3960, 3962], [3961, 3963], [3962, 3964, 3988], [3963, 3965], [3874, 3964], [3875, 3989], [3879, 3993], [3883, 3997], [3887, 4001], [3891, 4005], [3895, 4009], [3899, 4013], [3903, 4017], [3907, 4021], [3911, 4025], [3915, 4029], [3919, 4033], [3923, 4037], [3927, 4041], [3931, 4045], [3935, 4049], [3939, 4053], [3943, 4057], [3947, 4061], [3951, 4065], [3955, 4069], [3959, 4073], [3963, 4077], [3966, 3990], [3989, 3991], [3990, 3992, 4080], [3991, 3993], [3967, 3992, 3994], [3993, 3995], [3994, 3996, 4081], [3995, 3997], [3968, 3996, 3998], [3997, 3999], [3998, 4000, 4082], [3999, 4001], [3969, 4000, 4002], [4001, 4003], [4002, 4004, 4083], [4003, 4005], [3970, 4004, 4006], [4005, 4007], [4006, 4008, 4084], [4007, 4009], [3971, 4008, 4010], [4009, 4011], [4010, 4012, 4085], [4011, 4013], [3972, 4012, 4014], [4013, 4015], [4014, 4016, 4086], [4015, 4017], [3973, 4016, 4018], [4017, 4019], [4018, 4020, 4087], [4019, 4021], [3974, 4020, 4022], [4021, 4023], [4022, 4024, 4088], [4023, 4025], [3975, 4024, 4026], [4025, 4027], [4026, 4028, 4089], [4027, 4029], [3976, 4028, 4030], [4029, 4031], [4030, 4032, 4090], [4031, 4033], [3977, 4032, 4034], [4033, 4035], [4034, 4036, 4091], [4035, 4037], [3978, 4036, 4038], [4037, 4039], [4038, 4040, 4092], [4039, 4041], [3979, 4040, 4042], [4041, 4043], [4042, 4044, 4093], [4043, 4045], [3980, 4044, 4046], [4045, 4047], [4046, 4048, 4094], [4047, 4049], [3981, 4048, 4050], [4049, 4051], [4050, 4052, 4095], [4051, 4053], [3982, 4052, 4054], [4053, 4055], [4054, 4056, 4096], [4055, 4057], [3983, 4056, 4058], [4057, 4059], [4058, 4060, 4097], [4059, 4061], [3984, 4060, 4062], [4061, 4063], [4062, 4064, 4098], [4063, 4065], [3985, 4064, 4066], [4065, 4067], [4066, 4068, 4099], [4067, 4069], [3986, 4068, 4070], [4069, 4071], [4070, 4072, 4100], [4071, 4073], [3987, 4072, 4074], [4073, 4075], [4074, 4076, 4101], [4075, 4077], [3988, 4076, 4078], [4077, 4079], [4078, 4102], [3991, 4105], [3995, 4109], [3999, 4113], [4003, 4117], [4007, 4121], [4011, 4125], [4015, 4129], [4019, 4133], [4023, 4137], [4027, 4141], [4031, 4145], [4035, 4149], [4039, 4153], [4043, 4157], [4047, 4161], [4051, 4165], [4055, 4169], [4059, 4173], [4063, 4177], [4067, 4181], [4071, 4185], [4075, 4189], [4079, 4193], [4104, 4194], [4103, 4105], [4080, 4104, 4106], [4105, 4107], [4106, 4108, 4195], [4107, 4109], [4081, 4108, 4110], [4109, 4111], [4110, 4112, 4196], [4111, 4113], [4082, 4112, 4114], [4113, 4115], [4114, 4116, 4197], [4115, 4117], [4083, 4116, 4118], [4117, 4119], [4118, 4120, 4198], [4119, 4121], [4084, 4120, 4122], [4121, 4123], [4122, 4124, 4199], [4123, 4125], [4085, 4124, 4126], [4125, 4127], [4126, 4128, 4200], [4127, 4129], [4086, 4128, 4130], [4129, 4131], [4130, 4132, 4201], [4131, 4133], [4087, 4132, 4134], [4133, 4135], [4134, 4136, 4202], [4135, 4137], [4088, 4136, 4138], [4137, 4139], [4138, 4140, 4203], [4139, 4141], [4089, 4140, 4142], [4141, 4143], [4142, 4144, 4204], [4143, 4145], [4090, 4144, 4146], [4145, 4147], [4146, 4148, 4205], [4147, 4149], [4091, 4148, 4150], [4149, 4151], [4150, 4152, 4206], [4151, 4153], [4092, 4152, 4154], [4153, 4155], [4154, 4156, 4207], [4155, 4157], [4093, 4156, 4158], [4157, 4159], [4158, 4160, 4208], [4159, 4161], [4094, 4160, 4162], [4161, 4163], [4162, 4164, 4209], [4163, 4165], [4095, 4164, 4166], [4165, 4167], [4166, 4168, 4210], [4167, 4169], [4096, 4168, 4170], [4169, 4171], [4170, 4172, 4211], [4171, 4173], [4097, 4172, 4174], [4173, 4175], [4174, 4176, 4212], [4175, 4177], [4098, 4176, 4178], [4177, 4179], [4178, 4180, 4213], [4179, 4181], [4099, 4180, 4182], [4181, 4183], [4182, 4184, 4214], [4183, 4185], [4100, 4184, 4186], [4185, 4187], [4186, 4188, 4215], [4187, 4189], [4101, 4188, 4190], [4189, 4191], [4190, 4192, 4216], [4191, 4193], [4102, 4192], [4103, 4217], [4107, 4221], [4111, 4225], [4115, 4229], [4119, 4233], [4123, 4237], [4127, 4241], [4131, 4245], [4135, 4249], [4139, 4253], [4143, 4257], [4147, 4261], [4151, 4265], [4155, 4269], [4159, 4273], [4163, 4277], [4167, 4281], [4171, 4285], [4175, 4289], [4179, 4293], [4183, 4297], [4187, 4301], [4191, 4305], [4194, 4218], [4217, 4219], [4218, 4220, 4308], [4219, 4221], [4195, 4220, 4222], [4221, 4223], [4222, 4224, 4309], [4223, 4225], [4196, 4224, 4226], [4225, 4227], [4226, 4228, 4310], [4227, 4229], [4197, 4228, 4230], [4229, 4231], [4230, 4232, 4311], [4231, 4233], [4198, 4232, 4234], [4233, 4235], [4234, 4236, 4312], [4235, 4237], [4199, 4236, 4238], [4237, 4239], [4238, 4240, 4313], [4239, 4241], [4200, 4240, 4242], [4241, 4243], [4242, 4244, 4314], [4243, 4245], [4201, 4244, 4246], [4245, 4247], [4246, 4248, 4315], [4247, 4249], [4202, 4248, 4250], [4249, 4251], [4250, 4252, 4316], [4251, 4253], [4203, 4252, 4254], [4253, 4255], [4254, 4256, 4317], [4255, 4257], [4204, 4256, 4258], [4257, 4259], [4258, 4260, 4318], [4259, 4261], [4205, 4260, 4262], [4261, 4263], [4262, 4264, 4319], [4263, 4265], [4206, 4264, 4266], [4265, 4267], [4266, 4268, 4320], [4267, 4269], [4207, 4268, 4270], [4269, 4271], [4270, 4272, 4321], [4271, 4273], [4208, 4272, 4274], [4273, 4275], [4274, 4276, 4322], [4275, 4277], [4209, 4276, 4278], [4277, 4279], [4278, 4280, 4323], [4279, 4281], [4210, 4280, 4282], [4281, 4283], [4282, 4284, 4324], [4283, 4285], [4211, 4284, 4286], [4285, 4287], [4286, 4288, 4325], [4287, 4289], [4212, 4288, 4290], [4289, 4291], [4290, 4292, 4326], [4291, 4293], [4213, 4292, 4294], [4293, 4295], [4294, 4296, 4327], [4295, 4297], [4214, 4296, 4298], [4297, 4299], [4298, 4300, 4328], [4299, 4301], [4215, 4300, 4302], [4301, 4303], [4302, 4304, 4329], [4303, 4305], [4216, 4304, 4306], [4305, 4307], [4306, 4330], [4219, 4333], [4223, 4337], [4227, 4341], [4231, 4345], [4235, 4349], [4239, 4353], [4243, 4357], [4247, 4361], [4251, 4365], [4255, 4369], [4259, 4373], [4263, 4377], [4267, 4381], [4271, 4385], [4275, 4389], [4279, 4393], [4283, 4397], [4287, 4401], [4291, 4405], [4295, 4409], [4299, 4413], [4303, 4417], [4307, 4421], [4332, 4422], [4331, 4333], [4308, 4332, 4334], [4333, 4335], [4334, 4336, 4423], [4335, 4337], [4309, 4336, 4338], [4337, 4339], [4338, 4340, 4424], [4339, 4341], [4310, 4340, 4342], [4341, 4343], [4342, 4344, 4425], [4343, 4345], [4311, 4344, 4346], [4345, 4347], [4346, 4348, 4426], [4347, 4349], [4312, 4348, 4350], [4349, 4351], [4350, 4352, 4427], [4351, 4353], [4313, 4352, 4354], [4353, 4355], [4354, 4356, 4428], [4355, 4357], [4314, 4356, 4358], [4357, 4359], [4358, 4360, 4429], [4359, 4361], [4315, 4360, 4362], [4361, 4363], [4362, 4364, 4430], [4363, 4365], [4316, 4364, 4366], [4365, 4367], [4366, 4368, 4431], [4367, 4369], [4317, 4368, 4370], [4369, 4371], [4370, 4372, 4432], [4371, 4373], [4318, 4372, 4374], [4373, 4375], [4374, 4376, 4433], [4375, 4377], [4319, 4376, 4378], [4377, 4379], [4378, 4380, 4434], [4379, 4381], [4320, 4380, 4382], [4381, 4383], [4382, 4384, 4435], [4383, 4385], [4321, 4384, 4386], [4385, 4387], [4386, 4388, 4436], [4387, 4389], [4322, 4388, 4390], [4389, 4391], [4390, 4392, 4437], [4391, 4393], [4323, 4392, 4394], [4393, 4395], [4394, 4396, 4438], [4395, 4397], [4324, 4396, 4398], [4397, 4399], [4398, 4400, 4439], [4399, 4401], [4325, 4400, 4402], [4401, 4403], [4402, 4404, 4440], [4403, 4405], [4326, 4404, 4406], [4405, 4407], [4406, 4408, 4441], [4407, 4409], [4327, 4408, 4410], [4409, 4411], [4410, 4412, 4442], [4411, 4413], [4328, 4412, 4414], [4413, 4415], [4414, 4416, 4443], [4415, 4417], [4329, 4416, 4418], [4417, 4419], [4418, 4420, 4444], [4419, 4421], [4330, 4420], [4331, 4445], [4335, 4449], [4339, 4453], [4343, 4457], [4347, 4461], [4351, 4465], [4355, 4469], [4359, 4473], [4363, 4477], [4367, 4481], [4371, 4485], [4375, 4489], [4379, 4493], [4383, 4497], [4387, 4501], [4391, 4505], [4395, 4509], [4399, 4513], [4403, 4517], [4407, 4521], [4411, 4525], [4415, 4529], [4419, 4533], [4422, 4446], [4445, 4447], [4446, 4448, 4536], [4447, 4449], [4423, 4448, 4450], [4449, 4451], [4450, 4452, 4537], [4451, 4453], [4424, 4452, 4454], [4453, 4455], [4454, 4456, 4538], [4455, 4457], [4425, 4456, 4458], [4457, 4459], [4458, 4460, 4539], [4459, 4461], [4426, 4460, 4462], [4461, 4463], [4462, 4464, 4540], [4463, 4465], [4427, 4464, 4466], [4465, 4467], [4466, 4468, 4541], [4467, 4469], [4428, 4468, 4470], [4469, 4471], [4470, 4472, 4542], [4471, 4473], [4429, 4472, 4474], [4473, 4475], [4474, 4476, 4543], [4475, 4477], [4430, 4476, 4478], [4477, 4479], [4478, 4480, 4544], [4479, 4481], [4431, 4480, 4482], [4481, 4483], [4482, 4484, 4545], [4483, 4485], [4432, 4484, 4486], [4485, 4487], [4486, 4488, 4546], [4487, 4489], [4433, 4488, 4490], [4489, 4491], [4490, 4492, 4547], [4491, 4493], [4434, 4492, 4494], [4493, 4495], [4494, 4496, 4548], [4495, 4497], [4435, 4496, 4498], [4497, 4499], [4498, 4500, 4549], [4499, 4501], [4436, 4500, 4502], [4501, 4503], [4502, 4504, 4550], [4503, 4505], [4437, 4504, 4506], [4505, 4507], [4506, 4508, 4551], [4507, 4509], [4438, 4508, 4510], [4509, 4511], [4510, 4512, 4552], [4511, 4513], [4439, 4512, 4514], [4513, 4515], [4514, 4516, 4553], [4515, 4517], [4440, 4516, 4518], [4517, 4519], [4518, 4520, 4554], [4519, 4521], [4441, 4520, 4522], [4521, 4523], [4522, 4524, 4555], [4523, 4525], [4442, 4524, 4526], [4525, 4527], [4526, 4528, 4556], [4527, 4529], [4443, 4528, 4530], [4529, 4531], [4530, 4532, 4557], [4531, 4533], [4444, 4532, 4534], [4533, 4535], [4534, 4558], [4447, 4561], [4451, 4565], [4455, 4569], [4459, 4573], [4463, 4577], [4467, 4581], [4471, 4585], [4475, 4589], [4479, 4593], [4483, 4597], [4487, 4601], [4491, 4605], [4495, 4609], [4499, 4613], [4503, 4617], [4507, 4621], [4511, 4625], [4515, 4629], [4519, 4633], [4523, 4637], [4527, 4641], [4531, 4645], [4535, 4649], [4560, 4650], [4559, 4561], [4536, 4560, 4562], [4561, 4563], [4562, 4564, 4651], [4563, 4565], [4537, 4564, 4566], [4565, 4567], [4566, 4568, 4652], [4567, 4569], [4538, 4568, 4570], [4569, 4571], [4570, 4572, 4653], [4571, 4573], [4539, 4572, 4574], [4573, 4575], [4574, 4576, 4654], [4575, 4577], [4540, 4576, 4578], [4577, 4579], [4578, 4580, 4655], [4579, 4581], [4541, 4580, 4582], [4581, 4583], [4582, 4584, 4656], [4583, 4585], [4542, 4584, 4586], [4585, 4587], [4586, 4588, 4657], [4587, 4589], [4543, 4588, 4590], [4589, 4591], [4590, 4592, 4658], [4591, 4593], [4544, 4592, 4594], [4593, 4595], [4594, 4596, 4659], [4595, 4597], [4545, 4596, 4598], [4597, 4599], [4598, 4600, 4660], [4599, 4601], [4546, 4600, 4602], [4601, 4603], [4602, 4604, 4661], [4603, 4605], [4547, 4604, 4606], [4605, 4607], [4606, 4608, 4662], [4607, 4609], [4548, 4608, 4610], [4609, 4611], [4610, 4612, 4663], [4611, 4613], [4549, 4612, 4614], [4613, 4615], [4614, 4616, 4664], [4615, 4617], [4550, 4616, 4618], [4617, 4619], [4618, 4620, 4665], [4619, 4621], [4551, 4620, 4622], [4621, 4623], [4622, 4624, 4666], [4623, 4625], [4552, 4624, 4626], [4625, 4627], [4626, 4628, 4667], [4627, 4629], [4553, 4628, 4630], [4629, 4631], [4630, 4632, 4668], [4631, 4633], [4554, 4632, 4634], [4633, 4635], [4634, 4636, 4669], [4635, 4637], [4555, 4636, 4638], [4637, 4639], [4638, 4640, 4670], [4639, 4641], [4556, 4640, 4642], [4641, 4643], [4642, 4644, 4671], [4643, 4645], [4557, 4644, 4646], [4645, 4647], [4646, 4648, 4672], [4647, 4649], [4558, 4648], [4559, 4673], [4563, 4677], [4567, 4681], [4571, 4685], [4575, 4689], [4579, 4693], [4583, 4697], [4587, 4701], [4591, 4705], [4595, 4709], [4599, 4713], [4603, 4717], [4607, 4721], [4611, 4725], [4615, 4729], [4619, 4733], [4623, 4737], [4627, 4741], [4631, 4745], [4635, 4749], [4639, 4753], [4643, 4757], [4647, 4761], [4650, 4674], [4673, 4675], [4674, 4676, 4764], [4675, 4677], [4651, 4676, 4678], [4677, 4679], [4678, 4680, 4765], [4679, 4681], [4652, 4680, 4682], [4681, 4683], [4682, 4684, 4766], [4683, 4685], [4653, 4684, 4686], [4685, 4687], [4686, 4688, 4767], [4687, 4689], [4654, 4688, 4690], [4689, 4691], [4690, 4692, 4768], [4691, 4693], [4655, 4692, 4694], [4693, 4695], [4694, 4696, 4769], [4695, 4697], [4656, 4696, 4698], [4697, 4699], [4698, 4700, 4770], [4699, 4701], [4657, 4700, 4702], [4701, 4703], [4702, 4704, 4771], [4703, 4705], [4658, 4704, 4706], [4705, 4707], [4706, 4708, 4772], [4707, 4709], [4659, 4708, 4710], [4709, 4711], [4710, 4712, 4773], [4711, 4713], [4660, 4712, 4714], [4713, 4715], [4714, 4716, 4774], [4715, 4717], [4661, 4716, 4718], [4717, 4719], [4718, 4720, 4775], [4719, 4721], [4662, 4720, 4722], [4721, 4723], [4722, 4724, 4776], [4723, 4725], [4663, 4724, 4726], [4725, 4727], [4726, 4728, 4777], [4727, 4729], [4664, 4728, 4730], [4729, 4731], [4730, 4732, 4778], [4731, 4733], [4665, 4732, 4734], [4733, 4735], [4734, 4736, 4779], [4735, 4737], [4666, 4736, 4738], [4737, 4739], [4738, 4740, 4780], [4739, 4741], [4667, 4740, 4742], [4741, 4743], [4742, 4744, 4781], [4743, 4745], [4668, 4744, 4746], [4745, 4747], [4746, 4748, 4782], [4747, 4749], [4669, 4748, 4750], [4749, 4751], [4750, 4752, 4783], [4751, 4753], [4670, 4752, 4754], [4753, 4755], [4754, 4756, 4784], [4755, 4757], [4671, 4756, 4758], [4757, 4759], [4758, 4760, 4785], [4759, 4761], [4672, 4760, 4762], [4761, 4763], [4762, 4786], [4675, 4789], [4679, 4793], [4683, 4797], [4687, 4801], [4691, 4805], [4695, 4809], [4699, 4813], [4703, 4817], [4707, 4821], [4711, 4825], [4715, 4829], [4719, 4833], [4723, 4837], [4727, 4841], [4731, 4845], [4735, 4849], [4739, 4853], [4743, 4857], [4747, 4861], [4751, 4865], [4755, 4869], [4759, 4873], [4763, 4877], [4788, 4878], [4787, 4789], [4764, 4788, 4790], [4789, 4791], [4790, 4792, 4879], [4791, 4793], [4765, 4792, 4794], [4793, 4795], [4794, 4796, 4880], [4795, 4797], [4766, 4796, 4798], [4797, 4799], [4798, 4800, 4881], [4799, 4801], [4767, 4800, 4802], [4801, 4803], [4802, 4804, 4882], [4803, 4805], [4768, 4804, 4806], [4805, 4807], [4806, 4808, 4883], [4807, 4809], [4769, 4808, 4810], [4809, 4811], [4810, 4812, 4884], [4811, 4813], [4770, 4812, 4814], [4813, 4815], [4814, 4816, 4885], [4815, 4817], [4771, 4816, 4818], [4817, 4819], [4818, 4820, 4886], [4819, 4821], [4772, 4820, 4822], [4821, 4823], [4822, 4824, 4887], [4823, 4825], [4773, 4824, 4826], [4825, 4827], [4826, 4828, 4888], [4827, 4829], [4774, 4828, 4830], [4829, 4831], [4830, 4832, 4889], [4831, 4833], [4775, 4832, 4834], [4833, 4835], [4834, 4836, 4890], [4835, 4837], [4776, 4836, 4838], [4837, 4839], [4838, 4840, 4891], [4839, 4841], [4777, 4840, 4842], [4841, 4843], [4842, 4844, 4892], [4843, 4845], [4778, 4844, 4846], [4845, 4847], [4846, 4848, 4893], [4847, 4849], [4779, 4848, 4850], [4849, 4851], [4850, 4852, 4894], [4851, 4853], [4780, 4852, 4854], [4853, 4855], [4854, 4856, 4895], [4855, 4857], [4781, 4856, 4858], [4857, 4859], [4858, 4860, 4896], [4859, 4861], [4782, 4860, 4862], [4861, 4863], [4862, 4864, 4897], [4863, 4865], [4783, 4864, 4866], [4865, 4867], [4866, 4868, 4898], [4867, 4869], [4784, 4868, 4870], [4869, 4871], [4870, 4872, 4899], [4871, 4873], [4785, 4872, 4874], [4873, 4875], [4874, 4876, 4900], [4875, 4877], [4786, 4876], [4787, 4901], [4791, 4905], [4795, 4909], [4799, 4913], [4803, 4917], [4807, 4921], [4811, 4925], [4815, 4929], [4819, 4933], [4823, 4937], [4827, 4941], [4831, 4945], [4835, 4949], [4839, 4953], [4843, 4957], [4847, 4961], [4851, 4965], [4855, 4969], [4859, 4973], [4863, 4977], [4867, 4981], [4871, 4985], [4875, 4989], [4878, 4902], [4901, 4903], [4902, 4904, 4992], [4903, 4905], [4879, 4904, 4906], [4905, 4907], [4906, 4908, 4993], [4907, 4909], [4880, 4908, 4910], [4909, 4911], [4910, 4912, 4994], [4911, 4913], [4881, 4912, 4914], [4913, 4915], [4914, 4916, 4995], [4915, 4917], [4882, 4916, 4918], [4917, 4919], [4918, 4920, 4996], [4919, 4921], [4883, 4920, 4922], [4921, 4923], [4922, 4924, 4997], [4923, 4925], [4884, 4924, 4926], [4925, 4927], [4926, 4928, 4998], [4927, 4929], [4885, 4928, 4930], [4929, 4931], [4930, 4932, 4999], [4931, 4933], [4886, 4932, 4934], [4933, 4935], [4934, 4936, 5000], [4935, 4937], [4887, 4936, 4938], [4937, 4939], [4938, 4940, 5001], [4939, 4941], [4888, 4940, 4942], [4941, 4943], [4942, 4944, 5002], [4943, 4945], [4889, 4944, 4946], [4945, 4947], [4946, 4948, 5003], [4947, 4949], [4890, 4948, 4950], [4949, 4951], [4950, 4952, 5004], [4951, 4953], [4891, 4952, 4954], [4953, 4955], [4954, 4956, 5005], [4955, 4957], [4892, 4956, 4958], [4957, 4959], [4958, 4960, 5006], [4959, 4961], [4893, 4960, 4962], [4961, 4963], [4962, 4964, 5007], [4963, 4965], [4894, 4964, 4966], [4965, 4967], [4966, 4968, 5008], [4967, 4969], [4895, 4968, 4970], [4969, 4971], [4970, 4972, 5009], [4971, 4973], [4896, 4972, 4974], [4973, 4975], [4974, 4976, 5010], [4975, 4977], [4897, 4976, 4978], [4977, 4979], [4978, 4980, 5011], [4979, 4981], [4898, 4980, 4982], [4981, 4983], [4982, 4984, 5012], [4983, 4985], [4899, 4984, 4986], [4985, 4987], [4986, 4988, 5013], [4987, 4989], [4900, 4988, 4990], [4989, 4991], [4990, 5014], [4903, 5016], [4907, 5020], [4911, 5024], [4915, 5028], [4919, 5032], [4923, 5036], [4927, 5040], [4931, 5044], [4935, 5048], [4939, 5052], [4943, 5056], [4947, 5060], [4951, 5064], [4955, 5068], [4959, 5072], [4963, 5076], [4967, 5080], [4971, 5084], [4975, 5088], [4979, 5092], [4983, 5096], [4987, 5100], [4991, 5104], [5016], [4992, 5015, 5017], [5016, 5018], [5017, 5019], [5018, 5020], [4993, 5019, 5021], [5020, 5022], [5021, 5023], [5022, 5024], [4994, 5023, 5025], [5024, 5026], [5025, 5027], [5026, 5028], [4995, 5027, 5029], [5028, 5030], [5029, 5031], [5030, 5032], [4996, 5031, 5033], [5032, 5034], [5033, 5035], [5034, 5036], [4997, 5035, 5037], [5036, 5038], [5037, 5039], [5038, 5040], [4998, 5039, 5041], [5040, 5042], [5041, 5043], [5042, 5044], [4999, 5043, 5045], [5044, 5046], [5045, 5047], [5046, 5048], [5000, 5047, 5049], [5048, 5050], [5049, 5051], [5050, 5052], [5001, 5051, 5053], [5052, 5054], [5053, 5055], [5054, 5056], [5002, 5055, 5057], [5056, 5058], [5057, 5059], [5058, 5060], [5003, 5059, 5061], [5060, 5062], [5061, 5063], [5062, 5064], [5004, 5063, 5065], [5064, 5066], [5065, 5067], [5066, 5068], [5005, 5067, 5069], [5068, 5070], [5069, 5071], [5070, 5072], [5006, 5071, 5073], [5072, 5074], [5073, 5075], [5074, 5076], [5007, 5075, 5077], [5076, 5078], [5077, 5079], [5078, 5080], [5008, 5079, 5081], [5080, 5082], [5081, 5083], [5082, 5084], [5009, 5083, 5085], [5084, 5086], [5085, 5087], [5086, 5088], [5010, 5087, 5089], [5088, 5090], [5089, 5091], [5090, 5092], [5011, 5091, 5093], [5092, 5094], [5093, 5095], [5094, 5096], [5012, 5095, 5097], [5096, 5098], [5097, 5099], [5098, 5100], [5013, 5099, 5101], [5100, 5102], [5101, 5103], [5102, 5104], [5014, 5103]] +CNOTERROR: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] +CNOTTIME: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] diff --git a/benchmark/topology/topo_7073.layout b/benchmark/topology/topo_7073.layout index fa17859db..c4531ef99 100644 --- a/benchmark/topology/topo_7073.layout +++ b/benchmark/topology/topo_7073.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1, 106], [0, 2], [1, 3], [2, 4], [3, 5, 107], [4, 6], [5, 7], [6, 8], [7, 9, 108], [8, 10], [9, 11], [10, 12], [11, 13, 109], [12, 14], [13, 15], [14, 16], [15, 17, 110], [16, 18], [17, 19], [18, 20], [19, 21, 111], [20, 22], [21, 23], [22, 24], [23, 25, 112], [24, 26], [25, 27], [26, 28], [27, 29, 113], [28, 30], [29, 31], [30, 32], [31, 33, 114], [32, 34], [33, 35], [34, 36], [35, 37, 115], [36, 38], [37, 39], [38, 40], [39, 41, 116], [40, 42], [41, 43], [42, 44], [43, 45, 117], [44, 46], [45, 47], [46, 48], [47, 49, 118], [48, 50], [49, 51], [50, 52], [51, 53, 119], [52, 54], [53, 55], [54, 56], [55, 57, 120], [56, 58], [57, 59], [58, 60], [59, 61, 121], [60, 62], [61, 63], [62, 64], [63, 65, 122], [64, 66], [65, 67], [66, 68], [67, 69, 123], [68, 70], [69, 71], [70, 72], [71, 73, 124], [72, 74], [73, 75], [74, 76], [75, 77, 125], [76, 78], [77, 79], [78, 80], [79, 81, 126], [80, 82], [81, 83], [82, 84], [83, 85, 127], [84, 86], [85, 87], [86, 88], [87, 89, 128], [88, 90], [89, 91], [90, 92], [91, 93, 129], [92, 94], [93, 95], [94, 96], [95, 97, 130], [96, 98], [97, 99], [98, 100], [99, 101, 131], [100, 102], [101, 103], [102, 104], [103, 105, 132], [104], [0, 133], [4, 137], [8, 141], [12, 145], [16, 149], [20, 153], [24, 157], [28, 161], [32, 165], [36, 169], [40, 173], [44, 177], [48, 181], [52, 185], [56, 189], [60, 193], [64, 197], [68, 201], [72, 205], [76, 209], [80, 213], [84, 217], [88, 221], [92, 225], [96, 229], [100, 233], [104, 237], [106, 134], [133, 135], [134, 136, 240], [135, 137], [107, 136, 138], [137, 139], [138, 140, 241], [139, 141], [108, 140, 142], [141, 143], [142, 144, 242], [143, 145], [109, 144, 146], [145, 147], [146, 148, 243], [147, 149], [110, 148, 150], [149, 151], [150, 152, 244], [151, 153], [111, 152, 154], [153, 155], [154, 156, 245], [155, 157], [112, 156, 158], [157, 159], [158, 160, 246], [159, 161], [113, 160, 162], [161, 163], [162, 164, 247], [163, 165], [114, 164, 166], [165, 167], [166, 168, 248], [167, 169], [115, 168, 170], [169, 171], [170, 172, 249], [171, 173], [116, 172, 174], [173, 175], [174, 176, 250], [175, 177], [117, 176, 178], [177, 179], [178, 180, 251], [179, 181], [118, 180, 182], [181, 183], [182, 184, 252], [183, 185], [119, 184, 186], [185, 187], [186, 188, 253], [187, 189], [120, 188, 190], [189, 191], [190, 192, 254], [191, 193], [121, 192, 194], [193, 195], [194, 196, 255], [195, 197], [122, 196, 198], [197, 199], [198, 200, 256], [199, 201], [123, 200, 202], [201, 203], [202, 204, 257], [203, 205], [124, 204, 206], [205, 207], [206, 208, 258], [207, 209], [125, 208, 210], [209, 211], [210, 212, 259], [211, 213], [126, 212, 214], [213, 215], [214, 216, 260], [215, 217], [127, 216, 218], [217, 219], [218, 220, 261], [219, 221], [128, 220, 222], [221, 223], [222, 224, 262], [223, 225], [129, 224, 226], [225, 227], [226, 228, 263], [227, 229], [130, 228, 230], [229, 231], [230, 232, 264], [231, 233], [131, 232, 234], [233, 235], [234, 236, 265], [235, 237], [132, 236, 238], [237, 239], [238, 266], [135, 269], [139, 273], [143, 277], [147, 281], [151, 285], [155, 289], [159, 293], [163, 297], [167, 301], [171, 305], [175, 309], [179, 313], [183, 317], [187, 321], [191, 325], [195, 329], [199, 333], [203, 337], [207, 341], [211, 345], [215, 349], [219, 353], [223, 357], [227, 361], [231, 365], [235, 369], [239, 373], [268, 374], [267, 269], [240, 268, 270], [269, 271], [270, 272, 375], [271, 273], [241, 272, 274], [273, 275], [274, 276, 376], [275, 277], [242, 276, 278], [277, 279], [278, 280, 377], [279, 281], [243, 280, 282], [281, 283], [282, 284, 378], [283, 285], [244, 284, 286], [285, 287], [286, 288, 379], [287, 289], [245, 288, 290], [289, 291], [290, 292, 380], [291, 293], [246, 292, 294], [293, 295], [294, 296, 381], [295, 297], [247, 296, 298], [297, 299], [298, 300, 382], [299, 301], [248, 300, 302], [301, 303], [302, 304, 383], [303, 305], [249, 304, 306], [305, 307], [306, 308, 384], [307, 309], [250, 308, 310], [309, 311], [310, 312, 385], [311, 313], [251, 312, 314], [313, 315], [314, 316, 386], [315, 317], [252, 316, 318], [317, 319], [318, 320, 387], [319, 321], [253, 320, 322], [321, 323], [322, 324, 388], [323, 325], [254, 324, 326], [325, 327], [326, 328, 389], [327, 329], [255, 328, 330], [329, 331], [330, 332, 390], [331, 333], [256, 332, 334], [333, 335], [334, 336, 391], [335, 337], [257, 336, 338], [337, 339], [338, 340, 392], [339, 341], [258, 340, 342], [341, 343], [342, 344, 393], [343, 345], [259, 344, 346], [345, 347], [346, 348, 394], [347, 349], [260, 348, 350], [349, 351], [350, 352, 395], [351, 353], [261, 352, 354], [353, 355], [354, 356, 396], [355, 357], [262, 356, 358], [357, 359], [358, 360, 397], [359, 361], [263, 360, 362], [361, 363], [362, 364, 398], [363, 365], [264, 364, 366], [365, 367], [366, 368, 399], [367, 369], [265, 368, 370], [369, 371], [370, 372, 400], [371, 373], [266, 372], [267, 401], [271, 405], [275, 409], [279, 413], [283, 417], [287, 421], [291, 425], [295, 429], [299, 433], [303, 437], [307, 441], [311, 445], [315, 449], [319, 453], [323, 457], [327, 461], [331, 465], [335, 469], [339, 473], [343, 477], [347, 481], [351, 485], [355, 489], [359, 493], [363, 497], [367, 501], [371, 505], [374, 402], [401, 403], [402, 404, 508], [403, 405], [375, 404, 406], [405, 407], [406, 408, 509], [407, 409], [376, 408, 410], [409, 411], [410, 412, 510], [411, 413], [377, 412, 414], [413, 415], [414, 416, 511], [415, 417], [378, 416, 418], [417, 419], [418, 420, 512], [419, 421], [379, 420, 422], [421, 423], [422, 424, 513], [423, 425], [380, 424, 426], [425, 427], [426, 428, 514], [427, 429], [381, 428, 430], [429, 431], [430, 432, 515], [431, 433], [382, 432, 434], [433, 435], [434, 436, 516], [435, 437], [383, 436, 438], [437, 439], [438, 440, 517], [439, 441], [384, 440, 442], [441, 443], [442, 444, 518], [443, 445], [385, 444, 446], [445, 447], [446, 448, 519], [447, 449], [386, 448, 450], [449, 451], [450, 452, 520], [451, 453], [387, 452, 454], [453, 455], [454, 456, 521], [455, 457], [388, 456, 458], [457, 459], [458, 460, 522], [459, 461], [389, 460, 462], [461, 463], [462, 464, 523], [463, 465], [390, 464, 466], [465, 467], [466, 468, 524], [467, 469], [391, 468, 470], [469, 471], [470, 472, 525], [471, 473], [392, 472, 474], [473, 475], [474, 476, 526], [475, 477], [393, 476, 478], [477, 479], [478, 480, 527], [479, 481], [394, 480, 482], [481, 483], [482, 484, 528], [483, 485], [395, 484, 486], [485, 487], [486, 488, 529], [487, 489], [396, 488, 490], [489, 491], [490, 492, 530], [491, 493], [397, 492, 494], [493, 495], [494, 496, 531], [495, 497], [398, 496, 498], [497, 499], [498, 500, 532], [499, 501], [399, 500, 502], [501, 503], [502, 504, 533], [503, 505], [400, 504, 506], [505, 507], [506, 534], [403, 537], [407, 541], [411, 545], [415, 549], [419, 553], [423, 557], [427, 561], [431, 565], [435, 569], [439, 573], [443, 577], [447, 581], [451, 585], [455, 589], [459, 593], [463, 597], [467, 601], [471, 605], [475, 609], [479, 613], [483, 617], [487, 621], [491, 625], [495, 629], [499, 633], [503, 637], [507, 641], [536, 642], [535, 537], [508, 536, 538], [537, 539], [538, 540, 643], [539, 541], [509, 540, 542], [541, 543], [542, 544, 644], [543, 545], [510, 544, 546], [545, 547], [546, 548, 645], [547, 549], [511, 548, 550], [549, 551], [550, 552, 646], [551, 553], [512, 552, 554], [553, 555], [554, 556, 647], [555, 557], [513, 556, 558], [557, 559], [558, 560, 648], [559, 561], [514, 560, 562], [561, 563], [562, 564, 649], [563, 565], [515, 564, 566], [565, 567], [566, 568, 650], [567, 569], [516, 568, 570], [569, 571], [570, 572, 651], [571, 573], [517, 572, 574], [573, 575], [574, 576, 652], [575, 577], [518, 576, 578], [577, 579], [578, 580, 653], [579, 581], [519, 580, 582], [581, 583], [582, 584, 654], [583, 585], [520, 584, 586], [585, 587], [586, 588, 655], [587, 589], [521, 588, 590], [589, 591], [590, 592, 656], [591, 593], [522, 592, 594], [593, 595], [594, 596, 657], [595, 597], [523, 596, 598], [597, 599], [598, 600, 658], [599, 601], [524, 600, 602], [601, 603], [602, 604, 659], [603, 605], [525, 604, 606], [605, 607], [606, 608, 660], [607, 609], [526, 608, 610], [609, 611], [610, 612, 661], [611, 613], [527, 612, 614], [613, 615], [614, 616, 662], [615, 617], [528, 616, 618], [617, 619], [618, 620, 663], [619, 621], [529, 620, 622], [621, 623], [622, 624, 664], [623, 625], [530, 624, 626], [625, 627], [626, 628, 665], [627, 629], [531, 628, 630], [629, 631], [630, 632, 666], [631, 633], [532, 632, 634], [633, 635], [634, 636, 667], [635, 637], [533, 636, 638], [637, 639], [638, 640, 668], [639, 641], [534, 640], [535, 669], [539, 673], [543, 677], [547, 681], [551, 685], [555, 689], [559, 693], [563, 697], [567, 701], [571, 705], [575, 709], [579, 713], [583, 717], [587, 721], [591, 725], [595, 729], [599, 733], [603, 737], [607, 741], [611, 745], [615, 749], [619, 753], [623, 757], [627, 761], [631, 765], [635, 769], [639, 773], [642, 670], [669, 671], [670, 672, 776], [671, 673], [643, 672, 674], [673, 675], [674, 676, 777], [675, 677], [644, 676, 678], [677, 679], [678, 680, 778], [679, 681], [645, 680, 682], [681, 683], [682, 684, 779], [683, 685], [646, 684, 686], [685, 687], [686, 688, 780], [687, 689], [647, 688, 690], [689, 691], [690, 692, 781], [691, 693], [648, 692, 694], [693, 695], [694, 696, 782], [695, 697], [649, 696, 698], [697, 699], [698, 700, 783], [699, 701], [650, 700, 702], [701, 703], [702, 704, 784], [703, 705], [651, 704, 706], [705, 707], [706, 708, 785], [707, 709], [652, 708, 710], [709, 711], [710, 712, 786], [711, 713], [653, 712, 714], [713, 715], [714, 716, 787], [715, 717], [654, 716, 718], [717, 719], [718, 720, 788], [719, 721], [655, 720, 722], [721, 723], [722, 724, 789], [723, 725], [656, 724, 726], [725, 727], [726, 728, 790], [727, 729], [657, 728, 730], [729, 731], [730, 732, 791], [731, 733], [658, 732, 734], [733, 735], [734, 736, 792], [735, 737], [659, 736, 738], [737, 739], [738, 740, 793], [739, 741], [660, 740, 742], [741, 743], [742, 744, 794], [743, 745], [661, 744, 746], [745, 747], [746, 748, 795], [747, 749], [662, 748, 750], [749, 751], [750, 752, 796], [751, 753], [663, 752, 754], [753, 755], [754, 756, 797], [755, 757], [664, 756, 758], [757, 759], [758, 760, 798], [759, 761], [665, 760, 762], [761, 763], [762, 764, 799], [763, 765], [666, 764, 766], [765, 767], [766, 768, 800], [767, 769], [667, 768, 770], [769, 771], [770, 772, 801], [771, 773], [668, 772, 774], [773, 775], [774, 802], [671, 805], [675, 809], [679, 813], [683, 817], [687, 821], [691, 825], [695, 829], [699, 833], [703, 837], [707, 841], [711, 845], [715, 849], [719, 853], [723, 857], [727, 861], [731, 865], [735, 869], [739, 873], [743, 877], [747, 881], [751, 885], [755, 889], [759, 893], [763, 897], [767, 901], [771, 905], [775, 909], [804, 910], [803, 805], [776, 804, 806], [805, 807], [806, 808, 911], [807, 809], [777, 808, 810], [809, 811], [810, 812, 912], [811, 813], [778, 812, 814], [813, 815], [814, 816, 913], [815, 817], [779, 816, 818], [817, 819], [818, 820, 914], [819, 821], [780, 820, 822], [821, 823], [822, 824, 915], [823, 825], [781, 824, 826], [825, 827], [826, 828, 916], [827, 829], [782, 828, 830], [829, 831], [830, 832, 917], [831, 833], [783, 832, 834], [833, 835], [834, 836, 918], [835, 837], [784, 836, 838], [837, 839], [838, 840, 919], [839, 841], [785, 840, 842], [841, 843], [842, 844, 920], [843, 845], [786, 844, 846], [845, 847], [846, 848, 921], [847, 849], [787, 848, 850], [849, 851], [850, 852, 922], [851, 853], [788, 852, 854], [853, 855], [854, 856, 923], [855, 857], [789, 856, 858], [857, 859], [858, 860, 924], [859, 861], [790, 860, 862], [861, 863], [862, 864, 925], [863, 865], [791, 864, 866], [865, 867], [866, 868, 926], [867, 869], [792, 868, 870], [869, 871], [870, 872, 927], [871, 873], [793, 872, 874], [873, 875], [874, 876, 928], [875, 877], [794, 876, 878], [877, 879], [878, 880, 929], [879, 881], [795, 880, 882], [881, 883], [882, 884, 930], [883, 885], [796, 884, 886], [885, 887], [886, 888, 931], [887, 889], [797, 888, 890], [889, 891], [890, 892, 932], [891, 893], [798, 892, 894], [893, 895], [894, 896, 933], [895, 897], [799, 896, 898], [897, 899], [898, 900, 934], [899, 901], [800, 900, 902], [901, 903], [902, 904, 935], [903, 905], [801, 904, 906], [905, 907], [906, 908, 936], [907, 909], [802, 908], [803, 937], [807, 941], [811, 945], [815, 949], [819, 953], [823, 957], [827, 961], [831, 965], [835, 969], [839, 973], [843, 977], [847, 981], [851, 985], [855, 989], [859, 993], [863, 997], [867, 1001], [871, 1005], [875, 1009], [879, 1013], [883, 1017], [887, 1021], [891, 1025], [895, 1029], [899, 1033], [903, 1037], [907, 1041], [910, 938], [937, 939], [938, 940, 1044], [939, 941], [911, 940, 942], [941, 943], [942, 944, 1045], [943, 945], [912, 944, 946], [945, 947], [946, 948, 1046], [947, 949], [913, 948, 950], [949, 951], [950, 952, 1047], [951, 953], [914, 952, 954], [953, 955], [954, 956, 1048], [955, 957], [915, 956, 958], [957, 959], [958, 960, 1049], [959, 961], [916, 960, 962], [961, 963], [962, 964, 1050], [963, 965], [917, 964, 966], [965, 967], [966, 968, 1051], [967, 969], [918, 968, 970], [969, 971], [970, 972, 1052], [971, 973], [919, 972, 974], [973, 975], [974, 976, 1053], [975, 977], [920, 976, 978], [977, 979], [978, 980, 1054], [979, 981], [921, 980, 982], [981, 983], [982, 984, 1055], [983, 985], [922, 984, 986], [985, 987], [986, 988, 1056], [987, 989], [923, 988, 990], [989, 991], [990, 992, 1057], [991, 993], [924, 992, 994], [993, 995], [994, 996, 1058], [995, 997], [925, 996, 998], [997, 999], [998, 1000, 1059], [999, 1001], [926, 1000, 1002], [1001, 1003], [1002, 1004, 1060], [1003, 1005], [927, 1004, 1006], [1005, 1007], [1006, 1008, 1061], [1007, 1009], [928, 1008, 1010], [1009, 1011], [1010, 1012, 1062], [1011, 1013], [929, 1012, 1014], [1013, 1015], [1014, 1016, 1063], [1015, 1017], [930, 1016, 1018], [1017, 1019], [1018, 1020, 1064], [1019, 1021], [931, 1020, 1022], [1021, 1023], [1022, 1024, 1065], [1023, 1025], [932, 1024, 1026], [1025, 1027], [1026, 1028, 1066], [1027, 1029], [933, 1028, 1030], [1029, 1031], [1030, 1032, 1067], [1031, 1033], [934, 1032, 1034], [1033, 1035], [1034, 1036, 1068], [1035, 1037], [935, 1036, 1038], [1037, 1039], [1038, 1040, 1069], [1039, 1041], [936, 1040, 1042], [1041, 1043], [1042, 1070], [939, 1073], [943, 1077], [947, 1081], [951, 1085], [955, 1089], [959, 1093], [963, 1097], [967, 1101], [971, 1105], [975, 1109], [979, 1113], [983, 1117], [987, 1121], [991, 1125], [995, 1129], [999, 1133], [1003, 1137], [1007, 1141], [1011, 1145], [1015, 1149], [1019, 1153], [1023, 1157], [1027, 1161], [1031, 1165], [1035, 1169], [1039, 1173], [1043, 1177], [1072, 1178], [1071, 1073], [1044, 1072, 1074], [1073, 1075], [1074, 1076, 1179], [1075, 1077], [1045, 1076, 1078], [1077, 1079], [1078, 1080, 1180], [1079, 1081], [1046, 1080, 1082], [1081, 1083], [1082, 1084, 1181], [1083, 1085], [1047, 1084, 1086], [1085, 1087], [1086, 1088, 1182], [1087, 1089], [1048, 1088, 1090], [1089, 1091], [1090, 1092, 1183], [1091, 1093], [1049, 1092, 1094], [1093, 1095], [1094, 1096, 1184], [1095, 1097], [1050, 1096, 1098], [1097, 1099], [1098, 1100, 1185], [1099, 1101], [1051, 1100, 1102], [1101, 1103], [1102, 1104, 1186], [1103, 1105], [1052, 1104, 1106], [1105, 1107], [1106, 1108, 1187], [1107, 1109], [1053, 1108, 1110], [1109, 1111], [1110, 1112, 1188], [1111, 1113], [1054, 1112, 1114], [1113, 1115], [1114, 1116, 1189], [1115, 1117], [1055, 1116, 1118], [1117, 1119], [1118, 1120, 1190], [1119, 1121], [1056, 1120, 1122], [1121, 1123], [1122, 1124, 1191], [1123, 1125], [1057, 1124, 1126], [1125, 1127], [1126, 1128, 1192], [1127, 1129], [1058, 1128, 1130], [1129, 1131], [1130, 1132, 1193], [1131, 1133], [1059, 1132, 1134], [1133, 1135], [1134, 1136, 1194], [1135, 1137], [1060, 1136, 1138], [1137, 1139], [1138, 1140, 1195], [1139, 1141], [1061, 1140, 1142], [1141, 1143], [1142, 1144, 1196], [1143, 1145], [1062, 1144, 1146], [1145, 1147], [1146, 1148, 1197], [1147, 1149], [1063, 1148, 1150], [1149, 1151], [1150, 1152, 1198], [1151, 1153], [1064, 1152, 1154], [1153, 1155], [1154, 1156, 1199], [1155, 1157], [1065, 1156, 1158], [1157, 1159], [1158, 1160, 1200], [1159, 1161], [1066, 1160, 1162], [1161, 1163], [1162, 1164, 1201], [1163, 1165], [1067, 1164, 1166], [1165, 1167], [1166, 1168, 1202], [1167, 1169], [1068, 1168, 1170], [1169, 1171], [1170, 1172, 1203], [1171, 1173], [1069, 1172, 1174], [1173, 1175], [1174, 1176, 1204], [1175, 1177], [1070, 1176], [1071, 1205], [1075, 1209], [1079, 1213], [1083, 1217], [1087, 1221], [1091, 1225], [1095, 1229], [1099, 1233], [1103, 1237], [1107, 1241], [1111, 1245], [1115, 1249], [1119, 1253], [1123, 1257], [1127, 1261], [1131, 1265], [1135, 1269], [1139, 1273], [1143, 1277], [1147, 1281], [1151, 1285], [1155, 1289], [1159, 1293], [1163, 1297], [1167, 1301], [1171, 1305], [1175, 1309], [1178, 1206], [1205, 1207], [1206, 1208, 1312], [1207, 1209], [1179, 1208, 1210], [1209, 1211], [1210, 1212, 1313], [1211, 1213], [1180, 1212, 1214], [1213, 1215], [1214, 1216, 1314], [1215, 1217], [1181, 1216, 1218], [1217, 1219], [1218, 1220, 1315], [1219, 1221], [1182, 1220, 1222], [1221, 1223], [1222, 1224, 1316], [1223, 1225], [1183, 1224, 1226], [1225, 1227], [1226, 1228, 1317], [1227, 1229], [1184, 1228, 1230], [1229, 1231], [1230, 1232, 1318], [1231, 1233], [1185, 1232, 1234], [1233, 1235], [1234, 1236, 1319], [1235, 1237], [1186, 1236, 1238], [1237, 1239], [1238, 1240, 1320], [1239, 1241], [1187, 1240, 1242], [1241, 1243], [1242, 1244, 1321], [1243, 1245], [1188, 1244, 1246], [1245, 1247], [1246, 1248, 1322], [1247, 1249], [1189, 1248, 1250], [1249, 1251], [1250, 1252, 1323], [1251, 1253], [1190, 1252, 1254], [1253, 1255], [1254, 1256, 1324], [1255, 1257], [1191, 1256, 1258], [1257, 1259], [1258, 1260, 1325], [1259, 1261], [1192, 1260, 1262], [1261, 1263], [1262, 1264, 1326], [1263, 1265], [1193, 1264, 1266], [1265, 1267], [1266, 1268, 1327], [1267, 1269], [1194, 1268, 1270], [1269, 1271], [1270, 1272, 1328], [1271, 1273], [1195, 1272, 1274], [1273, 1275], [1274, 1276, 1329], [1275, 1277], [1196, 1276, 1278], [1277, 1279], [1278, 1280, 1330], [1279, 1281], [1197, 1280, 1282], [1281, 1283], [1282, 1284, 1331], [1283, 1285], [1198, 1284, 1286], [1285, 1287], [1286, 1288, 1332], [1287, 1289], [1199, 1288, 1290], [1289, 1291], [1290, 1292, 1333], [1291, 1293], [1200, 1292, 1294], [1293, 1295], [1294, 1296, 1334], [1295, 1297], [1201, 1296, 1298], [1297, 1299], [1298, 1300, 1335], [1299, 1301], [1202, 1300, 1302], [1301, 1303], [1302, 1304, 1336], [1303, 1305], [1203, 1304, 1306], [1305, 1307], [1306, 1308, 1337], [1307, 1309], [1204, 1308, 1310], [1309, 1311], [1310, 1338], [1207, 1341], [1211, 1345], [1215, 1349], [1219, 1353], [1223, 1357], [1227, 1361], [1231, 1365], [1235, 1369], [1239, 1373], [1243, 1377], [1247, 1381], [1251, 1385], [1255, 1389], [1259, 1393], [1263, 1397], [1267, 1401], [1271, 1405], [1275, 1409], [1279, 1413], [1283, 1417], [1287, 1421], [1291, 1425], [1295, 1429], [1299, 1433], [1303, 1437], [1307, 1441], [1311, 1445], [1340, 1446], [1339, 1341], [1312, 1340, 1342], [1341, 1343], [1342, 1344, 1447], [1343, 1345], [1313, 1344, 1346], [1345, 1347], [1346, 1348, 1448], [1347, 1349], [1314, 1348, 1350], [1349, 1351], [1350, 1352, 1449], [1351, 1353], [1315, 1352, 1354], [1353, 1355], [1354, 1356, 1450], [1355, 1357], [1316, 1356, 1358], [1357, 1359], [1358, 1360, 1451], [1359, 1361], [1317, 1360, 1362], [1361, 1363], [1362, 1364, 1452], [1363, 1365], [1318, 1364, 1366], [1365, 1367], [1366, 1368, 1453], [1367, 1369], [1319, 1368, 1370], [1369, 1371], [1370, 1372, 1454], [1371, 1373], [1320, 1372, 1374], [1373, 1375], [1374, 1376, 1455], [1375, 1377], [1321, 1376, 1378], [1377, 1379], [1378, 1380, 1456], [1379, 1381], [1322, 1380, 1382], [1381, 1383], [1382, 1384, 1457], [1383, 1385], [1323, 1384, 1386], [1385, 1387], [1386, 1388, 1458], [1387, 1389], [1324, 1388, 1390], [1389, 1391], [1390, 1392, 1459], [1391, 1393], [1325, 1392, 1394], [1393, 1395], [1394, 1396, 1460], [1395, 1397], [1326, 1396, 1398], [1397, 1399], [1398, 1400, 1461], [1399, 1401], [1327, 1400, 1402], [1401, 1403], [1402, 1404, 1462], [1403, 1405], [1328, 1404, 1406], [1405, 1407], [1406, 1408, 1463], [1407, 1409], [1329, 1408, 1410], [1409, 1411], [1410, 1412, 1464], [1411, 1413], [1330, 1412, 1414], [1413, 1415], [1414, 1416, 1465], [1415, 1417], [1331, 1416, 1418], [1417, 1419], [1418, 1420, 1466], [1419, 1421], [1332, 1420, 1422], [1421, 1423], [1422, 1424, 1467], [1423, 1425], [1333, 1424, 1426], [1425, 1427], [1426, 1428, 1468], [1427, 1429], [1334, 1428, 1430], [1429, 1431], [1430, 1432, 1469], [1431, 1433], [1335, 1432, 1434], [1433, 1435], [1434, 1436, 1470], [1435, 1437], [1336, 1436, 1438], [1437, 1439], [1438, 1440, 1471], [1439, 1441], [1337, 1440, 1442], [1441, 1443], [1442, 1444, 1472], [1443, 1445], [1338, 1444], [1339, 1473], [1343, 1477], [1347, 1481], [1351, 1485], [1355, 1489], [1359, 1493], [1363, 1497], [1367, 1501], [1371, 1505], [1375, 1509], [1379, 1513], [1383, 1517], [1387, 1521], [1391, 1525], [1395, 1529], [1399, 1533], [1403, 1537], [1407, 1541], [1411, 1545], [1415, 1549], [1419, 1553], [1423, 1557], [1427, 1561], [1431, 1565], [1435, 1569], [1439, 1573], [1443, 1577], [1446, 1474], [1473, 1475], [1474, 1476, 1580], [1475, 1477], [1447, 1476, 1478], [1477, 1479], [1478, 1480, 1581], [1479, 1481], [1448, 1480, 1482], [1481, 1483], [1482, 1484, 1582], [1483, 1485], [1449, 1484, 1486], [1485, 1487], [1486, 1488, 1583], [1487, 1489], [1450, 1488, 1490], [1489, 1491], [1490, 1492, 1584], [1491, 1493], [1451, 1492, 1494], [1493, 1495], [1494, 1496, 1585], [1495, 1497], [1452, 1496, 1498], [1497, 1499], [1498, 1500, 1586], [1499, 1501], [1453, 1500, 1502], [1501, 1503], [1502, 1504, 1587], [1503, 1505], [1454, 1504, 1506], [1505, 1507], [1506, 1508, 1588], [1507, 1509], [1455, 1508, 1510], [1509, 1511], [1510, 1512, 1589], [1511, 1513], [1456, 1512, 1514], [1513, 1515], [1514, 1516, 1590], [1515, 1517], [1457, 1516, 1518], [1517, 1519], [1518, 1520, 1591], [1519, 1521], [1458, 1520, 1522], [1521, 1523], [1522, 1524, 1592], [1523, 1525], [1459, 1524, 1526], [1525, 1527], [1526, 1528, 1593], [1527, 1529], [1460, 1528, 1530], [1529, 1531], [1530, 1532, 1594], [1531, 1533], [1461, 1532, 1534], [1533, 1535], [1534, 1536, 1595], [1535, 1537], [1462, 1536, 1538], [1537, 1539], [1538, 1540, 1596], [1539, 1541], [1463, 1540, 1542], [1541, 1543], [1542, 1544, 1597], [1543, 1545], [1464, 1544, 1546], [1545, 1547], [1546, 1548, 1598], [1547, 1549], [1465, 1548, 1550], [1549, 1551], [1550, 1552, 1599], [1551, 1553], [1466, 1552, 1554], [1553, 1555], [1554, 1556, 1600], [1555, 1557], [1467, 1556, 1558], [1557, 1559], [1558, 1560, 1601], [1559, 1561], [1468, 1560, 1562], [1561, 1563], [1562, 1564, 1602], [1563, 1565], [1469, 1564, 1566], [1565, 1567], [1566, 1568, 1603], [1567, 1569], [1470, 1568, 1570], [1569, 1571], [1570, 1572, 1604], [1571, 1573], [1471, 1572, 1574], [1573, 1575], [1574, 1576, 1605], [1575, 1577], [1472, 1576, 1578], [1577, 1579], [1578, 1606], [1475, 1609], [1479, 1613], [1483, 1617], [1487, 1621], [1491, 1625], [1495, 1629], [1499, 1633], [1503, 1637], [1507, 1641], [1511, 1645], [1515, 1649], [1519, 1653], [1523, 1657], [1527, 1661], [1531, 1665], [1535, 1669], [1539, 1673], [1543, 1677], [1547, 1681], [1551, 1685], [1555, 1689], [1559, 1693], [1563, 1697], [1567, 1701], [1571, 1705], [1575, 1709], [1579, 1713], [1608, 1714], [1607, 1609], [1580, 1608, 1610], [1609, 1611], [1610, 1612, 1715], [1611, 1613], [1581, 1612, 1614], [1613, 1615], [1614, 1616, 1716], [1615, 1617], [1582, 1616, 1618], [1617, 1619], [1618, 1620, 1717], [1619, 1621], [1583, 1620, 1622], [1621, 1623], [1622, 1624, 1718], [1623, 1625], [1584, 1624, 1626], [1625, 1627], [1626, 1628, 1719], [1627, 1629], [1585, 1628, 1630], [1629, 1631], [1630, 1632, 1720], [1631, 1633], [1586, 1632, 1634], [1633, 1635], [1634, 1636, 1721], [1635, 1637], [1587, 1636, 1638], [1637, 1639], [1638, 1640, 1722], [1639, 1641], [1588, 1640, 1642], [1641, 1643], [1642, 1644, 1723], [1643, 1645], [1589, 1644, 1646], [1645, 1647], [1646, 1648, 1724], [1647, 1649], [1590, 1648, 1650], [1649, 1651], [1650, 1652, 1725], [1651, 1653], [1591, 1652, 1654], [1653, 1655], [1654, 1656, 1726], [1655, 1657], [1592, 1656, 1658], [1657, 1659], [1658, 1660, 1727], [1659, 1661], [1593, 1660, 1662], [1661, 1663], [1662, 1664, 1728], [1663, 1665], [1594, 1664, 1666], [1665, 1667], [1666, 1668, 1729], [1667, 1669], [1595, 1668, 1670], [1669, 1671], [1670, 1672, 1730], [1671, 1673], [1596, 1672, 1674], [1673, 1675], [1674, 1676, 1731], [1675, 1677], [1597, 1676, 1678], [1677, 1679], [1678, 1680, 1732], [1679, 1681], [1598, 1680, 1682], [1681, 1683], [1682, 1684, 1733], [1683, 1685], [1599, 1684, 1686], [1685, 1687], [1686, 1688, 1734], [1687, 1689], [1600, 1688, 1690], [1689, 1691], [1690, 1692, 1735], [1691, 1693], [1601, 1692, 1694], [1693, 1695], [1694, 1696, 1736], [1695, 1697], [1602, 1696, 1698], [1697, 1699], [1698, 1700, 1737], [1699, 1701], [1603, 1700, 1702], [1701, 1703], [1702, 1704, 1738], [1703, 1705], [1604, 1704, 1706], [1705, 1707], [1706, 1708, 1739], [1707, 1709], [1605, 1708, 1710], [1709, 1711], [1710, 1712, 1740], [1711, 1713], [1606, 1712], [1607, 1741], [1611, 1745], [1615, 1749], [1619, 1753], [1623, 1757], [1627, 1761], [1631, 1765], [1635, 1769], [1639, 1773], [1643, 1777], [1647, 1781], [1651, 1785], [1655, 1789], [1659, 1793], [1663, 1797], [1667, 1801], [1671, 1805], [1675, 1809], [1679, 1813], [1683, 1817], [1687, 1821], [1691, 1825], [1695, 1829], [1699, 1833], [1703, 1837], [1707, 1841], [1711, 1845], [1714, 1742], [1741, 1743], [1742, 1744, 1848], [1743, 1745], [1715, 1744, 1746], [1745, 1747], [1746, 1748, 1849], [1747, 1749], [1716, 1748, 1750], [1749, 1751], [1750, 1752, 1850], [1751, 1753], [1717, 1752, 1754], [1753, 1755], [1754, 1756, 1851], [1755, 1757], [1718, 1756, 1758], [1757, 1759], [1758, 1760, 1852], [1759, 1761], [1719, 1760, 1762], [1761, 1763], [1762, 1764, 1853], [1763, 1765], [1720, 1764, 1766], [1765, 1767], [1766, 1768, 1854], [1767, 1769], [1721, 1768, 1770], [1769, 1771], [1770, 1772, 1855], [1771, 1773], [1722, 1772, 1774], [1773, 1775], [1774, 1776, 1856], [1775, 1777], [1723, 1776, 1778], [1777, 1779], [1778, 1780, 1857], [1779, 1781], [1724, 1780, 1782], [1781, 1783], [1782, 1784, 1858], [1783, 1785], [1725, 1784, 1786], [1785, 1787], [1786, 1788, 1859], [1787, 1789], [1726, 1788, 1790], [1789, 1791], [1790, 1792, 1860], [1791, 1793], [1727, 1792, 1794], [1793, 1795], [1794, 1796, 1861], [1795, 1797], [1728, 1796, 1798], [1797, 1799], [1798, 1800, 1862], [1799, 1801], [1729, 1800, 1802], [1801, 1803], [1802, 1804, 1863], [1803, 1805], [1730, 1804, 1806], [1805, 1807], [1806, 1808, 1864], [1807, 1809], [1731, 1808, 1810], [1809, 1811], [1810, 1812, 1865], [1811, 1813], [1732, 1812, 1814], [1813, 1815], [1814, 1816, 1866], [1815, 1817], [1733, 1816, 1818], [1817, 1819], [1818, 1820, 1867], [1819, 1821], [1734, 1820, 1822], [1821, 1823], [1822, 1824, 1868], [1823, 1825], [1735, 1824, 1826], [1825, 1827], [1826, 1828, 1869], [1827, 1829], [1736, 1828, 1830], [1829, 1831], [1830, 1832, 1870], [1831, 1833], [1737, 1832, 1834], [1833, 1835], [1834, 1836, 1871], [1835, 1837], [1738, 1836, 1838], [1837, 1839], [1838, 1840, 1872], [1839, 1841], [1739, 1840, 1842], [1841, 1843], [1842, 1844, 1873], [1843, 1845], [1740, 1844, 1846], [1845, 1847], [1846, 1874], [1743, 1877], [1747, 1881], [1751, 1885], [1755, 1889], [1759, 1893], [1763, 1897], [1767, 1901], [1771, 1905], [1775, 1909], [1779, 1913], [1783, 1917], [1787, 1921], [1791, 1925], [1795, 1929], [1799, 1933], [1803, 1937], [1807, 1941], [1811, 1945], [1815, 1949], [1819, 1953], [1823, 1957], [1827, 1961], [1831, 1965], [1835, 1969], [1839, 1973], [1843, 1977], [1847, 1981], [1876, 1982], [1875, 1877], [1848, 1876, 1878], [1877, 1879], [1878, 1880, 1983], [1879, 1881], [1849, 1880, 1882], [1881, 1883], [1882, 1884, 1984], [1883, 1885], [1850, 1884, 1886], [1885, 1887], [1886, 1888, 1985], [1887, 1889], [1851, 1888, 1890], [1889, 1891], [1890, 1892, 1986], [1891, 1893], [1852, 1892, 1894], [1893, 1895], [1894, 1896, 1987], [1895, 1897], [1853, 1896, 1898], [1897, 1899], [1898, 1900, 1988], [1899, 1901], [1854, 1900, 1902], [1901, 1903], [1902, 1904, 1989], [1903, 1905], [1855, 1904, 1906], [1905, 1907], [1906, 1908, 1990], [1907, 1909], [1856, 1908, 1910], [1909, 1911], [1910, 1912, 1991], [1911, 1913], [1857, 1912, 1914], [1913, 1915], [1914, 1916, 1992], [1915, 1917], [1858, 1916, 1918], [1917, 1919], [1918, 1920, 1993], [1919, 1921], [1859, 1920, 1922], [1921, 1923], [1922, 1924, 1994], [1923, 1925], [1860, 1924, 1926], [1925, 1927], [1926, 1928, 1995], [1927, 1929], [1861, 1928, 1930], [1929, 1931], [1930, 1932, 1996], [1931, 1933], [1862, 1932, 1934], [1933, 1935], [1934, 1936, 1997], [1935, 1937], [1863, 1936, 1938], [1937, 1939], [1938, 1940, 1998], [1939, 1941], [1864, 1940, 1942], [1941, 1943], [1942, 1944, 1999], [1943, 1945], [1865, 1944, 1946], [1945, 1947], [1946, 1948, 2000], [1947, 1949], [1866, 1948, 1950], [1949, 1951], [1950, 1952, 2001], [1951, 1953], [1867, 1952, 1954], [1953, 1955], [1954, 1956, 2002], [1955, 1957], [1868, 1956, 1958], [1957, 1959], [1958, 1960, 2003], [1959, 1961], [1869, 1960, 1962], [1961, 1963], [1962, 1964, 2004], [1963, 1965], [1870, 1964, 1966], [1965, 1967], [1966, 1968, 2005], [1967, 1969], [1871, 1968, 1970], [1969, 1971], [1970, 1972, 2006], [1971, 1973], [1872, 1972, 1974], [1973, 1975], [1974, 1976, 2007], [1975, 1977], [1873, 1976, 1978], [1977, 1979], [1978, 1980, 2008], [1979, 1981], [1874, 1980], [1875, 2009], [1879, 2013], [1883, 2017], [1887, 2021], [1891, 2025], [1895, 2029], [1899, 2033], [1903, 2037], [1907, 2041], [1911, 2045], [1915, 2049], [1919, 2053], [1923, 2057], [1927, 2061], [1931, 2065], [1935, 2069], [1939, 2073], [1943, 2077], [1947, 2081], [1951, 2085], [1955, 2089], [1959, 2093], [1963, 2097], [1967, 2101], [1971, 2105], [1975, 2109], [1979, 2113], [1982, 2010], [2009, 2011], [2010, 2012, 2116], [2011, 2013], [1983, 2012, 2014], [2013, 2015], [2014, 2016, 2117], [2015, 2017], [1984, 2016, 2018], [2017, 2019], [2018, 2020, 2118], [2019, 2021], [1985, 2020, 2022], [2021, 2023], [2022, 2024, 2119], [2023, 2025], [1986, 2024, 2026], [2025, 2027], [2026, 2028, 2120], [2027, 2029], [1987, 2028, 2030], [2029, 2031], [2030, 2032, 2121], [2031, 2033], [1988, 2032, 2034], [2033, 2035], [2034, 2036, 2122], [2035, 2037], [1989, 2036, 2038], [2037, 2039], [2038, 2040, 2123], [2039, 2041], [1990, 2040, 2042], [2041, 2043], [2042, 2044, 2124], [2043, 2045], [1991, 2044, 2046], [2045, 2047], [2046, 2048, 2125], [2047, 2049], [1992, 2048, 2050], [2049, 2051], [2050, 2052, 2126], [2051, 2053], [1993, 2052, 2054], [2053, 2055], [2054, 2056, 2127], [2055, 2057], [1994, 2056, 2058], [2057, 2059], [2058, 2060, 2128], [2059, 2061], [1995, 2060, 2062], [2061, 2063], [2062, 2064, 2129], [2063, 2065], [1996, 2064, 2066], [2065, 2067], [2066, 2068, 2130], [2067, 2069], [1997, 2068, 2070], [2069, 2071], [2070, 2072, 2131], [2071, 2073], [1998, 2072, 2074], [2073, 2075], [2074, 2076, 2132], [2075, 2077], [1999, 2076, 2078], [2077, 2079], [2078, 2080, 2133], [2079, 2081], [2000, 2080, 2082], [2081, 2083], [2082, 2084, 2134], [2083, 2085], [2001, 2084, 2086], [2085, 2087], [2086, 2088, 2135], [2087, 2089], [2002, 2088, 2090], [2089, 2091], [2090, 2092, 2136], [2091, 2093], [2003, 2092, 2094], [2093, 2095], [2094, 2096, 2137], [2095, 2097], [2004, 2096, 2098], [2097, 2099], [2098, 2100, 2138], [2099, 2101], [2005, 2100, 2102], [2101, 2103], [2102, 2104, 2139], [2103, 2105], [2006, 2104, 2106], [2105, 2107], [2106, 2108, 2140], [2107, 2109], [2007, 2108, 2110], [2109, 2111], [2110, 2112, 2141], [2111, 2113], [2008, 2112, 2114], [2113, 2115], [2114, 2142], [2011, 2145], [2015, 2149], [2019, 2153], [2023, 2157], [2027, 2161], [2031, 2165], [2035, 2169], [2039, 2173], [2043, 2177], [2047, 2181], [2051, 2185], [2055, 2189], [2059, 2193], [2063, 2197], [2067, 2201], [2071, 2205], [2075, 2209], [2079, 2213], [2083, 2217], [2087, 2221], [2091, 2225], [2095, 2229], [2099, 2233], [2103, 2237], [2107, 2241], [2111, 2245], [2115, 2249], [2144, 2250], [2143, 2145], [2116, 2144, 2146], [2145, 2147], [2146, 2148, 2251], [2147, 2149], [2117, 2148, 2150], [2149, 2151], [2150, 2152, 2252], [2151, 2153], [2118, 2152, 2154], [2153, 2155], [2154, 2156, 2253], [2155, 2157], [2119, 2156, 2158], [2157, 2159], [2158, 2160, 2254], [2159, 2161], [2120, 2160, 2162], [2161, 2163], [2162, 2164, 2255], [2163, 2165], [2121, 2164, 2166], [2165, 2167], [2166, 2168, 2256], [2167, 2169], [2122, 2168, 2170], [2169, 2171], [2170, 2172, 2257], [2171, 2173], [2123, 2172, 2174], [2173, 2175], [2174, 2176, 2258], [2175, 2177], [2124, 2176, 2178], [2177, 2179], [2178, 2180, 2259], [2179, 2181], [2125, 2180, 2182], [2181, 2183], [2182, 2184, 2260], [2183, 2185], [2126, 2184, 2186], [2185, 2187], [2186, 2188, 2261], [2187, 2189], [2127, 2188, 2190], [2189, 2191], [2190, 2192, 2262], [2191, 2193], [2128, 2192, 2194], [2193, 2195], [2194, 2196, 2263], [2195, 2197], [2129, 2196, 2198], [2197, 2199], [2198, 2200, 2264], [2199, 2201], [2130, 2200, 2202], [2201, 2203], [2202, 2204, 2265], [2203, 2205], [2131, 2204, 2206], [2205, 2207], [2206, 2208, 2266], [2207, 2209], [2132, 2208, 2210], [2209, 2211], [2210, 2212, 2267], [2211, 2213], [2133, 2212, 2214], [2213, 2215], [2214, 2216, 2268], [2215, 2217], [2134, 2216, 2218], [2217, 2219], [2218, 2220, 2269], [2219, 2221], [2135, 2220, 2222], [2221, 2223], [2222, 2224, 2270], [2223, 2225], [2136, 2224, 2226], [2225, 2227], [2226, 2228, 2271], [2227, 2229], [2137, 2228, 2230], [2229, 2231], [2230, 2232, 2272], [2231, 2233], [2138, 2232, 2234], [2233, 2235], [2234, 2236, 2273], [2235, 2237], [2139, 2236, 2238], [2237, 2239], [2238, 2240, 2274], [2239, 2241], [2140, 2240, 2242], [2241, 2243], [2242, 2244, 2275], [2243, 2245], [2141, 2244, 2246], [2245, 2247], [2246, 2248, 2276], [2247, 2249], [2142, 2248], [2143, 2277], [2147, 2281], [2151, 2285], [2155, 2289], [2159, 2293], [2163, 2297], [2167, 2301], [2171, 2305], [2175, 2309], [2179, 2313], [2183, 2317], [2187, 2321], [2191, 2325], [2195, 2329], [2199, 2333], [2203, 2337], [2207, 2341], [2211, 2345], [2215, 2349], [2219, 2353], [2223, 2357], [2227, 2361], [2231, 2365], [2235, 2369], [2239, 2373], [2243, 2377], [2247, 2381], [2250, 2278], [2277, 2279], [2278, 2280, 2384], [2279, 2281], [2251, 2280, 2282], [2281, 2283], [2282, 2284, 2385], [2283, 2285], [2252, 2284, 2286], [2285, 2287], [2286, 2288, 2386], [2287, 2289], [2253, 2288, 2290], [2289, 2291], [2290, 2292, 2387], [2291, 2293], [2254, 2292, 2294], [2293, 2295], [2294, 2296, 2388], [2295, 2297], [2255, 2296, 2298], [2297, 2299], [2298, 2300, 2389], [2299, 2301], [2256, 2300, 2302], [2301, 2303], [2302, 2304, 2390], [2303, 2305], [2257, 2304, 2306], [2305, 2307], [2306, 2308, 2391], [2307, 2309], [2258, 2308, 2310], [2309, 2311], [2310, 2312, 2392], [2311, 2313], [2259, 2312, 2314], [2313, 2315], [2314, 2316, 2393], [2315, 2317], [2260, 2316, 2318], [2317, 2319], [2318, 2320, 2394], [2319, 2321], [2261, 2320, 2322], [2321, 2323], [2322, 2324, 2395], [2323, 2325], [2262, 2324, 2326], [2325, 2327], [2326, 2328, 2396], [2327, 2329], [2263, 2328, 2330], [2329, 2331], [2330, 2332, 2397], [2331, 2333], [2264, 2332, 2334], [2333, 2335], [2334, 2336, 2398], [2335, 2337], [2265, 2336, 2338], [2337, 2339], [2338, 2340, 2399], [2339, 2341], [2266, 2340, 2342], [2341, 2343], [2342, 2344, 2400], [2343, 2345], [2267, 2344, 2346], [2345, 2347], [2346, 2348, 2401], [2347, 2349], [2268, 2348, 2350], [2349, 2351], [2350, 2352, 2402], [2351, 2353], [2269, 2352, 2354], [2353, 2355], [2354, 2356, 2403], [2355, 2357], [2270, 2356, 2358], [2357, 2359], [2358, 2360, 2404], [2359, 2361], [2271, 2360, 2362], [2361, 2363], [2362, 2364, 2405], [2363, 2365], [2272, 2364, 2366], [2365, 2367], [2366, 2368, 2406], [2367, 2369], [2273, 2368, 2370], [2369, 2371], [2370, 2372, 2407], [2371, 2373], [2274, 2372, 2374], [2373, 2375], [2374, 2376, 2408], [2375, 2377], [2275, 2376, 2378], [2377, 2379], [2378, 2380, 2409], [2379, 2381], [2276, 2380, 2382], [2381, 2383], [2382, 2410], [2279, 2413], [2283, 2417], [2287, 2421], [2291, 2425], [2295, 2429], [2299, 2433], [2303, 2437], [2307, 2441], [2311, 2445], [2315, 2449], [2319, 2453], [2323, 2457], [2327, 2461], [2331, 2465], [2335, 2469], [2339, 2473], [2343, 2477], [2347, 2481], [2351, 2485], [2355, 2489], [2359, 2493], [2363, 2497], [2367, 2501], [2371, 2505], [2375, 2509], [2379, 2513], [2383, 2517], [2412, 2518], [2411, 2413], [2384, 2412, 2414], [2413, 2415], [2414, 2416, 2519], [2415, 2417], [2385, 2416, 2418], [2417, 2419], [2418, 2420, 2520], [2419, 2421], [2386, 2420, 2422], [2421, 2423], [2422, 2424, 2521], [2423, 2425], [2387, 2424, 2426], [2425, 2427], [2426, 2428, 2522], [2427, 2429], [2388, 2428, 2430], [2429, 2431], [2430, 2432, 2523], [2431, 2433], [2389, 2432, 2434], [2433, 2435], [2434, 2436, 2524], [2435, 2437], [2390, 2436, 2438], [2437, 2439], [2438, 2440, 2525], [2439, 2441], [2391, 2440, 2442], [2441, 2443], [2442, 2444, 2526], [2443, 2445], [2392, 2444, 2446], [2445, 2447], [2446, 2448, 2527], [2447, 2449], [2393, 2448, 2450], [2449, 2451], [2450, 2452, 2528], [2451, 2453], [2394, 2452, 2454], [2453, 2455], [2454, 2456, 2529], [2455, 2457], [2395, 2456, 2458], [2457, 2459], [2458, 2460, 2530], [2459, 2461], [2396, 2460, 2462], [2461, 2463], [2462, 2464, 2531], [2463, 2465], [2397, 2464, 2466], [2465, 2467], [2466, 2468, 2532], [2467, 2469], [2398, 2468, 2470], [2469, 2471], [2470, 2472, 2533], [2471, 2473], [2399, 2472, 2474], [2473, 2475], [2474, 2476, 2534], [2475, 2477], [2400, 2476, 2478], [2477, 2479], [2478, 2480, 2535], [2479, 2481], [2401, 2480, 2482], [2481, 2483], [2482, 2484, 2536], [2483, 2485], [2402, 2484, 2486], [2485, 2487], [2486, 2488, 2537], [2487, 2489], [2403, 2488, 2490], [2489, 2491], [2490, 2492, 2538], [2491, 2493], [2404, 2492, 2494], [2493, 2495], [2494, 2496, 2539], [2495, 2497], [2405, 2496, 2498], [2497, 2499], [2498, 2500, 2540], [2499, 2501], [2406, 2500, 2502], [2501, 2503], [2502, 2504, 2541], [2503, 2505], [2407, 2504, 2506], [2505, 2507], [2506, 2508, 2542], [2507, 2509], [2408, 2508, 2510], [2509, 2511], [2510, 2512, 2543], [2511, 2513], [2409, 2512, 2514], [2513, 2515], [2514, 2516, 2544], [2515, 2517], [2410, 2516], [2411, 2545], [2415, 2549], [2419, 2553], [2423, 2557], [2427, 2561], [2431, 2565], [2435, 2569], [2439, 2573], [2443, 2577], [2447, 2581], [2451, 2585], [2455, 2589], [2459, 2593], [2463, 2597], [2467, 2601], [2471, 2605], [2475, 2609], [2479, 2613], [2483, 2617], [2487, 2621], [2491, 2625], [2495, 2629], [2499, 2633], [2503, 2637], [2507, 2641], [2511, 2645], [2515, 2649], [2518, 2546], [2545, 2547], [2546, 2548, 2652], [2547, 2549], [2519, 2548, 2550], [2549, 2551], [2550, 2552, 2653], [2551, 2553], [2520, 2552, 2554], [2553, 2555], [2554, 2556, 2654], [2555, 2557], [2521, 2556, 2558], [2557, 2559], [2558, 2560, 2655], [2559, 2561], [2522, 2560, 2562], [2561, 2563], [2562, 2564, 2656], [2563, 2565], [2523, 2564, 2566], [2565, 2567], [2566, 2568, 2657], [2567, 2569], [2524, 2568, 2570], [2569, 2571], [2570, 2572, 2658], [2571, 2573], [2525, 2572, 2574], [2573, 2575], [2574, 2576, 2659], [2575, 2577], [2526, 2576, 2578], [2577, 2579], [2578, 2580, 2660], [2579, 2581], [2527, 2580, 2582], [2581, 2583], [2582, 2584, 2661], [2583, 2585], [2528, 2584, 2586], [2585, 2587], [2586, 2588, 2662], [2587, 2589], [2529, 2588, 2590], [2589, 2591], [2590, 2592, 2663], [2591, 2593], [2530, 2592, 2594], [2593, 2595], [2594, 2596, 2664], [2595, 2597], [2531, 2596, 2598], [2597, 2599], [2598, 2600, 2665], [2599, 2601], [2532, 2600, 2602], [2601, 2603], [2602, 2604, 2666], [2603, 2605], [2533, 2604, 2606], [2605, 2607], [2606, 2608, 2667], [2607, 2609], [2534, 2608, 2610], [2609, 2611], [2610, 2612, 2668], [2611, 2613], [2535, 2612, 2614], [2613, 2615], [2614, 2616, 2669], [2615, 2617], [2536, 2616, 2618], [2617, 2619], [2618, 2620, 2670], [2619, 2621], [2537, 2620, 2622], [2621, 2623], [2622, 2624, 2671], [2623, 2625], [2538, 2624, 2626], [2625, 2627], [2626, 2628, 2672], [2627, 2629], [2539, 2628, 2630], [2629, 2631], [2630, 2632, 2673], [2631, 2633], [2540, 2632, 2634], [2633, 2635], [2634, 2636, 2674], [2635, 2637], [2541, 2636, 2638], [2637, 2639], [2638, 2640, 2675], [2639, 2641], [2542, 2640, 2642], [2641, 2643], [2642, 2644, 2676], [2643, 2645], [2543, 2644, 2646], [2645, 2647], [2646, 2648, 2677], [2647, 2649], [2544, 2648, 2650], [2649, 2651], [2650, 2678], [2547, 2681], [2551, 2685], [2555, 2689], [2559, 2693], [2563, 2697], [2567, 2701], [2571, 2705], [2575, 2709], [2579, 2713], [2583, 2717], [2587, 2721], [2591, 2725], [2595, 2729], [2599, 2733], [2603, 2737], [2607, 2741], [2611, 2745], [2615, 2749], [2619, 2753], [2623, 2757], [2627, 2761], [2631, 2765], [2635, 2769], [2639, 2773], [2643, 2777], [2647, 2781], [2651, 2785], [2680, 2786], [2679, 2681], [2652, 2680, 2682], [2681, 2683], [2682, 2684, 2787], [2683, 2685], [2653, 2684, 2686], [2685, 2687], [2686, 2688, 2788], [2687, 2689], [2654, 2688, 2690], [2689, 2691], [2690, 2692, 2789], [2691, 2693], [2655, 2692, 2694], [2693, 2695], [2694, 2696, 2790], [2695, 2697], [2656, 2696, 2698], [2697, 2699], [2698, 2700, 2791], [2699, 2701], [2657, 2700, 2702], [2701, 2703], [2702, 2704, 2792], [2703, 2705], [2658, 2704, 2706], [2705, 2707], [2706, 2708, 2793], [2707, 2709], [2659, 2708, 2710], [2709, 2711], [2710, 2712, 2794], [2711, 2713], [2660, 2712, 2714], [2713, 2715], [2714, 2716, 2795], [2715, 2717], [2661, 2716, 2718], [2717, 2719], [2718, 2720, 2796], [2719, 2721], [2662, 2720, 2722], [2721, 2723], [2722, 2724, 2797], [2723, 2725], [2663, 2724, 2726], [2725, 2727], [2726, 2728, 2798], [2727, 2729], [2664, 2728, 2730], [2729, 2731], [2730, 2732, 2799], [2731, 2733], [2665, 2732, 2734], [2733, 2735], [2734, 2736, 2800], [2735, 2737], [2666, 2736, 2738], [2737, 2739], [2738, 2740, 2801], [2739, 2741], [2667, 2740, 2742], [2741, 2743], [2742, 2744, 2802], [2743, 2745], [2668, 2744, 2746], [2745, 2747], [2746, 2748, 2803], [2747, 2749], [2669, 2748, 2750], [2749, 2751], [2750, 2752, 2804], [2751, 2753], [2670, 2752, 2754], [2753, 2755], [2754, 2756, 2805], [2755, 2757], [2671, 2756, 2758], [2757, 2759], [2758, 2760, 2806], [2759, 2761], [2672, 2760, 2762], [2761, 2763], [2762, 2764, 2807], [2763, 2765], [2673, 2764, 2766], [2765, 2767], [2766, 2768, 2808], [2767, 2769], [2674, 2768, 2770], [2769, 2771], [2770, 2772, 2809], [2771, 2773], [2675, 2772, 2774], [2773, 2775], [2774, 2776, 2810], [2775, 2777], [2676, 2776, 2778], [2777, 2779], [2778, 2780, 2811], [2779, 2781], [2677, 2780, 2782], [2781, 2783], [2782, 2784, 2812], [2783, 2785], [2678, 2784], [2679, 2813], [2683, 2817], [2687, 2821], [2691, 2825], [2695, 2829], [2699, 2833], [2703, 2837], [2707, 2841], [2711, 2845], [2715, 2849], [2719, 2853], [2723, 2857], [2727, 2861], [2731, 2865], [2735, 2869], [2739, 2873], [2743, 2877], [2747, 2881], [2751, 2885], [2755, 2889], [2759, 2893], [2763, 2897], [2767, 2901], [2771, 2905], [2775, 2909], [2779, 2913], [2783, 2917], [2786, 2814], [2813, 2815], [2814, 2816, 2920], [2815, 2817], [2787, 2816, 2818], [2817, 2819], [2818, 2820, 2921], [2819, 2821], [2788, 2820, 2822], [2821, 2823], [2822, 2824, 2922], [2823, 2825], [2789, 2824, 2826], [2825, 2827], [2826, 2828, 2923], [2827, 2829], [2790, 2828, 2830], [2829, 2831], [2830, 2832, 2924], [2831, 2833], [2791, 2832, 2834], [2833, 2835], [2834, 2836, 2925], [2835, 2837], [2792, 2836, 2838], [2837, 2839], [2838, 2840, 2926], [2839, 2841], [2793, 2840, 2842], [2841, 2843], [2842, 2844, 2927], [2843, 2845], [2794, 2844, 2846], [2845, 2847], [2846, 2848, 2928], [2847, 2849], [2795, 2848, 2850], [2849, 2851], [2850, 2852, 2929], [2851, 2853], [2796, 2852, 2854], [2853, 2855], [2854, 2856, 2930], [2855, 2857], [2797, 2856, 2858], [2857, 2859], [2858, 2860, 2931], [2859, 2861], [2798, 2860, 2862], [2861, 2863], [2862, 2864, 2932], [2863, 2865], [2799, 2864, 2866], [2865, 2867], [2866, 2868, 2933], [2867, 2869], [2800, 2868, 2870], [2869, 2871], [2870, 2872, 2934], [2871, 2873], [2801, 2872, 2874], [2873, 2875], [2874, 2876, 2935], [2875, 2877], [2802, 2876, 2878], [2877, 2879], [2878, 2880, 2936], [2879, 2881], [2803, 2880, 2882], [2881, 2883], [2882, 2884, 2937], [2883, 2885], [2804, 2884, 2886], [2885, 2887], [2886, 2888, 2938], [2887, 2889], [2805, 2888, 2890], [2889, 2891], [2890, 2892, 2939], [2891, 2893], [2806, 2892, 2894], [2893, 2895], [2894, 2896, 2940], [2895, 2897], [2807, 2896, 2898], [2897, 2899], [2898, 2900, 2941], [2899, 2901], [2808, 2900, 2902], [2901, 2903], [2902, 2904, 2942], [2903, 2905], [2809, 2904, 2906], [2905, 2907], [2906, 2908, 2943], [2907, 2909], [2810, 2908, 2910], [2909, 2911], [2910, 2912, 2944], [2911, 2913], [2811, 2912, 2914], [2913, 2915], [2914, 2916, 2945], [2915, 2917], [2812, 2916, 2918], [2917, 2919], [2918, 2946], [2815, 2949], [2819, 2953], [2823, 2957], [2827, 2961], [2831, 2965], [2835, 2969], [2839, 2973], [2843, 2977], [2847, 2981], [2851, 2985], [2855, 2989], [2859, 2993], [2863, 2997], [2867, 3001], [2871, 3005], [2875, 3009], [2879, 3013], [2883, 3017], [2887, 3021], [2891, 3025], [2895, 3029], [2899, 3033], [2903, 3037], [2907, 3041], [2911, 3045], [2915, 3049], [2919, 3053], [2948, 3054], [2947, 2949], [2920, 2948, 2950], [2949, 2951], [2950, 2952, 3055], [2951, 2953], [2921, 2952, 2954], [2953, 2955], [2954, 2956, 3056], [2955, 2957], [2922, 2956, 2958], [2957, 2959], [2958, 2960, 3057], [2959, 2961], [2923, 2960, 2962], [2961, 2963], [2962, 2964, 3058], [2963, 2965], [2924, 2964, 2966], [2965, 2967], [2966, 2968, 3059], [2967, 2969], [2925, 2968, 2970], [2969, 2971], [2970, 2972, 3060], [2971, 2973], [2926, 2972, 2974], [2973, 2975], [2974, 2976, 3061], [2975, 2977], [2927, 2976, 2978], [2977, 2979], [2978, 2980, 3062], [2979, 2981], [2928, 2980, 2982], [2981, 2983], [2982, 2984, 3063], [2983, 2985], [2929, 2984, 2986], [2985, 2987], [2986, 2988, 3064], [2987, 2989], [2930, 2988, 2990], [2989, 2991], [2990, 2992, 3065], [2991, 2993], [2931, 2992, 2994], [2993, 2995], [2994, 2996, 3066], [2995, 2997], [2932, 2996, 2998], [2997, 2999], [2998, 3000, 3067], [2999, 3001], [2933, 3000, 3002], [3001, 3003], [3002, 3004, 3068], [3003, 3005], [2934, 3004, 3006], [3005, 3007], [3006, 3008, 3069], [3007, 3009], [2935, 3008, 3010], [3009, 3011], [3010, 3012, 3070], [3011, 3013], [2936, 3012, 3014], [3013, 3015], [3014, 3016, 3071], [3015, 3017], [2937, 3016, 3018], [3017, 3019], [3018, 3020, 3072], [3019, 3021], [2938, 3020, 3022], [3021, 3023], [3022, 3024, 3073], [3023, 3025], [2939, 3024, 3026], [3025, 3027], [3026, 3028, 3074], [3027, 3029], [2940, 3028, 3030], [3029, 3031], [3030, 3032, 3075], [3031, 3033], [2941, 3032, 3034], [3033, 3035], [3034, 3036, 3076], [3035, 3037], [2942, 3036, 3038], [3037, 3039], [3038, 3040, 3077], [3039, 3041], [2943, 3040, 3042], [3041, 3043], [3042, 3044, 3078], [3043, 3045], [2944, 3044, 3046], [3045, 3047], [3046, 3048, 3079], [3047, 3049], [2945, 3048, 3050], [3049, 3051], [3050, 3052, 3080], [3051, 3053], [2946, 3052], [2947, 3081], [2951, 3085], [2955, 3089], [2959, 3093], [2963, 3097], [2967, 3101], [2971, 3105], [2975, 3109], [2979, 3113], [2983, 3117], [2987, 3121], [2991, 3125], [2995, 3129], [2999, 3133], [3003, 3137], [3007, 3141], [3011, 3145], [3015, 3149], [3019, 3153], [3023, 3157], [3027, 3161], [3031, 3165], [3035, 3169], [3039, 3173], [3043, 3177], [3047, 3181], [3051, 3185], [3054, 3082], [3081, 3083], [3082, 3084, 3188], [3083, 3085], [3055, 3084, 3086], [3085, 3087], [3086, 3088, 3189], [3087, 3089], [3056, 3088, 3090], [3089, 3091], [3090, 3092, 3190], [3091, 3093], [3057, 3092, 3094], [3093, 3095], [3094, 3096, 3191], [3095, 3097], [3058, 3096, 3098], [3097, 3099], [3098, 3100, 3192], [3099, 3101], [3059, 3100, 3102], [3101, 3103], [3102, 3104, 3193], [3103, 3105], [3060, 3104, 3106], [3105, 3107], [3106, 3108, 3194], [3107, 3109], [3061, 3108, 3110], [3109, 3111], [3110, 3112, 3195], [3111, 3113], [3062, 3112, 3114], [3113, 3115], [3114, 3116, 3196], [3115, 3117], [3063, 3116, 3118], [3117, 3119], [3118, 3120, 3197], [3119, 3121], [3064, 3120, 3122], [3121, 3123], [3122, 3124, 3198], [3123, 3125], [3065, 3124, 3126], [3125, 3127], [3126, 3128, 3199], [3127, 3129], [3066, 3128, 3130], [3129, 3131], [3130, 3132, 3200], [3131, 3133], [3067, 3132, 3134], [3133, 3135], [3134, 3136, 3201], [3135, 3137], [3068, 3136, 3138], [3137, 3139], [3138, 3140, 3202], [3139, 3141], [3069, 3140, 3142], [3141, 3143], [3142, 3144, 3203], [3143, 3145], [3070, 3144, 3146], [3145, 3147], [3146, 3148, 3204], [3147, 3149], [3071, 3148, 3150], [3149, 3151], [3150, 3152, 3205], [3151, 3153], [3072, 3152, 3154], [3153, 3155], [3154, 3156, 3206], [3155, 3157], [3073, 3156, 3158], [3157, 3159], [3158, 3160, 3207], [3159, 3161], [3074, 3160, 3162], [3161, 3163], [3162, 3164, 3208], [3163, 3165], [3075, 3164, 3166], [3165, 3167], [3166, 3168, 3209], [3167, 3169], [3076, 3168, 3170], [3169, 3171], [3170, 3172, 3210], [3171, 3173], [3077, 3172, 3174], [3173, 3175], [3174, 3176, 3211], [3175, 3177], [3078, 3176, 3178], [3177, 3179], [3178, 3180, 3212], [3179, 3181], [3079, 3180, 3182], [3181, 3183], [3182, 3184, 3213], [3183, 3185], [3080, 3184, 3186], [3185, 3187], [3186, 3214], [3083, 3217], [3087, 3221], [3091, 3225], [3095, 3229], [3099, 3233], [3103, 3237], [3107, 3241], [3111, 3245], [3115, 3249], [3119, 3253], [3123, 3257], [3127, 3261], [3131, 3265], [3135, 3269], [3139, 3273], [3143, 3277], [3147, 3281], [3151, 3285], [3155, 3289], [3159, 3293], [3163, 3297], [3167, 3301], [3171, 3305], [3175, 3309], [3179, 3313], [3183, 3317], [3187, 3321], [3216, 3322], [3215, 3217], [3188, 3216, 3218], [3217, 3219], [3218, 3220, 3323], [3219, 3221], [3189, 3220, 3222], [3221, 3223], [3222, 3224, 3324], [3223, 3225], [3190, 3224, 3226], [3225, 3227], [3226, 3228, 3325], [3227, 3229], [3191, 3228, 3230], [3229, 3231], [3230, 3232, 3326], [3231, 3233], [3192, 3232, 3234], [3233, 3235], [3234, 3236, 3327], [3235, 3237], [3193, 3236, 3238], [3237, 3239], [3238, 3240, 3328], [3239, 3241], [3194, 3240, 3242], [3241, 3243], [3242, 3244, 3329], [3243, 3245], [3195, 3244, 3246], [3245, 3247], [3246, 3248, 3330], [3247, 3249], [3196, 3248, 3250], [3249, 3251], [3250, 3252, 3331], [3251, 3253], [3197, 3252, 3254], [3253, 3255], [3254, 3256, 3332], [3255, 3257], [3198, 3256, 3258], [3257, 3259], [3258, 3260, 3333], [3259, 3261], [3199, 3260, 3262], [3261, 3263], [3262, 3264, 3334], [3263, 3265], [3200, 3264, 3266], [3265, 3267], [3266, 3268, 3335], [3267, 3269], [3201, 3268, 3270], [3269, 3271], [3270, 3272, 3336], [3271, 3273], [3202, 3272, 3274], [3273, 3275], [3274, 3276, 3337], [3275, 3277], [3203, 3276, 3278], [3277, 3279], [3278, 3280, 3338], [3279, 3281], [3204, 3280, 3282], [3281, 3283], [3282, 3284, 3339], [3283, 3285], [3205, 3284, 3286], [3285, 3287], [3286, 3288, 3340], [3287, 3289], [3206, 3288, 3290], [3289, 3291], [3290, 3292, 3341], [3291, 3293], [3207, 3292, 3294], [3293, 3295], [3294, 3296, 3342], [3295, 3297], [3208, 3296, 3298], [3297, 3299], [3298, 3300, 3343], [3299, 3301], [3209, 3300, 3302], [3301, 3303], [3302, 3304, 3344], [3303, 3305], [3210, 3304, 3306], [3305, 3307], [3306, 3308, 3345], [3307, 3309], [3211, 3308, 3310], [3309, 3311], [3310, 3312, 3346], [3311, 3313], [3212, 3312, 3314], [3313, 3315], [3314, 3316, 3347], [3315, 3317], [3213, 3316, 3318], [3317, 3319], [3318, 3320, 3348], [3319, 3321], [3214, 3320], [3215, 3349], [3219, 3353], [3223, 3357], [3227, 3361], [3231, 3365], [3235, 3369], [3239, 3373], [3243, 3377], [3247, 3381], [3251, 3385], [3255, 3389], [3259, 3393], [3263, 3397], [3267, 3401], [3271, 3405], [3275, 3409], [3279, 3413], [3283, 3417], [3287, 3421], [3291, 3425], [3295, 3429], [3299, 3433], [3303, 3437], [3307, 3441], [3311, 3445], [3315, 3449], [3319, 3453], [3322, 3350], [3349, 3351], [3350, 3352, 3456], [3351, 3353], [3323, 3352, 3354], [3353, 3355], [3354, 3356, 3457], [3355, 3357], [3324, 3356, 3358], [3357, 3359], [3358, 3360, 3458], [3359, 3361], [3325, 3360, 3362], [3361, 3363], [3362, 3364, 3459], [3363, 3365], [3326, 3364, 3366], [3365, 3367], [3366, 3368, 3460], [3367, 3369], [3327, 3368, 3370], [3369, 3371], [3370, 3372, 3461], [3371, 3373], [3328, 3372, 3374], [3373, 3375], [3374, 3376, 3462], [3375, 3377], [3329, 3376, 3378], [3377, 3379], [3378, 3380, 3463], [3379, 3381], [3330, 3380, 3382], [3381, 3383], [3382, 3384, 3464], [3383, 3385], [3331, 3384, 3386], [3385, 3387], [3386, 3388, 3465], [3387, 3389], [3332, 3388, 3390], [3389, 3391], [3390, 3392, 3466], [3391, 3393], [3333, 3392, 3394], [3393, 3395], [3394, 3396, 3467], [3395, 3397], [3334, 3396, 3398], [3397, 3399], [3398, 3400, 3468], [3399, 3401], [3335, 3400, 3402], [3401, 3403], [3402, 3404, 3469], [3403, 3405], [3336, 3404, 3406], [3405, 3407], [3406, 3408, 3470], [3407, 3409], [3337, 3408, 3410], [3409, 3411], [3410, 3412, 3471], [3411, 3413], [3338, 3412, 3414], [3413, 3415], [3414, 3416, 3472], [3415, 3417], [3339, 3416, 3418], [3417, 3419], [3418, 3420, 3473], [3419, 3421], [3340, 3420, 3422], [3421, 3423], [3422, 3424, 3474], [3423, 3425], [3341, 3424, 3426], [3425, 3427], [3426, 3428, 3475], [3427, 3429], [3342, 3428, 3430], [3429, 3431], [3430, 3432, 3476], [3431, 3433], [3343, 3432, 3434], [3433, 3435], [3434, 3436, 3477], [3435, 3437], [3344, 3436, 3438], [3437, 3439], [3438, 3440, 3478], [3439, 3441], [3345, 3440, 3442], [3441, 3443], [3442, 3444, 3479], [3443, 3445], [3346, 3444, 3446], [3445, 3447], [3446, 3448, 3480], [3447, 3449], [3347, 3448, 3450], [3449, 3451], [3450, 3452, 3481], [3451, 3453], [3348, 3452, 3454], [3453, 3455], [3454, 3482], [3351, 3485], [3355, 3489], [3359, 3493], [3363, 3497], [3367, 3501], [3371, 3505], [3375, 3509], [3379, 3513], [3383, 3517], [3387, 3521], [3391, 3525], [3395, 3529], [3399, 3533], [3403, 3537], [3407, 3541], [3411, 3545], [3415, 3549], [3419, 3553], [3423, 3557], [3427, 3561], [3431, 3565], [3435, 3569], [3439, 3573], [3443, 3577], [3447, 3581], [3451, 3585], [3455, 3589], [3484, 3590], [3483, 3485], [3456, 3484, 3486], [3485, 3487], [3486, 3488, 3591], [3487, 3489], [3457, 3488, 3490], [3489, 3491], [3490, 3492, 3592], [3491, 3493], [3458, 3492, 3494], [3493, 3495], [3494, 3496, 3593], [3495, 3497], [3459, 3496, 3498], [3497, 3499], [3498, 3500, 3594], [3499, 3501], [3460, 3500, 3502], [3501, 3503], [3502, 3504, 3595], [3503, 3505], [3461, 3504, 3506], [3505, 3507], [3506, 3508, 3596], [3507, 3509], [3462, 3508, 3510], [3509, 3511], [3510, 3512, 3597], [3511, 3513], [3463, 3512, 3514], [3513, 3515], [3514, 3516, 3598], [3515, 3517], [3464, 3516, 3518], [3517, 3519], [3518, 3520, 3599], [3519, 3521], [3465, 3520, 3522], [3521, 3523], [3522, 3524, 3600], [3523, 3525], [3466, 3524, 3526], [3525, 3527], [3526, 3528, 3601], [3527, 3529], [3467, 3528, 3530], [3529, 3531], [3530, 3532, 3602], [3531, 3533], [3468, 3532, 3534], [3533, 3535], [3534, 3536, 3603], [3535, 3537], [3469, 3536, 3538], [3537, 3539], [3538, 3540, 3604], [3539, 3541], [3470, 3540, 3542], [3541, 3543], [3542, 3544, 3605], [3543, 3545], [3471, 3544, 3546], [3545, 3547], [3546, 3548, 3606], [3547, 3549], [3472, 3548, 3550], [3549, 3551], [3550, 3552, 3607], [3551, 3553], [3473, 3552, 3554], [3553, 3555], [3554, 3556, 3608], [3555, 3557], [3474, 3556, 3558], [3557, 3559], [3558, 3560, 3609], [3559, 3561], [3475, 3560, 3562], [3561, 3563], [3562, 3564, 3610], [3563, 3565], [3476, 3564, 3566], [3565, 3567], [3566, 3568, 3611], [3567, 3569], [3477, 3568, 3570], [3569, 3571], [3570, 3572, 3612], [3571, 3573], [3478, 3572, 3574], [3573, 3575], [3574, 3576, 3613], [3575, 3577], [3479, 3576, 3578], [3577, 3579], [3578, 3580, 3614], [3579, 3581], [3480, 3580, 3582], [3581, 3583], [3582, 3584, 3615], [3583, 3585], [3481, 3584, 3586], [3585, 3587], [3586, 3588, 3616], [3587, 3589], [3482, 3588], [3483, 3617], [3487, 3621], [3491, 3625], [3495, 3629], [3499, 3633], [3503, 3637], [3507, 3641], [3511, 3645], [3515, 3649], [3519, 3653], [3523, 3657], [3527, 3661], [3531, 3665], [3535, 3669], [3539, 3673], [3543, 3677], [3547, 3681], [3551, 3685], [3555, 3689], [3559, 3693], [3563, 3697], [3567, 3701], [3571, 3705], [3575, 3709], [3579, 3713], [3583, 3717], [3587, 3721], [3590, 3618], [3617, 3619], [3618, 3620, 3724], [3619, 3621], [3591, 3620, 3622], [3621, 3623], [3622, 3624, 3725], [3623, 3625], [3592, 3624, 3626], [3625, 3627], [3626, 3628, 3726], [3627, 3629], [3593, 3628, 3630], [3629, 3631], [3630, 3632, 3727], [3631, 3633], [3594, 3632, 3634], [3633, 3635], [3634, 3636, 3728], [3635, 3637], [3595, 3636, 3638], [3637, 3639], [3638, 3640, 3729], [3639, 3641], [3596, 3640, 3642], [3641, 3643], [3642, 3644, 3730], [3643, 3645], [3597, 3644, 3646], [3645, 3647], [3646, 3648, 3731], [3647, 3649], [3598, 3648, 3650], [3649, 3651], [3650, 3652, 3732], [3651, 3653], [3599, 3652, 3654], [3653, 3655], [3654, 3656, 3733], [3655, 3657], [3600, 3656, 3658], [3657, 3659], [3658, 3660, 3734], [3659, 3661], [3601, 3660, 3662], [3661, 3663], [3662, 3664, 3735], [3663, 3665], [3602, 3664, 3666], [3665, 3667], [3666, 3668, 3736], [3667, 3669], [3603, 3668, 3670], [3669, 3671], [3670, 3672, 3737], [3671, 3673], [3604, 3672, 3674], [3673, 3675], [3674, 3676, 3738], [3675, 3677], [3605, 3676, 3678], [3677, 3679], [3678, 3680, 3739], [3679, 3681], [3606, 3680, 3682], [3681, 3683], [3682, 3684, 3740], [3683, 3685], [3607, 3684, 3686], [3685, 3687], [3686, 3688, 3741], [3687, 3689], [3608, 3688, 3690], [3689, 3691], [3690, 3692, 3742], [3691, 3693], [3609, 3692, 3694], [3693, 3695], [3694, 3696, 3743], [3695, 3697], [3610, 3696, 3698], [3697, 3699], [3698, 3700, 3744], [3699, 3701], [3611, 3700, 3702], [3701, 3703], [3702, 3704, 3745], [3703, 3705], [3612, 3704, 3706], [3705, 3707], [3706, 3708, 3746], [3707, 3709], [3613, 3708, 3710], [3709, 3711], [3710, 3712, 3747], [3711, 3713], [3614, 3712, 3714], [3713, 3715], [3714, 3716, 3748], [3715, 3717], [3615, 3716, 3718], [3717, 3719], [3718, 3720, 3749], [3719, 3721], [3616, 3720, 3722], [3721, 3723], [3722, 3750], [3619, 3753], [3623, 3757], [3627, 3761], [3631, 3765], [3635, 3769], [3639, 3773], [3643, 3777], [3647, 3781], [3651, 3785], [3655, 3789], [3659, 3793], [3663, 3797], [3667, 3801], [3671, 3805], [3675, 3809], [3679, 3813], [3683, 3817], [3687, 3821], [3691, 3825], [3695, 3829], [3699, 3833], [3703, 3837], [3707, 3841], [3711, 3845], [3715, 3849], [3719, 3853], [3723, 3857], [3752, 3858], [3751, 3753], [3724, 3752, 3754], [3753, 3755], [3754, 3756, 3859], [3755, 3757], [3725, 3756, 3758], [3757, 3759], [3758, 3760, 3860], [3759, 3761], [3726, 3760, 3762], [3761, 3763], [3762, 3764, 3861], [3763, 3765], [3727, 3764, 3766], [3765, 3767], [3766, 3768, 3862], [3767, 3769], [3728, 3768, 3770], [3769, 3771], [3770, 3772, 3863], [3771, 3773], [3729, 3772, 3774], [3773, 3775], [3774, 3776, 3864], [3775, 3777], [3730, 3776, 3778], [3777, 3779], [3778, 3780, 3865], [3779, 3781], [3731, 3780, 3782], [3781, 3783], [3782, 3784, 3866], [3783, 3785], [3732, 3784, 3786], [3785, 3787], [3786, 3788, 3867], [3787, 3789], [3733, 3788, 3790], [3789, 3791], [3790, 3792, 3868], [3791, 3793], [3734, 3792, 3794], [3793, 3795], [3794, 3796, 3869], [3795, 3797], [3735, 3796, 3798], [3797, 3799], [3798, 3800, 3870], [3799, 3801], [3736, 3800, 3802], [3801, 3803], [3802, 3804, 3871], [3803, 3805], [3737, 3804, 3806], [3805, 3807], [3806, 3808, 3872], [3807, 3809], [3738, 3808, 3810], [3809, 3811], [3810, 3812, 3873], [3811, 3813], [3739, 3812, 3814], [3813, 3815], [3814, 3816, 3874], [3815, 3817], [3740, 3816, 3818], [3817, 3819], [3818, 3820, 3875], [3819, 3821], [3741, 3820, 3822], [3821, 3823], [3822, 3824, 3876], [3823, 3825], [3742, 3824, 3826], [3825, 3827], [3826, 3828, 3877], [3827, 3829], [3743, 3828, 3830], [3829, 3831], [3830, 3832, 3878], [3831, 3833], [3744, 3832, 3834], [3833, 3835], [3834, 3836, 3879], [3835, 3837], [3745, 3836, 3838], [3837, 3839], [3838, 3840, 3880], [3839, 3841], [3746, 3840, 3842], [3841, 3843], [3842, 3844, 3881], [3843, 3845], [3747, 3844, 3846], [3845, 3847], [3846, 3848, 3882], [3847, 3849], [3748, 3848, 3850], [3849, 3851], [3850, 3852, 3883], [3851, 3853], [3749, 3852, 3854], [3853, 3855], [3854, 3856, 3884], [3855, 3857], [3750, 3856], [3751, 3885], [3755, 3889], [3759, 3893], [3763, 3897], [3767, 3901], [3771, 3905], [3775, 3909], [3779, 3913], [3783, 3917], [3787, 3921], [3791, 3925], [3795, 3929], [3799, 3933], [3803, 3937], [3807, 3941], [3811, 3945], [3815, 3949], [3819, 3953], [3823, 3957], [3827, 3961], [3831, 3965], [3835, 3969], [3839, 3973], [3843, 3977], [3847, 3981], [3851, 3985], [3855, 3989], [3858, 3886], [3885, 3887], [3886, 3888, 3992], [3887, 3889], [3859, 3888, 3890], [3889, 3891], [3890, 3892, 3993], [3891, 3893], [3860, 3892, 3894], [3893, 3895], [3894, 3896, 3994], [3895, 3897], [3861, 3896, 3898], [3897, 3899], [3898, 3900, 3995], [3899, 3901], [3862, 3900, 3902], [3901, 3903], [3902, 3904, 3996], [3903, 3905], [3863, 3904, 3906], [3905, 3907], [3906, 3908, 3997], [3907, 3909], [3864, 3908, 3910], [3909, 3911], [3910, 3912, 3998], [3911, 3913], [3865, 3912, 3914], [3913, 3915], [3914, 3916, 3999], [3915, 3917], [3866, 3916, 3918], [3917, 3919], [3918, 3920, 4000], [3919, 3921], [3867, 3920, 3922], [3921, 3923], [3922, 3924, 4001], [3923, 3925], [3868, 3924, 3926], [3925, 3927], [3926, 3928, 4002], [3927, 3929], [3869, 3928, 3930], [3929, 3931], [3930, 3932, 4003], [3931, 3933], [3870, 3932, 3934], [3933, 3935], [3934, 3936, 4004], [3935, 3937], [3871, 3936, 3938], [3937, 3939], [3938, 3940, 4005], [3939, 3941], [3872, 3940, 3942], [3941, 3943], [3942, 3944, 4006], [3943, 3945], [3873, 3944, 3946], [3945, 3947], [3946, 3948, 4007], [3947, 3949], [3874, 3948, 3950], [3949, 3951], [3950, 3952, 4008], [3951, 3953], [3875, 3952, 3954], [3953, 3955], [3954, 3956, 4009], [3955, 3957], [3876, 3956, 3958], [3957, 3959], [3958, 3960, 4010], [3959, 3961], [3877, 3960, 3962], [3961, 3963], [3962, 3964, 4011], [3963, 3965], [3878, 3964, 3966], [3965, 3967], [3966, 3968, 4012], [3967, 3969], [3879, 3968, 3970], [3969, 3971], [3970, 3972, 4013], [3971, 3973], [3880, 3972, 3974], [3973, 3975], [3974, 3976, 4014], [3975, 3977], [3881, 3976, 3978], [3977, 3979], [3978, 3980, 4015], [3979, 3981], [3882, 3980, 3982], [3981, 3983], [3982, 3984, 4016], [3983, 3985], [3883, 3984, 3986], [3985, 3987], [3986, 3988, 4017], [3987, 3989], [3884, 3988, 3990], [3989, 3991], [3990, 4018], [3887, 4021], [3891, 4025], [3895, 4029], [3899, 4033], [3903, 4037], [3907, 4041], [3911, 4045], [3915, 4049], [3919, 4053], [3923, 4057], [3927, 4061], [3931, 4065], [3935, 4069], [3939, 4073], [3943, 4077], [3947, 4081], [3951, 4085], [3955, 4089], [3959, 4093], [3963, 4097], [3967, 4101], [3971, 4105], [3975, 4109], [3979, 4113], [3983, 4117], [3987, 4121], [3991, 4125], [4020, 4126], [4019, 4021], [3992, 4020, 4022], [4021, 4023], [4022, 4024, 4127], [4023, 4025], [3993, 4024, 4026], [4025, 4027], [4026, 4028, 4128], [4027, 4029], [3994, 4028, 4030], [4029, 4031], [4030, 4032, 4129], [4031, 4033], [3995, 4032, 4034], [4033, 4035], [4034, 4036, 4130], [4035, 4037], [3996, 4036, 4038], [4037, 4039], [4038, 4040, 4131], [4039, 4041], [3997, 4040, 4042], [4041, 4043], [4042, 4044, 4132], [4043, 4045], [3998, 4044, 4046], [4045, 4047], [4046, 4048, 4133], [4047, 4049], [3999, 4048, 4050], [4049, 4051], [4050, 4052, 4134], [4051, 4053], [4000, 4052, 4054], [4053, 4055], [4054, 4056, 4135], [4055, 4057], [4001, 4056, 4058], [4057, 4059], [4058, 4060, 4136], [4059, 4061], [4002, 4060, 4062], [4061, 4063], [4062, 4064, 4137], [4063, 4065], [4003, 4064, 4066], [4065, 4067], [4066, 4068, 4138], [4067, 4069], [4004, 4068, 4070], [4069, 4071], [4070, 4072, 4139], [4071, 4073], [4005, 4072, 4074], [4073, 4075], [4074, 4076, 4140], [4075, 4077], [4006, 4076, 4078], [4077, 4079], [4078, 4080, 4141], [4079, 4081], [4007, 4080, 4082], [4081, 4083], [4082, 4084, 4142], [4083, 4085], [4008, 4084, 4086], [4085, 4087], [4086, 4088, 4143], [4087, 4089], [4009, 4088, 4090], [4089, 4091], [4090, 4092, 4144], [4091, 4093], [4010, 4092, 4094], [4093, 4095], [4094, 4096, 4145], [4095, 4097], [4011, 4096, 4098], [4097, 4099], [4098, 4100, 4146], [4099, 4101], [4012, 4100, 4102], [4101, 4103], [4102, 4104, 4147], [4103, 4105], [4013, 4104, 4106], [4105, 4107], [4106, 4108, 4148], [4107, 4109], [4014, 4108, 4110], [4109, 4111], [4110, 4112, 4149], [4111, 4113], [4015, 4112, 4114], [4113, 4115], [4114, 4116, 4150], [4115, 4117], [4016, 4116, 4118], [4117, 4119], [4118, 4120, 4151], [4119, 4121], [4017, 4120, 4122], [4121, 4123], [4122, 4124, 4152], [4123, 4125], [4018, 4124], [4019, 4153], [4023, 4157], [4027, 4161], [4031, 4165], [4035, 4169], [4039, 4173], [4043, 4177], [4047, 4181], [4051, 4185], [4055, 4189], [4059, 4193], [4063, 4197], [4067, 4201], [4071, 4205], [4075, 4209], [4079, 4213], [4083, 4217], [4087, 4221], [4091, 4225], [4095, 4229], [4099, 4233], [4103, 4237], [4107, 4241], [4111, 4245], [4115, 4249], [4119, 4253], [4123, 4257], [4126, 4154], [4153, 4155], [4154, 4156, 4260], [4155, 4157], [4127, 4156, 4158], [4157, 4159], [4158, 4160, 4261], [4159, 4161], [4128, 4160, 4162], [4161, 4163], [4162, 4164, 4262], [4163, 4165], [4129, 4164, 4166], [4165, 4167], [4166, 4168, 4263], [4167, 4169], [4130, 4168, 4170], [4169, 4171], [4170, 4172, 4264], [4171, 4173], [4131, 4172, 4174], [4173, 4175], [4174, 4176, 4265], [4175, 4177], [4132, 4176, 4178], [4177, 4179], [4178, 4180, 4266], [4179, 4181], [4133, 4180, 4182], [4181, 4183], [4182, 4184, 4267], [4183, 4185], [4134, 4184, 4186], [4185, 4187], [4186, 4188, 4268], [4187, 4189], [4135, 4188, 4190], [4189, 4191], [4190, 4192, 4269], [4191, 4193], [4136, 4192, 4194], [4193, 4195], [4194, 4196, 4270], [4195, 4197], [4137, 4196, 4198], [4197, 4199], [4198, 4200, 4271], [4199, 4201], [4138, 4200, 4202], [4201, 4203], [4202, 4204, 4272], [4203, 4205], [4139, 4204, 4206], [4205, 4207], [4206, 4208, 4273], [4207, 4209], [4140, 4208, 4210], [4209, 4211], [4210, 4212, 4274], [4211, 4213], [4141, 4212, 4214], [4213, 4215], [4214, 4216, 4275], [4215, 4217], [4142, 4216, 4218], [4217, 4219], [4218, 4220, 4276], [4219, 4221], [4143, 4220, 4222], [4221, 4223], [4222, 4224, 4277], [4223, 4225], [4144, 4224, 4226], [4225, 4227], [4226, 4228, 4278], [4227, 4229], [4145, 4228, 4230], [4229, 4231], [4230, 4232, 4279], [4231, 4233], [4146, 4232, 4234], [4233, 4235], [4234, 4236, 4280], [4235, 4237], [4147, 4236, 4238], [4237, 4239], [4238, 4240, 4281], [4239, 4241], [4148, 4240, 4242], [4241, 4243], [4242, 4244, 4282], [4243, 4245], [4149, 4244, 4246], [4245, 4247], [4246, 4248, 4283], [4247, 4249], [4150, 4248, 4250], [4249, 4251], [4250, 4252, 4284], [4251, 4253], [4151, 4252, 4254], [4253, 4255], [4254, 4256, 4285], [4255, 4257], [4152, 4256, 4258], [4257, 4259], [4258, 4286], [4155, 4289], [4159, 4293], [4163, 4297], [4167, 4301], [4171, 4305], [4175, 4309], [4179, 4313], [4183, 4317], [4187, 4321], [4191, 4325], [4195, 4329], [4199, 4333], [4203, 4337], [4207, 4341], [4211, 4345], [4215, 4349], [4219, 4353], [4223, 4357], [4227, 4361], [4231, 4365], [4235, 4369], [4239, 4373], [4243, 4377], [4247, 4381], [4251, 4385], [4255, 4389], [4259, 4393], [4288, 4394], [4287, 4289], [4260, 4288, 4290], [4289, 4291], [4290, 4292, 4395], [4291, 4293], [4261, 4292, 4294], [4293, 4295], [4294, 4296, 4396], [4295, 4297], [4262, 4296, 4298], [4297, 4299], [4298, 4300, 4397], [4299, 4301], [4263, 4300, 4302], [4301, 4303], [4302, 4304, 4398], [4303, 4305], [4264, 4304, 4306], [4305, 4307], [4306, 4308, 4399], [4307, 4309], [4265, 4308, 4310], [4309, 4311], [4310, 4312, 4400], [4311, 4313], [4266, 4312, 4314], [4313, 4315], [4314, 4316, 4401], [4315, 4317], [4267, 4316, 4318], [4317, 4319], [4318, 4320, 4402], [4319, 4321], [4268, 4320, 4322], [4321, 4323], [4322, 4324, 4403], [4323, 4325], [4269, 4324, 4326], [4325, 4327], [4326, 4328, 4404], [4327, 4329], [4270, 4328, 4330], [4329, 4331], [4330, 4332, 4405], [4331, 4333], [4271, 4332, 4334], [4333, 4335], [4334, 4336, 4406], [4335, 4337], [4272, 4336, 4338], [4337, 4339], [4338, 4340, 4407], [4339, 4341], [4273, 4340, 4342], [4341, 4343], [4342, 4344, 4408], [4343, 4345], [4274, 4344, 4346], [4345, 4347], [4346, 4348, 4409], [4347, 4349], [4275, 4348, 4350], [4349, 4351], [4350, 4352, 4410], [4351, 4353], [4276, 4352, 4354], [4353, 4355], [4354, 4356, 4411], [4355, 4357], [4277, 4356, 4358], [4357, 4359], [4358, 4360, 4412], [4359, 4361], [4278, 4360, 4362], [4361, 4363], [4362, 4364, 4413], [4363, 4365], [4279, 4364, 4366], [4365, 4367], [4366, 4368, 4414], [4367, 4369], [4280, 4368, 4370], [4369, 4371], [4370, 4372, 4415], [4371, 4373], [4281, 4372, 4374], [4373, 4375], [4374, 4376, 4416], [4375, 4377], [4282, 4376, 4378], [4377, 4379], [4378, 4380, 4417], [4379, 4381], [4283, 4380, 4382], [4381, 4383], [4382, 4384, 4418], [4383, 4385], [4284, 4384, 4386], [4385, 4387], [4386, 4388, 4419], [4387, 4389], [4285, 4388, 4390], [4389, 4391], [4390, 4392, 4420], [4391, 4393], [4286, 4392], [4287, 4421], [4291, 4425], [4295, 4429], [4299, 4433], [4303, 4437], [4307, 4441], [4311, 4445], [4315, 4449], [4319, 4453], [4323, 4457], [4327, 4461], [4331, 4465], [4335, 4469], [4339, 4473], [4343, 4477], [4347, 4481], [4351, 4485], [4355, 4489], [4359, 4493], [4363, 4497], [4367, 4501], [4371, 4505], [4375, 4509], [4379, 4513], [4383, 4517], [4387, 4521], [4391, 4525], [4394, 4422], [4421, 4423], [4422, 4424, 4528], [4423, 4425], [4395, 4424, 4426], [4425, 4427], [4426, 4428, 4529], [4427, 4429], [4396, 4428, 4430], [4429, 4431], [4430, 4432, 4530], [4431, 4433], [4397, 4432, 4434], [4433, 4435], [4434, 4436, 4531], [4435, 4437], [4398, 4436, 4438], [4437, 4439], [4438, 4440, 4532], [4439, 4441], [4399, 4440, 4442], [4441, 4443], [4442, 4444, 4533], [4443, 4445], [4400, 4444, 4446], [4445, 4447], [4446, 4448, 4534], [4447, 4449], [4401, 4448, 4450], [4449, 4451], [4450, 4452, 4535], [4451, 4453], [4402, 4452, 4454], [4453, 4455], [4454, 4456, 4536], [4455, 4457], [4403, 4456, 4458], [4457, 4459], [4458, 4460, 4537], [4459, 4461], [4404, 4460, 4462], [4461, 4463], [4462, 4464, 4538], [4463, 4465], [4405, 4464, 4466], [4465, 4467], [4466, 4468, 4539], [4467, 4469], [4406, 4468, 4470], [4469, 4471], [4470, 4472, 4540], [4471, 4473], [4407, 4472, 4474], [4473, 4475], [4474, 4476, 4541], [4475, 4477], [4408, 4476, 4478], [4477, 4479], [4478, 4480, 4542], [4479, 4481], [4409, 4480, 4482], [4481, 4483], [4482, 4484, 4543], [4483, 4485], [4410, 4484, 4486], [4485, 4487], [4486, 4488, 4544], [4487, 4489], [4411, 4488, 4490], [4489, 4491], [4490, 4492, 4545], [4491, 4493], [4412, 4492, 4494], [4493, 4495], [4494, 4496, 4546], [4495, 4497], [4413, 4496, 4498], [4497, 4499], [4498, 4500, 4547], [4499, 4501], [4414, 4500, 4502], [4501, 4503], [4502, 4504, 4548], [4503, 4505], [4415, 4504, 4506], [4505, 4507], [4506, 4508, 4549], [4507, 4509], [4416, 4508, 4510], [4509, 4511], [4510, 4512, 4550], [4511, 4513], [4417, 4512, 4514], [4513, 4515], [4514, 4516, 4551], [4515, 4517], [4418, 4516, 4518], [4517, 4519], [4518, 4520, 4552], [4519, 4521], [4419, 4520, 4522], [4521, 4523], [4522, 4524, 4553], [4523, 4525], [4420, 4524, 4526], [4525, 4527], [4526, 4554], [4423, 4557], [4427, 4561], [4431, 4565], [4435, 4569], [4439, 4573], [4443, 4577], [4447, 4581], [4451, 4585], [4455, 4589], [4459, 4593], [4463, 4597], [4467, 4601], [4471, 4605], [4475, 4609], [4479, 4613], [4483, 4617], [4487, 4621], [4491, 4625], [4495, 4629], [4499, 4633], [4503, 4637], [4507, 4641], [4511, 4645], [4515, 4649], [4519, 4653], [4523, 4657], [4527, 4661], [4556, 4662], [4555, 4557], [4528, 4556, 4558], [4557, 4559], [4558, 4560, 4663], [4559, 4561], [4529, 4560, 4562], [4561, 4563], [4562, 4564, 4664], [4563, 4565], [4530, 4564, 4566], [4565, 4567], [4566, 4568, 4665], [4567, 4569], [4531, 4568, 4570], [4569, 4571], [4570, 4572, 4666], [4571, 4573], [4532, 4572, 4574], [4573, 4575], [4574, 4576, 4667], [4575, 4577], [4533, 4576, 4578], [4577, 4579], [4578, 4580, 4668], [4579, 4581], [4534, 4580, 4582], [4581, 4583], [4582, 4584, 4669], [4583, 4585], [4535, 4584, 4586], [4585, 4587], [4586, 4588, 4670], [4587, 4589], [4536, 4588, 4590], [4589, 4591], [4590, 4592, 4671], [4591, 4593], [4537, 4592, 4594], [4593, 4595], [4594, 4596, 4672], [4595, 4597], [4538, 4596, 4598], [4597, 4599], [4598, 4600, 4673], [4599, 4601], [4539, 4600, 4602], [4601, 4603], [4602, 4604, 4674], [4603, 4605], [4540, 4604, 4606], [4605, 4607], [4606, 4608, 4675], [4607, 4609], [4541, 4608, 4610], [4609, 4611], [4610, 4612, 4676], [4611, 4613], [4542, 4612, 4614], [4613, 4615], [4614, 4616, 4677], [4615, 4617], [4543, 4616, 4618], [4617, 4619], [4618, 4620, 4678], [4619, 4621], [4544, 4620, 4622], [4621, 4623], [4622, 4624, 4679], [4623, 4625], [4545, 4624, 4626], [4625, 4627], [4626, 4628, 4680], [4627, 4629], [4546, 4628, 4630], [4629, 4631], [4630, 4632, 4681], [4631, 4633], [4547, 4632, 4634], [4633, 4635], [4634, 4636, 4682], [4635, 4637], [4548, 4636, 4638], [4637, 4639], [4638, 4640, 4683], [4639, 4641], [4549, 4640, 4642], [4641, 4643], [4642, 4644, 4684], [4643, 4645], [4550, 4644, 4646], [4645, 4647], [4646, 4648, 4685], [4647, 4649], [4551, 4648, 4650], [4649, 4651], [4650, 4652, 4686], [4651, 4653], [4552, 4652, 4654], [4653, 4655], [4654, 4656, 4687], [4655, 4657], [4553, 4656, 4658], [4657, 4659], [4658, 4660, 4688], [4659, 4661], [4554, 4660], [4555, 4689], [4559, 4693], [4563, 4697], [4567, 4701], [4571, 4705], [4575, 4709], [4579, 4713], [4583, 4717], [4587, 4721], [4591, 4725], [4595, 4729], [4599, 4733], [4603, 4737], [4607, 4741], [4611, 4745], [4615, 4749], [4619, 4753], [4623, 4757], [4627, 4761], [4631, 4765], [4635, 4769], [4639, 4773], [4643, 4777], [4647, 4781], [4651, 4785], [4655, 4789], [4659, 4793], [4662, 4690], [4689, 4691], [4690, 4692, 4796], [4691, 4693], [4663, 4692, 4694], [4693, 4695], [4694, 4696, 4797], [4695, 4697], [4664, 4696, 4698], [4697, 4699], [4698, 4700, 4798], [4699, 4701], [4665, 4700, 4702], [4701, 4703], [4702, 4704, 4799], [4703, 4705], [4666, 4704, 4706], [4705, 4707], [4706, 4708, 4800], [4707, 4709], [4667, 4708, 4710], [4709, 4711], [4710, 4712, 4801], [4711, 4713], [4668, 4712, 4714], [4713, 4715], [4714, 4716, 4802], [4715, 4717], [4669, 4716, 4718], [4717, 4719], [4718, 4720, 4803], [4719, 4721], [4670, 4720, 4722], [4721, 4723], [4722, 4724, 4804], [4723, 4725], [4671, 4724, 4726], [4725, 4727], [4726, 4728, 4805], [4727, 4729], [4672, 4728, 4730], [4729, 4731], [4730, 4732, 4806], [4731, 4733], [4673, 4732, 4734], [4733, 4735], [4734, 4736, 4807], [4735, 4737], [4674, 4736, 4738], [4737, 4739], [4738, 4740, 4808], [4739, 4741], [4675, 4740, 4742], [4741, 4743], [4742, 4744, 4809], [4743, 4745], [4676, 4744, 4746], [4745, 4747], [4746, 4748, 4810], [4747, 4749], [4677, 4748, 4750], [4749, 4751], [4750, 4752, 4811], [4751, 4753], [4678, 4752, 4754], [4753, 4755], [4754, 4756, 4812], [4755, 4757], [4679, 4756, 4758], [4757, 4759], [4758, 4760, 4813], [4759, 4761], [4680, 4760, 4762], [4761, 4763], [4762, 4764, 4814], [4763, 4765], [4681, 4764, 4766], [4765, 4767], [4766, 4768, 4815], [4767, 4769], [4682, 4768, 4770], [4769, 4771], [4770, 4772, 4816], [4771, 4773], [4683, 4772, 4774], [4773, 4775], [4774, 4776, 4817], [4775, 4777], [4684, 4776, 4778], [4777, 4779], [4778, 4780, 4818], [4779, 4781], [4685, 4780, 4782], [4781, 4783], [4782, 4784, 4819], [4783, 4785], [4686, 4784, 4786], [4785, 4787], [4786, 4788, 4820], [4787, 4789], [4687, 4788, 4790], [4789, 4791], [4790, 4792, 4821], [4791, 4793], [4688, 4792, 4794], [4793, 4795], [4794, 4822], [4691, 4825], [4695, 4829], [4699, 4833], [4703, 4837], [4707, 4841], [4711, 4845], [4715, 4849], [4719, 4853], [4723, 4857], [4727, 4861], [4731, 4865], [4735, 4869], [4739, 4873], [4743, 4877], [4747, 4881], [4751, 4885], [4755, 4889], [4759, 4893], [4763, 4897], [4767, 4901], [4771, 4905], [4775, 4909], [4779, 4913], [4783, 4917], [4787, 4921], [4791, 4925], [4795, 4929], [4824, 4930], [4823, 4825], [4796, 4824, 4826], [4825, 4827], [4826, 4828, 4931], [4827, 4829], [4797, 4828, 4830], [4829, 4831], [4830, 4832, 4932], [4831, 4833], [4798, 4832, 4834], [4833, 4835], [4834, 4836, 4933], [4835, 4837], [4799, 4836, 4838], [4837, 4839], [4838, 4840, 4934], [4839, 4841], [4800, 4840, 4842], [4841, 4843], [4842, 4844, 4935], [4843, 4845], [4801, 4844, 4846], [4845, 4847], [4846, 4848, 4936], [4847, 4849], [4802, 4848, 4850], [4849, 4851], [4850, 4852, 4937], [4851, 4853], [4803, 4852, 4854], [4853, 4855], [4854, 4856, 4938], [4855, 4857], [4804, 4856, 4858], [4857, 4859], [4858, 4860, 4939], [4859, 4861], [4805, 4860, 4862], [4861, 4863], [4862, 4864, 4940], [4863, 4865], [4806, 4864, 4866], [4865, 4867], [4866, 4868, 4941], [4867, 4869], [4807, 4868, 4870], [4869, 4871], [4870, 4872, 4942], [4871, 4873], [4808, 4872, 4874], [4873, 4875], [4874, 4876, 4943], [4875, 4877], [4809, 4876, 4878], [4877, 4879], [4878, 4880, 4944], [4879, 4881], [4810, 4880, 4882], [4881, 4883], [4882, 4884, 4945], [4883, 4885], [4811, 4884, 4886], [4885, 4887], [4886, 4888, 4946], [4887, 4889], [4812, 4888, 4890], [4889, 4891], [4890, 4892, 4947], [4891, 4893], [4813, 4892, 4894], [4893, 4895], [4894, 4896, 4948], [4895, 4897], [4814, 4896, 4898], [4897, 4899], [4898, 4900, 4949], [4899, 4901], [4815, 4900, 4902], [4901, 4903], [4902, 4904, 4950], [4903, 4905], [4816, 4904, 4906], [4905, 4907], [4906, 4908, 4951], [4907, 4909], [4817, 4908, 4910], [4909, 4911], [4910, 4912, 4952], [4911, 4913], [4818, 4912, 4914], [4913, 4915], [4914, 4916, 4953], [4915, 4917], [4819, 4916, 4918], [4917, 4919], [4918, 4920, 4954], [4919, 4921], [4820, 4920, 4922], [4921, 4923], [4922, 4924, 4955], [4923, 4925], [4821, 4924, 4926], [4925, 4927], [4926, 4928, 4956], [4927, 4929], [4822, 4928], [4823, 4957], [4827, 4961], [4831, 4965], [4835, 4969], [4839, 4973], [4843, 4977], [4847, 4981], [4851, 4985], [4855, 4989], [4859, 4993], [4863, 4997], [4867, 5001], [4871, 5005], [4875, 5009], [4879, 5013], [4883, 5017], [4887, 5021], [4891, 5025], [4895, 5029], [4899, 5033], [4903, 5037], [4907, 5041], [4911, 5045], [4915, 5049], [4919, 5053], [4923, 5057], [4927, 5061], [4930, 4958], [4957, 4959], [4958, 4960, 5064], [4959, 4961], [4931, 4960, 4962], [4961, 4963], [4962, 4964, 5065], [4963, 4965], [4932, 4964, 4966], [4965, 4967], [4966, 4968, 5066], [4967, 4969], [4933, 4968, 4970], [4969, 4971], [4970, 4972, 5067], [4971, 4973], [4934, 4972, 4974], [4973, 4975], [4974, 4976, 5068], [4975, 4977], [4935, 4976, 4978], [4977, 4979], [4978, 4980, 5069], [4979, 4981], [4936, 4980, 4982], [4981, 4983], [4982, 4984, 5070], [4983, 4985], [4937, 4984, 4986], [4985, 4987], [4986, 4988, 5071], [4987, 4989], [4938, 4988, 4990], [4989, 4991], [4990, 4992, 5072], [4991, 4993], [4939, 4992, 4994], [4993, 4995], [4994, 4996, 5073], [4995, 4997], [4940, 4996, 4998], [4997, 4999], [4998, 5000, 5074], [4999, 5001], [4941, 5000, 5002], [5001, 5003], [5002, 5004, 5075], [5003, 5005], [4942, 5004, 5006], [5005, 5007], [5006, 5008, 5076], [5007, 5009], [4943, 5008, 5010], [5009, 5011], [5010, 5012, 5077], [5011, 5013], [4944, 5012, 5014], [5013, 5015], [5014, 5016, 5078], [5015, 5017], [4945, 5016, 5018], [5017, 5019], [5018, 5020, 5079], [5019, 5021], [4946, 5020, 5022], [5021, 5023], [5022, 5024, 5080], [5023, 5025], [4947, 5024, 5026], [5025, 5027], [5026, 5028, 5081], [5027, 5029], [4948, 5028, 5030], [5029, 5031], [5030, 5032, 5082], [5031, 5033], [4949, 5032, 5034], [5033, 5035], [5034, 5036, 5083], [5035, 5037], [4950, 5036, 5038], [5037, 5039], [5038, 5040, 5084], [5039, 5041], [4951, 5040, 5042], [5041, 5043], [5042, 5044, 5085], [5043, 5045], [4952, 5044, 5046], [5045, 5047], [5046, 5048, 5086], [5047, 5049], [4953, 5048, 5050], [5049, 5051], [5050, 5052, 5087], [5051, 5053], [4954, 5052, 5054], [5053, 5055], [5054, 5056, 5088], [5055, 5057], [4955, 5056, 5058], [5057, 5059], [5058, 5060, 5089], [5059, 5061], [4956, 5060, 5062], [5061, 5063], [5062, 5090], [4959, 5093], [4963, 5097], [4967, 5101], [4971, 5105], [4975, 5109], [4979, 5113], [4983, 5117], [4987, 5121], [4991, 5125], [4995, 5129], [4999, 5133], [5003, 5137], [5007, 5141], [5011, 5145], [5015, 5149], [5019, 5153], [5023, 5157], [5027, 5161], [5031, 5165], [5035, 5169], [5039, 5173], [5043, 5177], [5047, 5181], [5051, 5185], [5055, 5189], [5059, 5193], [5063, 5197], [5092, 5198], [5091, 5093], [5064, 5092, 5094], [5093, 5095], [5094, 5096, 5199], [5095, 5097], [5065, 5096, 5098], [5097, 5099], [5098, 5100, 5200], [5099, 5101], [5066, 5100, 5102], [5101, 5103], [5102, 5104, 5201], [5103, 5105], [5067, 5104, 5106], [5105, 5107], [5106, 5108, 5202], [5107, 5109], [5068, 5108, 5110], [5109, 5111], [5110, 5112, 5203], [5111, 5113], [5069, 5112, 5114], [5113, 5115], [5114, 5116, 5204], [5115, 5117], [5070, 5116, 5118], [5117, 5119], [5118, 5120, 5205], [5119, 5121], [5071, 5120, 5122], [5121, 5123], [5122, 5124, 5206], [5123, 5125], [5072, 5124, 5126], [5125, 5127], [5126, 5128, 5207], [5127, 5129], [5073, 5128, 5130], [5129, 5131], [5130, 5132, 5208], [5131, 5133], [5074, 5132, 5134], [5133, 5135], [5134, 5136, 5209], [5135, 5137], [5075, 5136, 5138], [5137, 5139], [5138, 5140, 5210], [5139, 5141], [5076, 5140, 5142], [5141, 5143], [5142, 5144, 5211], [5143, 5145], [5077, 5144, 5146], [5145, 5147], [5146, 5148, 5212], [5147, 5149], [5078, 5148, 5150], [5149, 5151], [5150, 5152, 5213], [5151, 5153], [5079, 5152, 5154], [5153, 5155], [5154, 5156, 5214], [5155, 5157], [5080, 5156, 5158], [5157, 5159], [5158, 5160, 5215], [5159, 5161], [5081, 5160, 5162], [5161, 5163], [5162, 5164, 5216], [5163, 5165], [5082, 5164, 5166], [5165, 5167], [5166, 5168, 5217], [5167, 5169], [5083, 5168, 5170], [5169, 5171], [5170, 5172, 5218], [5171, 5173], [5084, 5172, 5174], [5173, 5175], [5174, 5176, 5219], [5175, 5177], [5085, 5176, 5178], [5177, 5179], [5178, 5180, 5220], [5179, 5181], [5086, 5180, 5182], [5181, 5183], [5182, 5184, 5221], [5183, 5185], [5087, 5184, 5186], [5185, 5187], [5186, 5188, 5222], [5187, 5189], [5088, 5188, 5190], [5189, 5191], [5190, 5192, 5223], [5191, 5193], [5089, 5192, 5194], [5193, 5195], [5194, 5196, 5224], [5195, 5197], [5090, 5196], [5091, 5225], [5095, 5229], [5099, 5233], [5103, 5237], [5107, 5241], [5111, 5245], [5115, 5249], [5119, 5253], [5123, 5257], [5127, 5261], [5131, 5265], [5135, 5269], [5139, 5273], [5143, 5277], [5147, 5281], [5151, 5285], [5155, 5289], [5159, 5293], [5163, 5297], [5167, 5301], [5171, 5305], [5175, 5309], [5179, 5313], [5183, 5317], [5187, 5321], [5191, 5325], [5195, 5329], [5198, 5226], [5225, 5227], [5226, 5228, 5332], [5227, 5229], [5199, 5228, 5230], [5229, 5231], [5230, 5232, 5333], [5231, 5233], [5200, 5232, 5234], [5233, 5235], [5234, 5236, 5334], [5235, 5237], [5201, 5236, 5238], [5237, 5239], [5238, 5240, 5335], [5239, 5241], [5202, 5240, 5242], [5241, 5243], [5242, 5244, 5336], [5243, 5245], [5203, 5244, 5246], [5245, 5247], [5246, 5248, 5337], [5247, 5249], [5204, 5248, 5250], [5249, 5251], [5250, 5252, 5338], [5251, 5253], [5205, 5252, 5254], [5253, 5255], [5254, 5256, 5339], [5255, 5257], [5206, 5256, 5258], [5257, 5259], [5258, 5260, 5340], [5259, 5261], [5207, 5260, 5262], [5261, 5263], [5262, 5264, 5341], [5263, 5265], [5208, 5264, 5266], [5265, 5267], [5266, 5268, 5342], [5267, 5269], [5209, 5268, 5270], [5269, 5271], [5270, 5272, 5343], [5271, 5273], [5210, 5272, 5274], [5273, 5275], [5274, 5276, 5344], [5275, 5277], [5211, 5276, 5278], [5277, 5279], [5278, 5280, 5345], [5279, 5281], [5212, 5280, 5282], [5281, 5283], [5282, 5284, 5346], [5283, 5285], [5213, 5284, 5286], [5285, 5287], [5286, 5288, 5347], [5287, 5289], [5214, 5288, 5290], [5289, 5291], [5290, 5292, 5348], [5291, 5293], [5215, 5292, 5294], [5293, 5295], [5294, 5296, 5349], [5295, 5297], [5216, 5296, 5298], [5297, 5299], [5298, 5300, 5350], [5299, 5301], [5217, 5300, 5302], [5301, 5303], [5302, 5304, 5351], [5303, 5305], [5218, 5304, 5306], [5305, 5307], [5306, 5308, 5352], [5307, 5309], [5219, 5308, 5310], [5309, 5311], [5310, 5312, 5353], [5311, 5313], [5220, 5312, 5314], [5313, 5315], [5314, 5316, 5354], [5315, 5317], [5221, 5316, 5318], [5317, 5319], [5318, 5320, 5355], [5319, 5321], [5222, 5320, 5322], [5321, 5323], [5322, 5324, 5356], [5323, 5325], [5223, 5324, 5326], [5325, 5327], [5326, 5328, 5357], [5327, 5329], [5224, 5328, 5330], [5329, 5331], [5330, 5358], [5227, 5361], [5231, 5365], [5235, 5369], [5239, 5373], [5243, 5377], [5247, 5381], [5251, 5385], [5255, 5389], [5259, 5393], [5263, 5397], [5267, 5401], [5271, 5405], [5275, 5409], [5279, 5413], [5283, 5417], [5287, 5421], [5291, 5425], [5295, 5429], [5299, 5433], [5303, 5437], [5307, 5441], [5311, 5445], [5315, 5449], [5319, 5453], [5323, 5457], [5327, 5461], [5331, 5465], [5360, 5466], [5359, 5361], [5332, 5360, 5362], [5361, 5363], [5362, 5364, 5467], [5363, 5365], [5333, 5364, 5366], [5365, 5367], [5366, 5368, 5468], [5367, 5369], [5334, 5368, 5370], [5369, 5371], [5370, 5372, 5469], [5371, 5373], [5335, 5372, 5374], [5373, 5375], [5374, 5376, 5470], [5375, 5377], [5336, 5376, 5378], [5377, 5379], [5378, 5380, 5471], [5379, 5381], [5337, 5380, 5382], [5381, 5383], [5382, 5384, 5472], [5383, 5385], [5338, 5384, 5386], [5385, 5387], [5386, 5388, 5473], [5387, 5389], [5339, 5388, 5390], [5389, 5391], [5390, 5392, 5474], [5391, 5393], [5340, 5392, 5394], [5393, 5395], [5394, 5396, 5475], [5395, 5397], [5341, 5396, 5398], [5397, 5399], [5398, 5400, 5476], [5399, 5401], [5342, 5400, 5402], [5401, 5403], [5402, 5404, 5477], [5403, 5405], [5343, 5404, 5406], [5405, 5407], [5406, 5408, 5478], [5407, 5409], [5344, 5408, 5410], [5409, 5411], [5410, 5412, 5479], [5411, 5413], [5345, 5412, 5414], [5413, 5415], [5414, 5416, 5480], [5415, 5417], [5346, 5416, 5418], [5417, 5419], [5418, 5420, 5481], [5419, 5421], [5347, 5420, 5422], [5421, 5423], [5422, 5424, 5482], [5423, 5425], [5348, 5424, 5426], [5425, 5427], [5426, 5428, 5483], [5427, 5429], [5349, 5428, 5430], [5429, 5431], [5430, 5432, 5484], [5431, 5433], [5350, 5432, 5434], [5433, 5435], [5434, 5436, 5485], [5435, 5437], [5351, 5436, 5438], [5437, 5439], [5438, 5440, 5486], [5439, 5441], [5352, 5440, 5442], [5441, 5443], [5442, 5444, 5487], [5443, 5445], [5353, 5444, 5446], [5445, 5447], [5446, 5448, 5488], [5447, 5449], [5354, 5448, 5450], [5449, 5451], [5450, 5452, 5489], [5451, 5453], [5355, 5452, 5454], [5453, 5455], [5454, 5456, 5490], [5455, 5457], [5356, 5456, 5458], [5457, 5459], [5458, 5460, 5491], [5459, 5461], [5357, 5460, 5462], [5461, 5463], [5462, 5464, 5492], [5463, 5465], [5358, 5464], [5359, 5493], [5363, 5497], [5367, 5501], [5371, 5505], [5375, 5509], [5379, 5513], [5383, 5517], [5387, 5521], [5391, 5525], [5395, 5529], [5399, 5533], [5403, 5537], [5407, 5541], [5411, 5545], [5415, 5549], [5419, 5553], [5423, 5557], [5427, 5561], [5431, 5565], [5435, 5569], [5439, 5573], [5443, 5577], [5447, 5581], [5451, 5585], [5455, 5589], [5459, 5593], [5463, 5597], [5466, 5494], [5493, 5495], [5494, 5496, 5600], [5495, 5497], [5467, 5496, 5498], [5497, 5499], [5498, 5500, 5601], [5499, 5501], [5468, 5500, 5502], [5501, 5503], [5502, 5504, 5602], [5503, 5505], [5469, 5504, 5506], [5505, 5507], [5506, 5508, 5603], [5507, 5509], [5470, 5508, 5510], [5509, 5511], [5510, 5512, 5604], [5511, 5513], [5471, 5512, 5514], [5513, 5515], [5514, 5516, 5605], [5515, 5517], [5472, 5516, 5518], [5517, 5519], [5518, 5520, 5606], [5519, 5521], [5473, 5520, 5522], [5521, 5523], [5522, 5524, 5607], [5523, 5525], [5474, 5524, 5526], [5525, 5527], [5526, 5528, 5608], [5527, 5529], [5475, 5528, 5530], [5529, 5531], [5530, 5532, 5609], [5531, 5533], [5476, 5532, 5534], [5533, 5535], [5534, 5536, 5610], [5535, 5537], [5477, 5536, 5538], [5537, 5539], [5538, 5540, 5611], [5539, 5541], [5478, 5540, 5542], [5541, 5543], [5542, 5544, 5612], [5543, 5545], [5479, 5544, 5546], [5545, 5547], [5546, 5548, 5613], [5547, 5549], [5480, 5548, 5550], [5549, 5551], [5550, 5552, 5614], [5551, 5553], [5481, 5552, 5554], [5553, 5555], [5554, 5556, 5615], [5555, 5557], [5482, 5556, 5558], [5557, 5559], [5558, 5560, 5616], [5559, 5561], [5483, 5560, 5562], [5561, 5563], [5562, 5564, 5617], [5563, 5565], [5484, 5564, 5566], [5565, 5567], [5566, 5568, 5618], [5567, 5569], [5485, 5568, 5570], [5569, 5571], [5570, 5572, 5619], [5571, 5573], [5486, 5572, 5574], [5573, 5575], [5574, 5576, 5620], [5575, 5577], [5487, 5576, 5578], [5577, 5579], [5578, 5580, 5621], [5579, 5581], [5488, 5580, 5582], [5581, 5583], [5582, 5584, 5622], [5583, 5585], [5489, 5584, 5586], [5585, 5587], [5586, 5588, 5623], [5587, 5589], [5490, 5588, 5590], [5589, 5591], [5590, 5592, 5624], [5591, 5593], [5491, 5592, 5594], [5593, 5595], [5594, 5596, 5625], [5595, 5597], [5492, 5596, 5598], [5597, 5599], [5598, 5626], [5495, 5629], [5499, 5633], [5503, 5637], [5507, 5641], [5511, 5645], [5515, 5649], [5519, 5653], [5523, 5657], [5527, 5661], [5531, 5665], [5535, 5669], [5539, 5673], [5543, 5677], [5547, 5681], [5551, 5685], [5555, 5689], [5559, 5693], [5563, 5697], [5567, 5701], [5571, 5705], [5575, 5709], [5579, 5713], [5583, 5717], [5587, 5721], [5591, 5725], [5595, 5729], [5599, 5733], [5628, 5734], [5627, 5629], [5600, 5628, 5630], [5629, 5631], [5630, 5632, 5735], [5631, 5633], [5601, 5632, 5634], [5633, 5635], [5634, 5636, 5736], [5635, 5637], [5602, 5636, 5638], [5637, 5639], [5638, 5640, 5737], [5639, 5641], [5603, 5640, 5642], [5641, 5643], [5642, 5644, 5738], [5643, 5645], [5604, 5644, 5646], [5645, 5647], [5646, 5648, 5739], [5647, 5649], [5605, 5648, 5650], [5649, 5651], [5650, 5652, 5740], [5651, 5653], [5606, 5652, 5654], [5653, 5655], [5654, 5656, 5741], [5655, 5657], [5607, 5656, 5658], [5657, 5659], [5658, 5660, 5742], [5659, 5661], [5608, 5660, 5662], [5661, 5663], [5662, 5664, 5743], [5663, 5665], [5609, 5664, 5666], [5665, 5667], [5666, 5668, 5744], [5667, 5669], [5610, 5668, 5670], [5669, 5671], [5670, 5672, 5745], [5671, 5673], [5611, 5672, 5674], [5673, 5675], [5674, 5676, 5746], [5675, 5677], [5612, 5676, 5678], [5677, 5679], [5678, 5680, 5747], [5679, 5681], [5613, 5680, 5682], [5681, 5683], [5682, 5684, 5748], [5683, 5685], [5614, 5684, 5686], [5685, 5687], [5686, 5688, 5749], [5687, 5689], [5615, 5688, 5690], [5689, 5691], [5690, 5692, 5750], [5691, 5693], [5616, 5692, 5694], [5693, 5695], [5694, 5696, 5751], [5695, 5697], [5617, 5696, 5698], [5697, 5699], [5698, 5700, 5752], [5699, 5701], [5618, 5700, 5702], [5701, 5703], [5702, 5704, 5753], [5703, 5705], [5619, 5704, 5706], [5705, 5707], [5706, 5708, 5754], [5707, 5709], [5620, 5708, 5710], [5709, 5711], [5710, 5712, 5755], [5711, 5713], [5621, 5712, 5714], [5713, 5715], [5714, 5716, 5756], [5715, 5717], [5622, 5716, 5718], [5717, 5719], [5718, 5720, 5757], [5719, 5721], [5623, 5720, 5722], [5721, 5723], [5722, 5724, 5758], [5723, 5725], [5624, 5724, 5726], [5725, 5727], [5726, 5728, 5759], [5727, 5729], [5625, 5728, 5730], [5729, 5731], [5730, 5732, 5760], [5731, 5733], [5626, 5732], [5627, 5761], [5631, 5765], [5635, 5769], [5639, 5773], [5643, 5777], [5647, 5781], [5651, 5785], [5655, 5789], [5659, 5793], [5663, 5797], [5667, 5801], [5671, 5805], [5675, 5809], [5679, 5813], [5683, 5817], [5687, 5821], [5691, 5825], [5695, 5829], [5699, 5833], [5703, 5837], [5707, 5841], [5711, 5845], [5715, 5849], [5719, 5853], [5723, 5857], [5727, 5861], [5731, 5865], [5734, 5762], [5761, 5763], [5762, 5764, 5868], [5763, 5765], [5735, 5764, 5766], [5765, 5767], [5766, 5768, 5869], [5767, 5769], [5736, 5768, 5770], [5769, 5771], [5770, 5772, 5870], [5771, 5773], [5737, 5772, 5774], [5773, 5775], [5774, 5776, 5871], [5775, 5777], [5738, 5776, 5778], [5777, 5779], [5778, 5780, 5872], [5779, 5781], [5739, 5780, 5782], [5781, 5783], [5782, 5784, 5873], [5783, 5785], [5740, 5784, 5786], [5785, 5787], [5786, 5788, 5874], [5787, 5789], [5741, 5788, 5790], [5789, 5791], [5790, 5792, 5875], [5791, 5793], [5742, 5792, 5794], [5793, 5795], [5794, 5796, 5876], [5795, 5797], [5743, 5796, 5798], [5797, 5799], [5798, 5800, 5877], [5799, 5801], [5744, 5800, 5802], [5801, 5803], [5802, 5804, 5878], [5803, 5805], [5745, 5804, 5806], [5805, 5807], [5806, 5808, 5879], [5807, 5809], [5746, 5808, 5810], [5809, 5811], [5810, 5812, 5880], [5811, 5813], [5747, 5812, 5814], [5813, 5815], [5814, 5816, 5881], [5815, 5817], [5748, 5816, 5818], [5817, 5819], [5818, 5820, 5882], [5819, 5821], [5749, 5820, 5822], [5821, 5823], [5822, 5824, 5883], [5823, 5825], [5750, 5824, 5826], [5825, 5827], [5826, 5828, 5884], [5827, 5829], [5751, 5828, 5830], [5829, 5831], [5830, 5832, 5885], [5831, 5833], [5752, 5832, 5834], [5833, 5835], [5834, 5836, 5886], [5835, 5837], [5753, 5836, 5838], [5837, 5839], [5838, 5840, 5887], [5839, 5841], [5754, 5840, 5842], [5841, 5843], [5842, 5844, 5888], [5843, 5845], [5755, 5844, 5846], [5845, 5847], [5846, 5848, 5889], [5847, 5849], [5756, 5848, 5850], [5849, 5851], [5850, 5852, 5890], [5851, 5853], [5757, 5852, 5854], [5853, 5855], [5854, 5856, 5891], [5855, 5857], [5758, 5856, 5858], [5857, 5859], [5858, 5860, 5892], [5859, 5861], [5759, 5860, 5862], [5861, 5863], [5862, 5864, 5893], [5863, 5865], [5760, 5864, 5866], [5865, 5867], [5866, 5894], [5763, 5897], [5767, 5901], [5771, 5905], [5775, 5909], [5779, 5913], [5783, 5917], [5787, 5921], [5791, 5925], [5795, 5929], [5799, 5933], [5803, 5937], [5807, 5941], [5811, 5945], [5815, 5949], [5819, 5953], [5823, 5957], [5827, 5961], [5831, 5965], [5835, 5969], [5839, 5973], [5843, 5977], [5847, 5981], [5851, 5985], [5855, 5989], [5859, 5993], [5863, 5997], [5867, 6001], [5896, 6002], [5895, 5897], [5868, 5896, 5898], [5897, 5899], [5898, 5900, 6003], [5899, 5901], [5869, 5900, 5902], [5901, 5903], [5902, 5904, 6004], [5903, 5905], [5870, 5904, 5906], [5905, 5907], [5906, 5908, 6005], [5907, 5909], [5871, 5908, 5910], [5909, 5911], [5910, 5912, 6006], [5911, 5913], [5872, 5912, 5914], [5913, 5915], [5914, 5916, 6007], [5915, 5917], [5873, 5916, 5918], [5917, 5919], [5918, 5920, 6008], [5919, 5921], [5874, 5920, 5922], [5921, 5923], [5922, 5924, 6009], [5923, 5925], [5875, 5924, 5926], [5925, 5927], [5926, 5928, 6010], [5927, 5929], [5876, 5928, 5930], [5929, 5931], [5930, 5932, 6011], [5931, 5933], [5877, 5932, 5934], [5933, 5935], [5934, 5936, 6012], [5935, 5937], [5878, 5936, 5938], [5937, 5939], [5938, 5940, 6013], [5939, 5941], [5879, 5940, 5942], [5941, 5943], [5942, 5944, 6014], [5943, 5945], [5880, 5944, 5946], [5945, 5947], [5946, 5948, 6015], [5947, 5949], [5881, 5948, 5950], [5949, 5951], [5950, 5952, 6016], [5951, 5953], [5882, 5952, 5954], [5953, 5955], [5954, 5956, 6017], [5955, 5957], [5883, 5956, 5958], [5957, 5959], [5958, 5960, 6018], [5959, 5961], [5884, 5960, 5962], [5961, 5963], [5962, 5964, 6019], [5963, 5965], [5885, 5964, 5966], [5965, 5967], [5966, 5968, 6020], [5967, 5969], [5886, 5968, 5970], [5969, 5971], [5970, 5972, 6021], [5971, 5973], [5887, 5972, 5974], [5973, 5975], [5974, 5976, 6022], [5975, 5977], [5888, 5976, 5978], [5977, 5979], [5978, 5980, 6023], [5979, 5981], [5889, 5980, 5982], [5981, 5983], [5982, 5984, 6024], [5983, 5985], [5890, 5984, 5986], [5985, 5987], [5986, 5988, 6025], [5987, 5989], [5891, 5988, 5990], [5989, 5991], [5990, 5992, 6026], [5991, 5993], [5892, 5992, 5994], [5993, 5995], [5994, 5996, 6027], [5995, 5997], [5893, 5996, 5998], [5997, 5999], [5998, 6000, 6028], [5999, 6001], [5894, 6000], [5895, 6029], [5899, 6033], [5903, 6037], [5907, 6041], [5911, 6045], [5915, 6049], [5919, 6053], [5923, 6057], [5927, 6061], [5931, 6065], [5935, 6069], [5939, 6073], [5943, 6077], [5947, 6081], [5951, 6085], [5955, 6089], [5959, 6093], [5963, 6097], [5967, 6101], [5971, 6105], [5975, 6109], [5979, 6113], [5983, 6117], [5987, 6121], [5991, 6125], [5995, 6129], [5999, 6133], [6002, 6030], [6029, 6031], [6030, 6032, 6136], [6031, 6033], [6003, 6032, 6034], [6033, 6035], [6034, 6036, 6137], [6035, 6037], [6004, 6036, 6038], [6037, 6039], [6038, 6040, 6138], [6039, 6041], [6005, 6040, 6042], [6041, 6043], [6042, 6044, 6139], [6043, 6045], [6006, 6044, 6046], [6045, 6047], [6046, 6048, 6140], [6047, 6049], [6007, 6048, 6050], [6049, 6051], [6050, 6052, 6141], [6051, 6053], [6008, 6052, 6054], [6053, 6055], [6054, 6056, 6142], [6055, 6057], [6009, 6056, 6058], [6057, 6059], [6058, 6060, 6143], [6059, 6061], [6010, 6060, 6062], [6061, 6063], [6062, 6064, 6144], [6063, 6065], [6011, 6064, 6066], [6065, 6067], [6066, 6068, 6145], [6067, 6069], [6012, 6068, 6070], [6069, 6071], [6070, 6072, 6146], [6071, 6073], [6013, 6072, 6074], [6073, 6075], [6074, 6076, 6147], [6075, 6077], [6014, 6076, 6078], [6077, 6079], [6078, 6080, 6148], [6079, 6081], [6015, 6080, 6082], [6081, 6083], [6082, 6084, 6149], [6083, 6085], [6016, 6084, 6086], [6085, 6087], [6086, 6088, 6150], [6087, 6089], [6017, 6088, 6090], [6089, 6091], [6090, 6092, 6151], [6091, 6093], [6018, 6092, 6094], [6093, 6095], [6094, 6096, 6152], [6095, 6097], [6019, 6096, 6098], [6097, 6099], [6098, 6100, 6153], [6099, 6101], [6020, 6100, 6102], [6101, 6103], [6102, 6104, 6154], [6103, 6105], [6021, 6104, 6106], [6105, 6107], [6106, 6108, 6155], [6107, 6109], [6022, 6108, 6110], [6109, 6111], [6110, 6112, 6156], [6111, 6113], [6023, 6112, 6114], [6113, 6115], [6114, 6116, 6157], [6115, 6117], [6024, 6116, 6118], [6117, 6119], [6118, 6120, 6158], [6119, 6121], [6025, 6120, 6122], [6121, 6123], [6122, 6124, 6159], [6123, 6125], [6026, 6124, 6126], [6125, 6127], [6126, 6128, 6160], [6127, 6129], [6027, 6128, 6130], [6129, 6131], [6130, 6132, 6161], [6131, 6133], [6028, 6132, 6134], [6133, 6135], [6134, 6162], [6031, 6165], [6035, 6169], [6039, 6173], [6043, 6177], [6047, 6181], [6051, 6185], [6055, 6189], [6059, 6193], [6063, 6197], [6067, 6201], [6071, 6205], [6075, 6209], [6079, 6213], [6083, 6217], [6087, 6221], [6091, 6225], [6095, 6229], [6099, 6233], [6103, 6237], [6107, 6241], [6111, 6245], [6115, 6249], [6119, 6253], [6123, 6257], [6127, 6261], [6131, 6265], [6135, 6269], [6164, 6270], [6163, 6165], [6136, 6164, 6166], [6165, 6167], [6166, 6168, 6271], [6167, 6169], [6137, 6168, 6170], [6169, 6171], [6170, 6172, 6272], [6171, 6173], [6138, 6172, 6174], [6173, 6175], [6174, 6176, 6273], [6175, 6177], [6139, 6176, 6178], [6177, 6179], [6178, 6180, 6274], [6179, 6181], [6140, 6180, 6182], [6181, 6183], [6182, 6184, 6275], [6183, 6185], [6141, 6184, 6186], [6185, 6187], [6186, 6188, 6276], [6187, 6189], [6142, 6188, 6190], [6189, 6191], [6190, 6192, 6277], [6191, 6193], [6143, 6192, 6194], [6193, 6195], [6194, 6196, 6278], [6195, 6197], [6144, 6196, 6198], [6197, 6199], [6198, 6200, 6279], [6199, 6201], [6145, 6200, 6202], [6201, 6203], [6202, 6204, 6280], [6203, 6205], [6146, 6204, 6206], [6205, 6207], [6206, 6208, 6281], [6207, 6209], [6147, 6208, 6210], [6209, 6211], [6210, 6212, 6282], [6211, 6213], [6148, 6212, 6214], [6213, 6215], [6214, 6216, 6283], [6215, 6217], [6149, 6216, 6218], [6217, 6219], [6218, 6220, 6284], [6219, 6221], [6150, 6220, 6222], [6221, 6223], [6222, 6224, 6285], [6223, 6225], [6151, 6224, 6226], [6225, 6227], [6226, 6228, 6286], [6227, 6229], [6152, 6228, 6230], [6229, 6231], [6230, 6232, 6287], [6231, 6233], [6153, 6232, 6234], [6233, 6235], [6234, 6236, 6288], [6235, 6237], [6154, 6236, 6238], [6237, 6239], [6238, 6240, 6289], [6239, 6241], [6155, 6240, 6242], [6241, 6243], [6242, 6244, 6290], [6243, 6245], [6156, 6244, 6246], [6245, 6247], [6246, 6248, 6291], [6247, 6249], [6157, 6248, 6250], [6249, 6251], [6250, 6252, 6292], [6251, 6253], [6158, 6252, 6254], [6253, 6255], [6254, 6256, 6293], [6255, 6257], [6159, 6256, 6258], [6257, 6259], [6258, 6260, 6294], [6259, 6261], [6160, 6260, 6262], [6261, 6263], [6262, 6264, 6295], [6263, 6265], [6161, 6264, 6266], [6265, 6267], [6266, 6268, 6296], [6267, 6269], [6162, 6268], [6163, 6297], [6167, 6301], [6171, 6305], [6175, 6309], [6179, 6313], [6183, 6317], [6187, 6321], [6191, 6325], [6195, 6329], [6199, 6333], [6203, 6337], [6207, 6341], [6211, 6345], [6215, 6349], [6219, 6353], [6223, 6357], [6227, 6361], [6231, 6365], [6235, 6369], [6239, 6373], [6243, 6377], [6247, 6381], [6251, 6385], [6255, 6389], [6259, 6393], [6263, 6397], [6267, 6401], [6270, 6298], [6297, 6299], [6298, 6300, 6404], [6299, 6301], [6271, 6300, 6302], [6301, 6303], [6302, 6304, 6405], [6303, 6305], [6272, 6304, 6306], [6305, 6307], [6306, 6308, 6406], [6307, 6309], [6273, 6308, 6310], [6309, 6311], [6310, 6312, 6407], [6311, 6313], [6274, 6312, 6314], [6313, 6315], [6314, 6316, 6408], [6315, 6317], [6275, 6316, 6318], [6317, 6319], [6318, 6320, 6409], [6319, 6321], [6276, 6320, 6322], [6321, 6323], [6322, 6324, 6410], [6323, 6325], [6277, 6324, 6326], [6325, 6327], [6326, 6328, 6411], [6327, 6329], [6278, 6328, 6330], [6329, 6331], [6330, 6332, 6412], [6331, 6333], [6279, 6332, 6334], [6333, 6335], [6334, 6336, 6413], [6335, 6337], [6280, 6336, 6338], [6337, 6339], [6338, 6340, 6414], [6339, 6341], [6281, 6340, 6342], [6341, 6343], [6342, 6344, 6415], [6343, 6345], [6282, 6344, 6346], [6345, 6347], [6346, 6348, 6416], [6347, 6349], [6283, 6348, 6350], [6349, 6351], [6350, 6352, 6417], [6351, 6353], [6284, 6352, 6354], [6353, 6355], [6354, 6356, 6418], [6355, 6357], [6285, 6356, 6358], [6357, 6359], [6358, 6360, 6419], [6359, 6361], [6286, 6360, 6362], [6361, 6363], [6362, 6364, 6420], [6363, 6365], [6287, 6364, 6366], [6365, 6367], [6366, 6368, 6421], [6367, 6369], [6288, 6368, 6370], [6369, 6371], [6370, 6372, 6422], [6371, 6373], [6289, 6372, 6374], [6373, 6375], [6374, 6376, 6423], [6375, 6377], [6290, 6376, 6378], [6377, 6379], [6378, 6380, 6424], [6379, 6381], [6291, 6380, 6382], [6381, 6383], [6382, 6384, 6425], [6383, 6385], [6292, 6384, 6386], [6385, 6387], [6386, 6388, 6426], [6387, 6389], [6293, 6388, 6390], [6389, 6391], [6390, 6392, 6427], [6391, 6393], [6294, 6392, 6394], [6393, 6395], [6394, 6396, 6428], [6395, 6397], [6295, 6396, 6398], [6397, 6399], [6398, 6400, 6429], [6399, 6401], [6296, 6400, 6402], [6401, 6403], [6402, 6430], [6299, 6433], [6303, 6437], [6307, 6441], [6311, 6445], [6315, 6449], [6319, 6453], [6323, 6457], [6327, 6461], [6331, 6465], [6335, 6469], [6339, 6473], [6343, 6477], [6347, 6481], [6351, 6485], [6355, 6489], [6359, 6493], [6363, 6497], [6367, 6501], [6371, 6505], [6375, 6509], [6379, 6513], [6383, 6517], [6387, 6521], [6391, 6525], [6395, 6529], [6399, 6533], [6403, 6537], [6432, 6538], [6431, 6433], [6404, 6432, 6434], [6433, 6435], [6434, 6436, 6539], [6435, 6437], [6405, 6436, 6438], [6437, 6439], [6438, 6440, 6540], [6439, 6441], [6406, 6440, 6442], [6441, 6443], [6442, 6444, 6541], [6443, 6445], [6407, 6444, 6446], [6445, 6447], [6446, 6448, 6542], [6447, 6449], [6408, 6448, 6450], [6449, 6451], [6450, 6452, 6543], [6451, 6453], [6409, 6452, 6454], [6453, 6455], [6454, 6456, 6544], [6455, 6457], [6410, 6456, 6458], [6457, 6459], [6458, 6460, 6545], [6459, 6461], [6411, 6460, 6462], [6461, 6463], [6462, 6464, 6546], [6463, 6465], [6412, 6464, 6466], [6465, 6467], [6466, 6468, 6547], [6467, 6469], [6413, 6468, 6470], [6469, 6471], [6470, 6472, 6548], [6471, 6473], [6414, 6472, 6474], [6473, 6475], [6474, 6476, 6549], [6475, 6477], [6415, 6476, 6478], [6477, 6479], [6478, 6480, 6550], [6479, 6481], [6416, 6480, 6482], [6481, 6483], [6482, 6484, 6551], [6483, 6485], [6417, 6484, 6486], [6485, 6487], [6486, 6488, 6552], [6487, 6489], [6418, 6488, 6490], [6489, 6491], [6490, 6492, 6553], [6491, 6493], [6419, 6492, 6494], [6493, 6495], [6494, 6496, 6554], [6495, 6497], [6420, 6496, 6498], [6497, 6499], [6498, 6500, 6555], [6499, 6501], [6421, 6500, 6502], [6501, 6503], [6502, 6504, 6556], [6503, 6505], [6422, 6504, 6506], [6505, 6507], [6506, 6508, 6557], [6507, 6509], [6423, 6508, 6510], [6509, 6511], [6510, 6512, 6558], [6511, 6513], [6424, 6512, 6514], [6513, 6515], [6514, 6516, 6559], [6515, 6517], [6425, 6516, 6518], [6517, 6519], [6518, 6520, 6560], [6519, 6521], [6426, 6520, 6522], [6521, 6523], [6522, 6524, 6561], [6523, 6525], [6427, 6524, 6526], [6525, 6527], [6526, 6528, 6562], [6527, 6529], [6428, 6528, 6530], [6529, 6531], [6530, 6532, 6563], [6531, 6533], [6429, 6532, 6534], [6533, 6535], [6534, 6536, 6564], [6535, 6537], [6430, 6536], [6431, 6565], [6435, 6569], [6439, 6573], [6443, 6577], [6447, 6581], [6451, 6585], [6455, 6589], [6459, 6593], [6463, 6597], [6467, 6601], [6471, 6605], [6475, 6609], [6479, 6613], [6483, 6617], [6487, 6621], [6491, 6625], [6495, 6629], [6499, 6633], [6503, 6637], [6507, 6641], [6511, 6645], [6515, 6649], [6519, 6653], [6523, 6657], [6527, 6661], [6531, 6665], [6535, 6669], [6538, 6566], [6565, 6567], [6566, 6568, 6672], [6567, 6569], [6539, 6568, 6570], [6569, 6571], [6570, 6572, 6673], [6571, 6573], [6540, 6572, 6574], [6573, 6575], [6574, 6576, 6674], [6575, 6577], [6541, 6576, 6578], [6577, 6579], [6578, 6580, 6675], [6579, 6581], [6542, 6580, 6582], [6581, 6583], [6582, 6584, 6676], [6583, 6585], [6543, 6584, 6586], [6585, 6587], [6586, 6588, 6677], [6587, 6589], [6544, 6588, 6590], [6589, 6591], [6590, 6592, 6678], [6591, 6593], [6545, 6592, 6594], [6593, 6595], [6594, 6596, 6679], [6595, 6597], [6546, 6596, 6598], [6597, 6599], [6598, 6600, 6680], [6599, 6601], [6547, 6600, 6602], [6601, 6603], [6602, 6604, 6681], [6603, 6605], [6548, 6604, 6606], [6605, 6607], [6606, 6608, 6682], [6607, 6609], [6549, 6608, 6610], [6609, 6611], [6610, 6612, 6683], [6611, 6613], [6550, 6612, 6614], [6613, 6615], [6614, 6616, 6684], [6615, 6617], [6551, 6616, 6618], [6617, 6619], [6618, 6620, 6685], [6619, 6621], [6552, 6620, 6622], [6621, 6623], [6622, 6624, 6686], [6623, 6625], [6553, 6624, 6626], [6625, 6627], [6626, 6628, 6687], [6627, 6629], [6554, 6628, 6630], [6629, 6631], [6630, 6632, 6688], [6631, 6633], [6555, 6632, 6634], [6633, 6635], [6634, 6636, 6689], [6635, 6637], [6556, 6636, 6638], [6637, 6639], [6638, 6640, 6690], [6639, 6641], [6557, 6640, 6642], [6641, 6643], [6642, 6644, 6691], [6643, 6645], [6558, 6644, 6646], [6645, 6647], [6646, 6648, 6692], [6647, 6649], [6559, 6648, 6650], [6649, 6651], [6650, 6652, 6693], [6651, 6653], [6560, 6652, 6654], [6653, 6655], [6654, 6656, 6694], [6655, 6657], [6561, 6656, 6658], [6657, 6659], [6658, 6660, 6695], [6659, 6661], [6562, 6660, 6662], [6661, 6663], [6662, 6664, 6696], [6663, 6665], [6563, 6664, 6666], [6665, 6667], [6666, 6668, 6697], [6667, 6669], [6564, 6668, 6670], [6669, 6671], [6670, 6698], [6567, 6701], [6571, 6705], [6575, 6709], [6579, 6713], [6583, 6717], [6587, 6721], [6591, 6725], [6595, 6729], [6599, 6733], [6603, 6737], [6607, 6741], [6611, 6745], [6615, 6749], [6619, 6753], [6623, 6757], [6627, 6761], [6631, 6765], [6635, 6769], [6639, 6773], [6643, 6777], [6647, 6781], [6651, 6785], [6655, 6789], [6659, 6793], [6663, 6797], [6667, 6801], [6671, 6805], [6700, 6806], [6699, 6701], [6672, 6700, 6702], [6701, 6703], [6702, 6704, 6807], [6703, 6705], [6673, 6704, 6706], [6705, 6707], [6706, 6708, 6808], [6707, 6709], [6674, 6708, 6710], [6709, 6711], [6710, 6712, 6809], [6711, 6713], [6675, 6712, 6714], [6713, 6715], [6714, 6716, 6810], [6715, 6717], [6676, 6716, 6718], [6717, 6719], [6718, 6720, 6811], [6719, 6721], [6677, 6720, 6722], [6721, 6723], [6722, 6724, 6812], [6723, 6725], [6678, 6724, 6726], [6725, 6727], [6726, 6728, 6813], [6727, 6729], [6679, 6728, 6730], [6729, 6731], [6730, 6732, 6814], [6731, 6733], [6680, 6732, 6734], [6733, 6735], [6734, 6736, 6815], [6735, 6737], [6681, 6736, 6738], [6737, 6739], [6738, 6740, 6816], [6739, 6741], [6682, 6740, 6742], [6741, 6743], [6742, 6744, 6817], [6743, 6745], [6683, 6744, 6746], [6745, 6747], [6746, 6748, 6818], [6747, 6749], [6684, 6748, 6750], [6749, 6751], [6750, 6752, 6819], [6751, 6753], [6685, 6752, 6754], [6753, 6755], [6754, 6756, 6820], [6755, 6757], [6686, 6756, 6758], [6757, 6759], [6758, 6760, 6821], [6759, 6761], [6687, 6760, 6762], [6761, 6763], [6762, 6764, 6822], [6763, 6765], [6688, 6764, 6766], [6765, 6767], [6766, 6768, 6823], [6767, 6769], [6689, 6768, 6770], [6769, 6771], [6770, 6772, 6824], [6771, 6773], [6690, 6772, 6774], [6773, 6775], [6774, 6776, 6825], [6775, 6777], [6691, 6776, 6778], [6777, 6779], [6778, 6780, 6826], [6779, 6781], [6692, 6780, 6782], [6781, 6783], [6782, 6784, 6827], [6783, 6785], [6693, 6784, 6786], [6785, 6787], [6786, 6788, 6828], [6787, 6789], [6694, 6788, 6790], [6789, 6791], [6790, 6792, 6829], [6791, 6793], [6695, 6792, 6794], [6793, 6795], [6794, 6796, 6830], [6795, 6797], [6696, 6796, 6798], [6797, 6799], [6798, 6800, 6831], [6799, 6801], [6697, 6800, 6802], [6801, 6803], [6802, 6804, 6832], [6803, 6805], [6698, 6804], [6699, 6833], [6703, 6837], [6707, 6841], [6711, 6845], [6715, 6849], [6719, 6853], [6723, 6857], [6727, 6861], [6731, 6865], [6735, 6869], [6739, 6873], [6743, 6877], [6747, 6881], [6751, 6885], [6755, 6889], [6759, 6893], [6763, 6897], [6767, 6901], [6771, 6905], [6775, 6909], [6779, 6913], [6783, 6917], [6787, 6921], [6791, 6925], [6795, 6929], [6799, 6933], [6803, 6937], [6806, 6834], [6833, 6835], [6834, 6836, 6940], [6835, 6837], [6807, 6836, 6838], [6837, 6839], [6838, 6840, 6941], [6839, 6841], [6808, 6840, 6842], [6841, 6843], [6842, 6844, 6942], [6843, 6845], [6809, 6844, 6846], [6845, 6847], [6846, 6848, 6943], [6847, 6849], [6810, 6848, 6850], [6849, 6851], [6850, 6852, 6944], [6851, 6853], [6811, 6852, 6854], [6853, 6855], [6854, 6856, 6945], [6855, 6857], [6812, 6856, 6858], [6857, 6859], [6858, 6860, 6946], [6859, 6861], [6813, 6860, 6862], [6861, 6863], [6862, 6864, 6947], [6863, 6865], [6814, 6864, 6866], [6865, 6867], [6866, 6868, 6948], [6867, 6869], [6815, 6868, 6870], [6869, 6871], [6870, 6872, 6949], [6871, 6873], [6816, 6872, 6874], [6873, 6875], [6874, 6876, 6950], [6875, 6877], [6817, 6876, 6878], [6877, 6879], [6878, 6880, 6951], [6879, 6881], [6818, 6880, 6882], [6881, 6883], [6882, 6884, 6952], [6883, 6885], [6819, 6884, 6886], [6885, 6887], [6886, 6888, 6953], [6887, 6889], [6820, 6888, 6890], [6889, 6891], [6890, 6892, 6954], [6891, 6893], [6821, 6892, 6894], [6893, 6895], [6894, 6896, 6955], [6895, 6897], [6822, 6896, 6898], [6897, 6899], [6898, 6900, 6956], [6899, 6901], [6823, 6900, 6902], [6901, 6903], [6902, 6904, 6957], [6903, 6905], [6824, 6904, 6906], [6905, 6907], [6906, 6908, 6958], [6907, 6909], [6825, 6908, 6910], [6909, 6911], [6910, 6912, 6959], [6911, 6913], [6826, 6912, 6914], [6913, 6915], [6914, 6916, 6960], [6915, 6917], [6827, 6916, 6918], [6917, 6919], [6918, 6920, 6961], [6919, 6921], [6828, 6920, 6922], [6921, 6923], [6922, 6924, 6962], [6923, 6925], [6829, 6924, 6926], [6925, 6927], [6926, 6928, 6963], [6927, 6929], [6830, 6928, 6930], [6929, 6931], [6930, 6932, 6964], [6931, 6933], [6831, 6932, 6934], [6933, 6935], [6934, 6936, 6965], [6935, 6937], [6832, 6936, 6938], [6937, 6939], [6938, 6966], [6835, 6968], [6839, 6972], [6843, 6976], [6847, 6980], [6851, 6984], [6855, 6988], [6859, 6992], [6863, 6996], [6867, 7000], [6871, 7004], [6875, 7008], [6879, 7012], [6883, 7016], [6887, 7020], [6891, 7024], [6895, 7028], [6899, 7032], [6903, 7036], [6907, 7040], [6911, 7044], [6915, 7048], [6919, 7052], [6923, 7056], [6927, 7060], [6931, 7064], [6935, 7068], [6939, 7072], [6968], [6940, 6967, 6969], [6968, 6970], [6969, 6971], [6970, 6972], [6941, 6971, 6973], [6972, 6974], [6973, 6975], [6974, 6976], [6942, 6975, 6977], [6976, 6978], [6977, 6979], [6978, 6980], [6943, 6979, 6981], [6980, 6982], [6981, 6983], [6982, 6984], [6944, 6983, 6985], [6984, 6986], [6985, 6987], [6986, 6988], [6945, 6987, 6989], [6988, 6990], [6989, 6991], [6990, 6992], [6946, 6991, 6993], [6992, 6994], [6993, 6995], [6994, 6996], [6947, 6995, 6997], [6996, 6998], [6997, 6999], [6998, 7000], [6948, 6999, 7001], [7000, 7002], [7001, 7003], [7002, 7004], [6949, 7003, 7005], [7004, 7006], [7005, 7007], [7006, 7008], [6950, 7007, 7009], [7008, 7010], [7009, 7011], [7010, 7012], [6951, 7011, 7013], [7012, 7014], [7013, 7015], [7014, 7016], [6952, 7015, 7017], [7016, 7018], [7017, 7019], [7018, 7020], [6953, 7019, 7021], [7020, 7022], [7021, 7023], [7022, 7024], [6954, 7023, 7025], [7024, 7026], [7025, 7027], [7026, 7028], [6955, 7027, 7029], [7028, 7030], [7029, 7031], [7030, 7032], [6956, 7031, 7033], [7032, 7034], [7033, 7035], [7034, 7036], [6957, 7035, 7037], [7036, 7038], [7037, 7039], [7038, 7040], [6958, 7039, 7041], [7040, 7042], [7041, 7043], [7042, 7044], [6959, 7043, 7045], [7044, 7046], [7045, 7047], [7046, 7048], [6960, 7047, 7049], [7048, 7050], [7049, 7051], [7050, 7052], [6961, 7051, 7053], [7052, 7054], [7053, 7055], [7054, 7056], [6962, 7055, 7057], [7056, 7058], [7057, 7059], [7058, 7060], [6963, 7059, 7061], [7060, 7062], [7061, 7063], [7062, 7064], [6964, 7063, 7065], [7064, 7066], [7065, 7067], [7066, 7068], [6965, 7067, 7069], [7068, 7070], [7069, 7071], [7070, 7072], [6966, 7071]] SGERROR: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1, 106], [0, 2], [1, 3], [2, 4], [3, 5, 107], [4, 6], [5, 7], [6, 8], [7, 9, 108], [8, 10], [9, 11], [10, 12], [11, 13, 109], [12, 14], [13, 15], [14, 16], [15, 17, 110], [16, 18], [17, 19], [18, 20], [19, 21, 111], [20, 22], [21, 23], [22, 24], [23, 25, 112], [24, 26], [25, 27], [26, 28], [27, 29, 113], [28, 30], [29, 31], [30, 32], [31, 33, 114], [32, 34], [33, 35], [34, 36], [35, 37, 115], [36, 38], [37, 39], [38, 40], [39, 41, 116], [40, 42], [41, 43], [42, 44], [43, 45, 117], [44, 46], [45, 47], [46, 48], [47, 49, 118], [48, 50], [49, 51], [50, 52], [51, 53, 119], [52, 54], [53, 55], [54, 56], [55, 57, 120], [56, 58], [57, 59], [58, 60], [59, 61, 121], [60, 62], [61, 63], [62, 64], [63, 65, 122], [64, 66], [65, 67], [66, 68], [67, 69, 123], [68, 70], [69, 71], [70, 72], [71, 73, 124], [72, 74], [73, 75], [74, 76], [75, 77, 125], [76, 78], [77, 79], [78, 80], [79, 81, 126], [80, 82], [81, 83], [82, 84], [83, 85, 127], [84, 86], [85, 87], [86, 88], [87, 89, 128], [88, 90], [89, 91], [90, 92], [91, 93, 129], [92, 94], [93, 95], [94, 96], [95, 97, 130], [96, 98], [97, 99], [98, 100], [99, 101, 131], [100, 102], [101, 103], [102, 104], [103, 105, 132], [104], [0, 133], [4, 137], [8, 141], [12, 145], [16, 149], [20, 153], [24, 157], [28, 161], [32, 165], [36, 169], [40, 173], [44, 177], [48, 181], [52, 185], [56, 189], [60, 193], [64, 197], [68, 201], [72, 205], [76, 209], [80, 213], [84, 217], [88, 221], [92, 225], [96, 229], [100, 233], [104, 237], [106, 134], [133, 135], [134, 136, 240], [135, 137], [107, 136, 138], [137, 139], [138, 140, 241], [139, 141], [108, 140, 142], [141, 143], [142, 144, 242], [143, 145], [109, 144, 146], [145, 147], [146, 148, 243], [147, 149], [110, 148, 150], [149, 151], [150, 152, 244], [151, 153], [111, 152, 154], [153, 155], [154, 156, 245], [155, 157], [112, 156, 158], [157, 159], [158, 160, 246], [159, 161], [113, 160, 162], [161, 163], [162, 164, 247], [163, 165], [114, 164, 166], [165, 167], [166, 168, 248], [167, 169], [115, 168, 170], [169, 171], [170, 172, 249], [171, 173], [116, 172, 174], [173, 175], [174, 176, 250], [175, 177], [117, 176, 178], [177, 179], [178, 180, 251], [179, 181], [118, 180, 182], [181, 183], [182, 184, 252], [183, 185], [119, 184, 186], [185, 187], [186, 188, 253], [187, 189], [120, 188, 190], [189, 191], [190, 192, 254], [191, 193], [121, 192, 194], [193, 195], [194, 196, 255], [195, 197], [122, 196, 198], [197, 199], [198, 200, 256], [199, 201], [123, 200, 202], [201, 203], [202, 204, 257], [203, 205], [124, 204, 206], [205, 207], [206, 208, 258], [207, 209], [125, 208, 210], [209, 211], [210, 212, 259], [211, 213], [126, 212, 214], [213, 215], [214, 216, 260], [215, 217], [127, 216, 218], [217, 219], [218, 220, 261], [219, 221], [128, 220, 222], [221, 223], [222, 224, 262], [223, 225], [129, 224, 226], [225, 227], [226, 228, 263], [227, 229], [130, 228, 230], [229, 231], [230, 232, 264], [231, 233], [131, 232, 234], [233, 235], [234, 236, 265], [235, 237], [132, 236, 238], [237, 239], [238, 266], [135, 269], [139, 273], [143, 277], [147, 281], [151, 285], [155, 289], [159, 293], [163, 297], [167, 301], [171, 305], [175, 309], [179, 313], [183, 317], [187, 321], [191, 325], [195, 329], [199, 333], [203, 337], [207, 341], [211, 345], [215, 349], [219, 353], [223, 357], [227, 361], [231, 365], [235, 369], [239, 373], [268, 374], [267, 269], [240, 268, 270], [269, 271], [270, 272, 375], [271, 273], [241, 272, 274], [273, 275], [274, 276, 376], [275, 277], [242, 276, 278], [277, 279], [278, 280, 377], [279, 281], [243, 280, 282], [281, 283], [282, 284, 378], [283, 285], [244, 284, 286], [285, 287], [286, 288, 379], [287, 289], [245, 288, 290], [289, 291], [290, 292, 380], [291, 293], [246, 292, 294], [293, 295], [294, 296, 381], [295, 297], [247, 296, 298], [297, 299], [298, 300, 382], [299, 301], [248, 300, 302], [301, 303], [302, 304, 383], [303, 305], [249, 304, 306], [305, 307], [306, 308, 384], [307, 309], [250, 308, 310], [309, 311], [310, 312, 385], [311, 313], [251, 312, 314], [313, 315], [314, 316, 386], [315, 317], [252, 316, 318], [317, 319], [318, 320, 387], [319, 321], [253, 320, 322], [321, 323], [322, 324, 388], [323, 325], [254, 324, 326], [325, 327], [326, 328, 389], [327, 329], [255, 328, 330], [329, 331], [330, 332, 390], [331, 333], [256, 332, 334], [333, 335], [334, 336, 391], [335, 337], [257, 336, 338], [337, 339], [338, 340, 392], [339, 341], [258, 340, 342], [341, 343], [342, 344, 393], [343, 345], [259, 344, 346], [345, 347], [346, 348, 394], [347, 349], [260, 348, 350], [349, 351], [350, 352, 395], [351, 353], [261, 352, 354], [353, 355], [354, 356, 396], [355, 357], [262, 356, 358], [357, 359], [358, 360, 397], [359, 361], [263, 360, 362], [361, 363], [362, 364, 398], [363, 365], [264, 364, 366], [365, 367], [366, 368, 399], [367, 369], [265, 368, 370], [369, 371], [370, 372, 400], [371, 373], [266, 372], [267, 401], [271, 405], [275, 409], [279, 413], [283, 417], [287, 421], [291, 425], [295, 429], [299, 433], [303, 437], [307, 441], [311, 445], [315, 449], [319, 453], [323, 457], [327, 461], [331, 465], [335, 469], [339, 473], [343, 477], [347, 481], [351, 485], [355, 489], [359, 493], [363, 497], [367, 501], [371, 505], [374, 402], [401, 403], [402, 404, 508], [403, 405], [375, 404, 406], [405, 407], [406, 408, 509], [407, 409], [376, 408, 410], [409, 411], [410, 412, 510], [411, 413], [377, 412, 414], [413, 415], [414, 416, 511], [415, 417], [378, 416, 418], [417, 419], [418, 420, 512], [419, 421], [379, 420, 422], [421, 423], [422, 424, 513], [423, 425], [380, 424, 426], [425, 427], [426, 428, 514], [427, 429], [381, 428, 430], [429, 431], [430, 432, 515], [431, 433], [382, 432, 434], [433, 435], [434, 436, 516], [435, 437], [383, 436, 438], [437, 439], [438, 440, 517], [439, 441], [384, 440, 442], [441, 443], [442, 444, 518], [443, 445], [385, 444, 446], [445, 447], [446, 448, 519], [447, 449], [386, 448, 450], [449, 451], [450, 452, 520], [451, 453], [387, 452, 454], [453, 455], [454, 456, 521], [455, 457], [388, 456, 458], [457, 459], [458, 460, 522], [459, 461], [389, 460, 462], [461, 463], [462, 464, 523], [463, 465], [390, 464, 466], [465, 467], [466, 468, 524], [467, 469], [391, 468, 470], [469, 471], [470, 472, 525], [471, 473], [392, 472, 474], [473, 475], [474, 476, 526], [475, 477], [393, 476, 478], [477, 479], [478, 480, 527], [479, 481], [394, 480, 482], [481, 483], [482, 484, 528], [483, 485], [395, 484, 486], [485, 487], [486, 488, 529], [487, 489], [396, 488, 490], [489, 491], [490, 492, 530], [491, 493], [397, 492, 494], [493, 495], [494, 496, 531], [495, 497], [398, 496, 498], [497, 499], [498, 500, 532], [499, 501], [399, 500, 502], [501, 503], [502, 504, 533], [503, 505], [400, 504, 506], [505, 507], [506, 534], [403, 537], [407, 541], [411, 545], [415, 549], [419, 553], [423, 557], [427, 561], [431, 565], [435, 569], [439, 573], [443, 577], [447, 581], [451, 585], [455, 589], [459, 593], [463, 597], [467, 601], [471, 605], [475, 609], [479, 613], [483, 617], [487, 621], [491, 625], [495, 629], [499, 633], [503, 637], [507, 641], [536, 642], [535, 537], [508, 536, 538], [537, 539], [538, 540, 643], [539, 541], [509, 540, 542], [541, 543], [542, 544, 644], [543, 545], [510, 544, 546], [545, 547], [546, 548, 645], [547, 549], [511, 548, 550], [549, 551], [550, 552, 646], [551, 553], [512, 552, 554], [553, 555], [554, 556, 647], [555, 557], [513, 556, 558], [557, 559], [558, 560, 648], [559, 561], [514, 560, 562], [561, 563], [562, 564, 649], [563, 565], [515, 564, 566], [565, 567], [566, 568, 650], [567, 569], [516, 568, 570], [569, 571], [570, 572, 651], [571, 573], [517, 572, 574], [573, 575], [574, 576, 652], [575, 577], [518, 576, 578], [577, 579], [578, 580, 653], [579, 581], [519, 580, 582], [581, 583], [582, 584, 654], [583, 585], [520, 584, 586], [585, 587], [586, 588, 655], [587, 589], [521, 588, 590], [589, 591], [590, 592, 656], [591, 593], [522, 592, 594], [593, 595], [594, 596, 657], [595, 597], [523, 596, 598], [597, 599], [598, 600, 658], [599, 601], [524, 600, 602], [601, 603], [602, 604, 659], [603, 605], [525, 604, 606], [605, 607], [606, 608, 660], [607, 609], [526, 608, 610], [609, 611], [610, 612, 661], [611, 613], [527, 612, 614], [613, 615], [614, 616, 662], [615, 617], [528, 616, 618], [617, 619], [618, 620, 663], [619, 621], [529, 620, 622], [621, 623], [622, 624, 664], [623, 625], [530, 624, 626], [625, 627], [626, 628, 665], [627, 629], [531, 628, 630], [629, 631], [630, 632, 666], [631, 633], [532, 632, 634], [633, 635], [634, 636, 667], [635, 637], [533, 636, 638], [637, 639], [638, 640, 668], [639, 641], [534, 640], [535, 669], [539, 673], [543, 677], [547, 681], [551, 685], [555, 689], [559, 693], [563, 697], [567, 701], [571, 705], [575, 709], [579, 713], [583, 717], [587, 721], [591, 725], [595, 729], [599, 733], [603, 737], [607, 741], [611, 745], [615, 749], [619, 753], [623, 757], [627, 761], [631, 765], [635, 769], [639, 773], [642, 670], [669, 671], [670, 672, 776], [671, 673], [643, 672, 674], [673, 675], [674, 676, 777], [675, 677], [644, 676, 678], [677, 679], [678, 680, 778], [679, 681], [645, 680, 682], [681, 683], [682, 684, 779], [683, 685], [646, 684, 686], [685, 687], [686, 688, 780], [687, 689], [647, 688, 690], [689, 691], [690, 692, 781], [691, 693], [648, 692, 694], [693, 695], [694, 696, 782], [695, 697], [649, 696, 698], [697, 699], [698, 700, 783], [699, 701], [650, 700, 702], [701, 703], [702, 704, 784], [703, 705], [651, 704, 706], [705, 707], [706, 708, 785], [707, 709], [652, 708, 710], [709, 711], [710, 712, 786], [711, 713], [653, 712, 714], [713, 715], [714, 716, 787], [715, 717], [654, 716, 718], [717, 719], [718, 720, 788], [719, 721], [655, 720, 722], [721, 723], [722, 724, 789], [723, 725], [656, 724, 726], [725, 727], [726, 728, 790], [727, 729], [657, 728, 730], [729, 731], [730, 732, 791], [731, 733], [658, 732, 734], [733, 735], [734, 736, 792], [735, 737], [659, 736, 738], [737, 739], [738, 740, 793], [739, 741], [660, 740, 742], [741, 743], [742, 744, 794], [743, 745], [661, 744, 746], [745, 747], [746, 748, 795], [747, 749], [662, 748, 750], [749, 751], [750, 752, 796], [751, 753], [663, 752, 754], [753, 755], [754, 756, 797], [755, 757], [664, 756, 758], [757, 759], [758, 760, 798], [759, 761], [665, 760, 762], [761, 763], [762, 764, 799], [763, 765], [666, 764, 766], [765, 767], [766, 768, 800], [767, 769], [667, 768, 770], [769, 771], [770, 772, 801], [771, 773], [668, 772, 774], [773, 775], [774, 802], [671, 805], [675, 809], [679, 813], [683, 817], [687, 821], [691, 825], [695, 829], [699, 833], [703, 837], [707, 841], [711, 845], [715, 849], [719, 853], [723, 857], [727, 861], [731, 865], [735, 869], [739, 873], [743, 877], [747, 881], [751, 885], [755, 889], [759, 893], [763, 897], [767, 901], [771, 905], [775, 909], [804, 910], [803, 805], [776, 804, 806], [805, 807], [806, 808, 911], [807, 809], [777, 808, 810], [809, 811], [810, 812, 912], [811, 813], [778, 812, 814], [813, 815], [814, 816, 913], [815, 817], [779, 816, 818], [817, 819], [818, 820, 914], [819, 821], [780, 820, 822], [821, 823], [822, 824, 915], [823, 825], [781, 824, 826], [825, 827], [826, 828, 916], [827, 829], [782, 828, 830], [829, 831], [830, 832, 917], [831, 833], [783, 832, 834], [833, 835], [834, 836, 918], [835, 837], [784, 836, 838], [837, 839], [838, 840, 919], [839, 841], [785, 840, 842], [841, 843], [842, 844, 920], [843, 845], [786, 844, 846], [845, 847], [846, 848, 921], [847, 849], [787, 848, 850], [849, 851], [850, 852, 922], [851, 853], [788, 852, 854], [853, 855], [854, 856, 923], [855, 857], [789, 856, 858], [857, 859], [858, 860, 924], [859, 861], [790, 860, 862], [861, 863], [862, 864, 925], [863, 865], [791, 864, 866], [865, 867], [866, 868, 926], [867, 869], [792, 868, 870], [869, 871], [870, 872, 927], [871, 873], [793, 872, 874], [873, 875], [874, 876, 928], [875, 877], [794, 876, 878], [877, 879], [878, 880, 929], [879, 881], [795, 880, 882], [881, 883], [882, 884, 930], [883, 885], [796, 884, 886], [885, 887], [886, 888, 931], [887, 889], [797, 888, 890], [889, 891], [890, 892, 932], [891, 893], [798, 892, 894], [893, 895], [894, 896, 933], [895, 897], [799, 896, 898], [897, 899], [898, 900, 934], [899, 901], [800, 900, 902], [901, 903], [902, 904, 935], [903, 905], [801, 904, 906], [905, 907], [906, 908, 936], [907, 909], [802, 908], [803, 937], [807, 941], [811, 945], [815, 949], [819, 953], [823, 957], [827, 961], [831, 965], [835, 969], [839, 973], [843, 977], [847, 981], [851, 985], [855, 989], [859, 993], [863, 997], [867, 1001], [871, 1005], [875, 1009], [879, 1013], [883, 1017], [887, 1021], [891, 1025], [895, 1029], [899, 1033], [903, 1037], [907, 1041], [910, 938], [937, 939], [938, 940, 1044], [939, 941], [911, 940, 942], [941, 943], [942, 944, 1045], [943, 945], [912, 944, 946], [945, 947], [946, 948, 1046], [947, 949], [913, 948, 950], [949, 951], [950, 952, 1047], [951, 953], [914, 952, 954], [953, 955], [954, 956, 1048], [955, 957], [915, 956, 958], [957, 959], [958, 960, 1049], [959, 961], [916, 960, 962], [961, 963], [962, 964, 1050], [963, 965], [917, 964, 966], [965, 967], [966, 968, 1051], [967, 969], [918, 968, 970], [969, 971], [970, 972, 1052], [971, 973], [919, 972, 974], [973, 975], [974, 976, 1053], [975, 977], [920, 976, 978], [977, 979], [978, 980, 1054], [979, 981], [921, 980, 982], [981, 983], [982, 984, 1055], [983, 985], [922, 984, 986], [985, 987], [986, 988, 1056], [987, 989], [923, 988, 990], [989, 991], [990, 992, 1057], [991, 993], [924, 992, 994], [993, 995], [994, 996, 1058], [995, 997], [925, 996, 998], [997, 999], [998, 1000, 1059], [999, 1001], [926, 1000, 1002], [1001, 1003], [1002, 1004, 1060], [1003, 1005], [927, 1004, 1006], [1005, 1007], [1006, 1008, 1061], [1007, 1009], [928, 1008, 1010], [1009, 1011], [1010, 1012, 1062], [1011, 1013], [929, 1012, 1014], [1013, 1015], [1014, 1016, 1063], [1015, 1017], [930, 1016, 1018], [1017, 1019], [1018, 1020, 1064], [1019, 1021], [931, 1020, 1022], [1021, 1023], [1022, 1024, 1065], [1023, 1025], [932, 1024, 1026], [1025, 1027], [1026, 1028, 1066], [1027, 1029], [933, 1028, 1030], [1029, 1031], [1030, 1032, 1067], [1031, 1033], [934, 1032, 1034], [1033, 1035], [1034, 1036, 1068], [1035, 1037], [935, 1036, 1038], [1037, 1039], [1038, 1040, 1069], [1039, 1041], [936, 1040, 1042], [1041, 1043], [1042, 1070], [939, 1073], [943, 1077], [947, 1081], [951, 1085], [955, 1089], [959, 1093], [963, 1097], [967, 1101], [971, 1105], [975, 1109], [979, 1113], [983, 1117], [987, 1121], [991, 1125], [995, 1129], [999, 1133], [1003, 1137], [1007, 1141], [1011, 1145], [1015, 1149], [1019, 1153], [1023, 1157], [1027, 1161], [1031, 1165], [1035, 1169], [1039, 1173], [1043, 1177], [1072, 1178], [1071, 1073], [1044, 1072, 1074], [1073, 1075], [1074, 1076, 1179], [1075, 1077], [1045, 1076, 1078], [1077, 1079], [1078, 1080, 1180], [1079, 1081], [1046, 1080, 1082], [1081, 1083], [1082, 1084, 1181], [1083, 1085], [1047, 1084, 1086], [1085, 1087], [1086, 1088, 1182], [1087, 1089], [1048, 1088, 1090], [1089, 1091], [1090, 1092, 1183], [1091, 1093], [1049, 1092, 1094], [1093, 1095], [1094, 1096, 1184], [1095, 1097], [1050, 1096, 1098], [1097, 1099], [1098, 1100, 1185], [1099, 1101], [1051, 1100, 1102], [1101, 1103], [1102, 1104, 1186], [1103, 1105], [1052, 1104, 1106], [1105, 1107], [1106, 1108, 1187], [1107, 1109], [1053, 1108, 1110], [1109, 1111], [1110, 1112, 1188], [1111, 1113], [1054, 1112, 1114], [1113, 1115], [1114, 1116, 1189], [1115, 1117], [1055, 1116, 1118], [1117, 1119], [1118, 1120, 1190], [1119, 1121], [1056, 1120, 1122], [1121, 1123], [1122, 1124, 1191], [1123, 1125], [1057, 1124, 1126], [1125, 1127], [1126, 1128, 1192], [1127, 1129], [1058, 1128, 1130], [1129, 1131], [1130, 1132, 1193], [1131, 1133], [1059, 1132, 1134], [1133, 1135], [1134, 1136, 1194], [1135, 1137], [1060, 1136, 1138], [1137, 1139], [1138, 1140, 1195], [1139, 1141], [1061, 1140, 1142], [1141, 1143], [1142, 1144, 1196], [1143, 1145], [1062, 1144, 1146], [1145, 1147], [1146, 1148, 1197], [1147, 1149], [1063, 1148, 1150], [1149, 1151], [1150, 1152, 1198], [1151, 1153], [1064, 1152, 1154], [1153, 1155], [1154, 1156, 1199], [1155, 1157], [1065, 1156, 1158], [1157, 1159], [1158, 1160, 1200], [1159, 1161], [1066, 1160, 1162], [1161, 1163], [1162, 1164, 1201], [1163, 1165], [1067, 1164, 1166], [1165, 1167], [1166, 1168, 1202], [1167, 1169], [1068, 1168, 1170], [1169, 1171], [1170, 1172, 1203], [1171, 1173], [1069, 1172, 1174], [1173, 1175], [1174, 1176, 1204], [1175, 1177], [1070, 1176], [1071, 1205], [1075, 1209], [1079, 1213], [1083, 1217], [1087, 1221], [1091, 1225], [1095, 1229], [1099, 1233], [1103, 1237], [1107, 1241], [1111, 1245], [1115, 1249], [1119, 1253], [1123, 1257], [1127, 1261], [1131, 1265], [1135, 1269], [1139, 1273], [1143, 1277], [1147, 1281], [1151, 1285], [1155, 1289], [1159, 1293], [1163, 1297], [1167, 1301], [1171, 1305], [1175, 1309], [1178, 1206], [1205, 1207], [1206, 1208, 1312], [1207, 1209], [1179, 1208, 1210], [1209, 1211], [1210, 1212, 1313], [1211, 1213], [1180, 1212, 1214], [1213, 1215], [1214, 1216, 1314], [1215, 1217], [1181, 1216, 1218], [1217, 1219], [1218, 1220, 1315], [1219, 1221], [1182, 1220, 1222], [1221, 1223], [1222, 1224, 1316], [1223, 1225], [1183, 1224, 1226], [1225, 1227], [1226, 1228, 1317], [1227, 1229], [1184, 1228, 1230], [1229, 1231], [1230, 1232, 1318], [1231, 1233], [1185, 1232, 1234], [1233, 1235], [1234, 1236, 1319], [1235, 1237], [1186, 1236, 1238], [1237, 1239], [1238, 1240, 1320], [1239, 1241], [1187, 1240, 1242], [1241, 1243], [1242, 1244, 1321], [1243, 1245], [1188, 1244, 1246], [1245, 1247], [1246, 1248, 1322], [1247, 1249], [1189, 1248, 1250], [1249, 1251], [1250, 1252, 1323], [1251, 1253], [1190, 1252, 1254], [1253, 1255], [1254, 1256, 1324], [1255, 1257], [1191, 1256, 1258], [1257, 1259], [1258, 1260, 1325], [1259, 1261], [1192, 1260, 1262], [1261, 1263], [1262, 1264, 1326], [1263, 1265], [1193, 1264, 1266], [1265, 1267], [1266, 1268, 1327], [1267, 1269], [1194, 1268, 1270], [1269, 1271], [1270, 1272, 1328], [1271, 1273], [1195, 1272, 1274], [1273, 1275], [1274, 1276, 1329], [1275, 1277], [1196, 1276, 1278], [1277, 1279], [1278, 1280, 1330], [1279, 1281], [1197, 1280, 1282], [1281, 1283], [1282, 1284, 1331], [1283, 1285], [1198, 1284, 1286], [1285, 1287], [1286, 1288, 1332], [1287, 1289], [1199, 1288, 1290], [1289, 1291], [1290, 1292, 1333], [1291, 1293], [1200, 1292, 1294], [1293, 1295], [1294, 1296, 1334], [1295, 1297], [1201, 1296, 1298], [1297, 1299], [1298, 1300, 1335], [1299, 1301], [1202, 1300, 1302], [1301, 1303], [1302, 1304, 1336], [1303, 1305], [1203, 1304, 1306], [1305, 1307], [1306, 1308, 1337], [1307, 1309], [1204, 1308, 1310], [1309, 1311], [1310, 1338], [1207, 1341], [1211, 1345], [1215, 1349], [1219, 1353], [1223, 1357], [1227, 1361], [1231, 1365], [1235, 1369], [1239, 1373], [1243, 1377], [1247, 1381], [1251, 1385], [1255, 1389], [1259, 1393], [1263, 1397], [1267, 1401], [1271, 1405], [1275, 1409], [1279, 1413], [1283, 1417], [1287, 1421], [1291, 1425], [1295, 1429], [1299, 1433], [1303, 1437], [1307, 1441], [1311, 1445], [1340, 1446], [1339, 1341], [1312, 1340, 1342], [1341, 1343], [1342, 1344, 1447], [1343, 1345], [1313, 1344, 1346], [1345, 1347], [1346, 1348, 1448], [1347, 1349], [1314, 1348, 1350], [1349, 1351], [1350, 1352, 1449], [1351, 1353], [1315, 1352, 1354], [1353, 1355], [1354, 1356, 1450], [1355, 1357], [1316, 1356, 1358], [1357, 1359], [1358, 1360, 1451], [1359, 1361], [1317, 1360, 1362], [1361, 1363], [1362, 1364, 1452], [1363, 1365], [1318, 1364, 1366], [1365, 1367], [1366, 1368, 1453], [1367, 1369], [1319, 1368, 1370], [1369, 1371], [1370, 1372, 1454], [1371, 1373], [1320, 1372, 1374], [1373, 1375], [1374, 1376, 1455], [1375, 1377], [1321, 1376, 1378], [1377, 1379], [1378, 1380, 1456], [1379, 1381], [1322, 1380, 1382], [1381, 1383], [1382, 1384, 1457], [1383, 1385], [1323, 1384, 1386], [1385, 1387], [1386, 1388, 1458], [1387, 1389], [1324, 1388, 1390], [1389, 1391], [1390, 1392, 1459], [1391, 1393], [1325, 1392, 1394], [1393, 1395], [1394, 1396, 1460], [1395, 1397], [1326, 1396, 1398], [1397, 1399], [1398, 1400, 1461], [1399, 1401], [1327, 1400, 1402], [1401, 1403], [1402, 1404, 1462], [1403, 1405], [1328, 1404, 1406], [1405, 1407], [1406, 1408, 1463], [1407, 1409], [1329, 1408, 1410], [1409, 1411], [1410, 1412, 1464], [1411, 1413], [1330, 1412, 1414], [1413, 1415], [1414, 1416, 1465], [1415, 1417], [1331, 1416, 1418], [1417, 1419], [1418, 1420, 1466], [1419, 1421], [1332, 1420, 1422], [1421, 1423], [1422, 1424, 1467], [1423, 1425], [1333, 1424, 1426], [1425, 1427], [1426, 1428, 1468], [1427, 1429], [1334, 1428, 1430], [1429, 1431], [1430, 1432, 1469], [1431, 1433], [1335, 1432, 1434], [1433, 1435], [1434, 1436, 1470], [1435, 1437], [1336, 1436, 1438], [1437, 1439], [1438, 1440, 1471], [1439, 1441], [1337, 1440, 1442], [1441, 1443], [1442, 1444, 1472], [1443, 1445], [1338, 1444], [1339, 1473], [1343, 1477], [1347, 1481], [1351, 1485], [1355, 1489], [1359, 1493], [1363, 1497], [1367, 1501], [1371, 1505], [1375, 1509], [1379, 1513], [1383, 1517], [1387, 1521], [1391, 1525], [1395, 1529], [1399, 1533], [1403, 1537], [1407, 1541], [1411, 1545], [1415, 1549], [1419, 1553], [1423, 1557], [1427, 1561], [1431, 1565], [1435, 1569], [1439, 1573], [1443, 1577], [1446, 1474], [1473, 1475], [1474, 1476, 1580], [1475, 1477], [1447, 1476, 1478], [1477, 1479], [1478, 1480, 1581], [1479, 1481], [1448, 1480, 1482], [1481, 1483], [1482, 1484, 1582], [1483, 1485], [1449, 1484, 1486], [1485, 1487], [1486, 1488, 1583], [1487, 1489], [1450, 1488, 1490], [1489, 1491], [1490, 1492, 1584], [1491, 1493], [1451, 1492, 1494], [1493, 1495], [1494, 1496, 1585], [1495, 1497], [1452, 1496, 1498], [1497, 1499], [1498, 1500, 1586], [1499, 1501], [1453, 1500, 1502], [1501, 1503], [1502, 1504, 1587], [1503, 1505], [1454, 1504, 1506], [1505, 1507], [1506, 1508, 1588], [1507, 1509], [1455, 1508, 1510], [1509, 1511], [1510, 1512, 1589], [1511, 1513], [1456, 1512, 1514], [1513, 1515], [1514, 1516, 1590], [1515, 1517], [1457, 1516, 1518], [1517, 1519], [1518, 1520, 1591], [1519, 1521], [1458, 1520, 1522], [1521, 1523], [1522, 1524, 1592], [1523, 1525], [1459, 1524, 1526], [1525, 1527], [1526, 1528, 1593], [1527, 1529], [1460, 1528, 1530], [1529, 1531], [1530, 1532, 1594], [1531, 1533], [1461, 1532, 1534], [1533, 1535], [1534, 1536, 1595], [1535, 1537], [1462, 1536, 1538], [1537, 1539], [1538, 1540, 1596], [1539, 1541], [1463, 1540, 1542], [1541, 1543], [1542, 1544, 1597], [1543, 1545], [1464, 1544, 1546], [1545, 1547], [1546, 1548, 1598], [1547, 1549], [1465, 1548, 1550], [1549, 1551], [1550, 1552, 1599], [1551, 1553], [1466, 1552, 1554], [1553, 1555], [1554, 1556, 1600], [1555, 1557], [1467, 1556, 1558], [1557, 1559], [1558, 1560, 1601], [1559, 1561], [1468, 1560, 1562], [1561, 1563], [1562, 1564, 1602], [1563, 1565], [1469, 1564, 1566], [1565, 1567], [1566, 1568, 1603], [1567, 1569], [1470, 1568, 1570], [1569, 1571], [1570, 1572, 1604], [1571, 1573], [1471, 1572, 1574], [1573, 1575], [1574, 1576, 1605], [1575, 1577], [1472, 1576, 1578], [1577, 1579], [1578, 1606], [1475, 1609], [1479, 1613], [1483, 1617], [1487, 1621], [1491, 1625], [1495, 1629], [1499, 1633], [1503, 1637], [1507, 1641], [1511, 1645], [1515, 1649], [1519, 1653], [1523, 1657], [1527, 1661], [1531, 1665], [1535, 1669], [1539, 1673], [1543, 1677], [1547, 1681], [1551, 1685], [1555, 1689], [1559, 1693], [1563, 1697], [1567, 1701], [1571, 1705], [1575, 1709], [1579, 1713], [1608, 1714], [1607, 1609], [1580, 1608, 1610], [1609, 1611], [1610, 1612, 1715], [1611, 1613], [1581, 1612, 1614], [1613, 1615], [1614, 1616, 1716], [1615, 1617], [1582, 1616, 1618], [1617, 1619], [1618, 1620, 1717], [1619, 1621], [1583, 1620, 1622], [1621, 1623], [1622, 1624, 1718], [1623, 1625], [1584, 1624, 1626], [1625, 1627], [1626, 1628, 1719], [1627, 1629], [1585, 1628, 1630], [1629, 1631], [1630, 1632, 1720], [1631, 1633], [1586, 1632, 1634], [1633, 1635], [1634, 1636, 1721], [1635, 1637], [1587, 1636, 1638], [1637, 1639], [1638, 1640, 1722], [1639, 1641], [1588, 1640, 1642], [1641, 1643], [1642, 1644, 1723], [1643, 1645], [1589, 1644, 1646], [1645, 1647], [1646, 1648, 1724], [1647, 1649], [1590, 1648, 1650], [1649, 1651], [1650, 1652, 1725], [1651, 1653], [1591, 1652, 1654], [1653, 1655], [1654, 1656, 1726], [1655, 1657], [1592, 1656, 1658], [1657, 1659], [1658, 1660, 1727], [1659, 1661], [1593, 1660, 1662], [1661, 1663], [1662, 1664, 1728], [1663, 1665], [1594, 1664, 1666], [1665, 1667], [1666, 1668, 1729], [1667, 1669], [1595, 1668, 1670], [1669, 1671], [1670, 1672, 1730], [1671, 1673], [1596, 1672, 1674], [1673, 1675], [1674, 1676, 1731], [1675, 1677], [1597, 1676, 1678], [1677, 1679], [1678, 1680, 1732], [1679, 1681], [1598, 1680, 1682], [1681, 1683], [1682, 1684, 1733], [1683, 1685], [1599, 1684, 1686], [1685, 1687], [1686, 1688, 1734], [1687, 1689], [1600, 1688, 1690], [1689, 1691], [1690, 1692, 1735], [1691, 1693], [1601, 1692, 1694], [1693, 1695], [1694, 1696, 1736], [1695, 1697], [1602, 1696, 1698], [1697, 1699], [1698, 1700, 1737], [1699, 1701], [1603, 1700, 1702], [1701, 1703], [1702, 1704, 1738], [1703, 1705], [1604, 1704, 1706], [1705, 1707], [1706, 1708, 1739], [1707, 1709], [1605, 1708, 1710], [1709, 1711], [1710, 1712, 1740], [1711, 1713], [1606, 1712], [1607, 1741], [1611, 1745], [1615, 1749], [1619, 1753], [1623, 1757], [1627, 1761], [1631, 1765], [1635, 1769], [1639, 1773], [1643, 1777], [1647, 1781], [1651, 1785], [1655, 1789], [1659, 1793], [1663, 1797], [1667, 1801], [1671, 1805], [1675, 1809], [1679, 1813], [1683, 1817], [1687, 1821], [1691, 1825], [1695, 1829], [1699, 1833], [1703, 1837], [1707, 1841], [1711, 1845], [1714, 1742], [1741, 1743], [1742, 1744, 1848], [1743, 1745], [1715, 1744, 1746], [1745, 1747], [1746, 1748, 1849], [1747, 1749], [1716, 1748, 1750], [1749, 1751], [1750, 1752, 1850], [1751, 1753], [1717, 1752, 1754], [1753, 1755], [1754, 1756, 1851], [1755, 1757], [1718, 1756, 1758], [1757, 1759], [1758, 1760, 1852], [1759, 1761], [1719, 1760, 1762], [1761, 1763], [1762, 1764, 1853], [1763, 1765], [1720, 1764, 1766], [1765, 1767], [1766, 1768, 1854], [1767, 1769], [1721, 1768, 1770], [1769, 1771], [1770, 1772, 1855], [1771, 1773], [1722, 1772, 1774], [1773, 1775], [1774, 1776, 1856], [1775, 1777], [1723, 1776, 1778], [1777, 1779], [1778, 1780, 1857], [1779, 1781], [1724, 1780, 1782], [1781, 1783], [1782, 1784, 1858], [1783, 1785], [1725, 1784, 1786], [1785, 1787], [1786, 1788, 1859], [1787, 1789], [1726, 1788, 1790], [1789, 1791], [1790, 1792, 1860], [1791, 1793], [1727, 1792, 1794], [1793, 1795], [1794, 1796, 1861], [1795, 1797], [1728, 1796, 1798], [1797, 1799], [1798, 1800, 1862], [1799, 1801], [1729, 1800, 1802], [1801, 1803], [1802, 1804, 1863], [1803, 1805], [1730, 1804, 1806], [1805, 1807], [1806, 1808, 1864], [1807, 1809], [1731, 1808, 1810], [1809, 1811], [1810, 1812, 1865], [1811, 1813], [1732, 1812, 1814], [1813, 1815], [1814, 1816, 1866], [1815, 1817], [1733, 1816, 1818], [1817, 1819], [1818, 1820, 1867], [1819, 1821], [1734, 1820, 1822], [1821, 1823], [1822, 1824, 1868], [1823, 1825], [1735, 1824, 1826], [1825, 1827], [1826, 1828, 1869], [1827, 1829], [1736, 1828, 1830], [1829, 1831], [1830, 1832, 1870], [1831, 1833], [1737, 1832, 1834], [1833, 1835], [1834, 1836, 1871], [1835, 1837], [1738, 1836, 1838], [1837, 1839], [1838, 1840, 1872], [1839, 1841], [1739, 1840, 1842], [1841, 1843], [1842, 1844, 1873], [1843, 1845], [1740, 1844, 1846], [1845, 1847], [1846, 1874], [1743, 1877], [1747, 1881], [1751, 1885], [1755, 1889], [1759, 1893], [1763, 1897], [1767, 1901], [1771, 1905], [1775, 1909], [1779, 1913], [1783, 1917], [1787, 1921], [1791, 1925], [1795, 1929], [1799, 1933], [1803, 1937], [1807, 1941], [1811, 1945], [1815, 1949], [1819, 1953], [1823, 1957], [1827, 1961], [1831, 1965], [1835, 1969], [1839, 1973], [1843, 1977], [1847, 1981], [1876, 1982], [1875, 1877], [1848, 1876, 1878], [1877, 1879], [1878, 1880, 1983], [1879, 1881], [1849, 1880, 1882], [1881, 1883], [1882, 1884, 1984], [1883, 1885], [1850, 1884, 1886], [1885, 1887], [1886, 1888, 1985], [1887, 1889], [1851, 1888, 1890], [1889, 1891], [1890, 1892, 1986], [1891, 1893], [1852, 1892, 1894], [1893, 1895], [1894, 1896, 1987], [1895, 1897], [1853, 1896, 1898], [1897, 1899], [1898, 1900, 1988], [1899, 1901], [1854, 1900, 1902], [1901, 1903], [1902, 1904, 1989], [1903, 1905], [1855, 1904, 1906], [1905, 1907], [1906, 1908, 1990], [1907, 1909], [1856, 1908, 1910], [1909, 1911], [1910, 1912, 1991], [1911, 1913], [1857, 1912, 1914], [1913, 1915], [1914, 1916, 1992], [1915, 1917], [1858, 1916, 1918], [1917, 1919], [1918, 1920, 1993], [1919, 1921], [1859, 1920, 1922], [1921, 1923], [1922, 1924, 1994], [1923, 1925], [1860, 1924, 1926], [1925, 1927], [1926, 1928, 1995], [1927, 1929], [1861, 1928, 1930], [1929, 1931], [1930, 1932, 1996], [1931, 1933], [1862, 1932, 1934], [1933, 1935], [1934, 1936, 1997], [1935, 1937], [1863, 1936, 1938], [1937, 1939], [1938, 1940, 1998], [1939, 1941], [1864, 1940, 1942], [1941, 1943], [1942, 1944, 1999], [1943, 1945], [1865, 1944, 1946], [1945, 1947], [1946, 1948, 2000], [1947, 1949], [1866, 1948, 1950], [1949, 1951], [1950, 1952, 2001], [1951, 1953], [1867, 1952, 1954], [1953, 1955], [1954, 1956, 2002], [1955, 1957], [1868, 1956, 1958], [1957, 1959], [1958, 1960, 2003], [1959, 1961], [1869, 1960, 1962], [1961, 1963], [1962, 1964, 2004], [1963, 1965], [1870, 1964, 1966], [1965, 1967], [1966, 1968, 2005], [1967, 1969], [1871, 1968, 1970], [1969, 1971], [1970, 1972, 2006], [1971, 1973], [1872, 1972, 1974], [1973, 1975], [1974, 1976, 2007], [1975, 1977], [1873, 1976, 1978], [1977, 1979], [1978, 1980, 2008], [1979, 1981], [1874, 1980], [1875, 2009], [1879, 2013], [1883, 2017], [1887, 2021], [1891, 2025], [1895, 2029], [1899, 2033], [1903, 2037], [1907, 2041], [1911, 2045], [1915, 2049], [1919, 2053], [1923, 2057], [1927, 2061], [1931, 2065], [1935, 2069], [1939, 2073], [1943, 2077], [1947, 2081], [1951, 2085], [1955, 2089], [1959, 2093], [1963, 2097], [1967, 2101], [1971, 2105], [1975, 2109], [1979, 2113], [1982, 2010], [2009, 2011], [2010, 2012, 2116], [2011, 2013], [1983, 2012, 2014], [2013, 2015], [2014, 2016, 2117], [2015, 2017], [1984, 2016, 2018], [2017, 2019], [2018, 2020, 2118], [2019, 2021], [1985, 2020, 2022], [2021, 2023], [2022, 2024, 2119], [2023, 2025], [1986, 2024, 2026], [2025, 2027], [2026, 2028, 2120], [2027, 2029], [1987, 2028, 2030], [2029, 2031], [2030, 2032, 2121], [2031, 2033], [1988, 2032, 2034], [2033, 2035], [2034, 2036, 2122], [2035, 2037], [1989, 2036, 2038], [2037, 2039], [2038, 2040, 2123], [2039, 2041], [1990, 2040, 2042], [2041, 2043], [2042, 2044, 2124], [2043, 2045], [1991, 2044, 2046], [2045, 2047], [2046, 2048, 2125], [2047, 2049], [1992, 2048, 2050], [2049, 2051], [2050, 2052, 2126], [2051, 2053], [1993, 2052, 2054], [2053, 2055], [2054, 2056, 2127], [2055, 2057], [1994, 2056, 2058], [2057, 2059], [2058, 2060, 2128], [2059, 2061], [1995, 2060, 2062], [2061, 2063], [2062, 2064, 2129], [2063, 2065], [1996, 2064, 2066], [2065, 2067], [2066, 2068, 2130], [2067, 2069], [1997, 2068, 2070], [2069, 2071], [2070, 2072, 2131], [2071, 2073], [1998, 2072, 2074], [2073, 2075], [2074, 2076, 2132], [2075, 2077], [1999, 2076, 2078], [2077, 2079], [2078, 2080, 2133], [2079, 2081], [2000, 2080, 2082], [2081, 2083], [2082, 2084, 2134], [2083, 2085], [2001, 2084, 2086], [2085, 2087], [2086, 2088, 2135], [2087, 2089], [2002, 2088, 2090], [2089, 2091], [2090, 2092, 2136], [2091, 2093], [2003, 2092, 2094], [2093, 2095], [2094, 2096, 2137], [2095, 2097], [2004, 2096, 2098], [2097, 2099], [2098, 2100, 2138], [2099, 2101], [2005, 2100, 2102], [2101, 2103], [2102, 2104, 2139], [2103, 2105], [2006, 2104, 2106], [2105, 2107], [2106, 2108, 2140], [2107, 2109], [2007, 2108, 2110], [2109, 2111], [2110, 2112, 2141], [2111, 2113], [2008, 2112, 2114], [2113, 2115], [2114, 2142], [2011, 2145], [2015, 2149], [2019, 2153], [2023, 2157], [2027, 2161], [2031, 2165], [2035, 2169], [2039, 2173], [2043, 2177], [2047, 2181], [2051, 2185], [2055, 2189], [2059, 2193], [2063, 2197], [2067, 2201], [2071, 2205], [2075, 2209], [2079, 2213], [2083, 2217], [2087, 2221], [2091, 2225], [2095, 2229], [2099, 2233], [2103, 2237], [2107, 2241], [2111, 2245], [2115, 2249], [2144, 2250], [2143, 2145], [2116, 2144, 2146], [2145, 2147], [2146, 2148, 2251], [2147, 2149], [2117, 2148, 2150], [2149, 2151], [2150, 2152, 2252], [2151, 2153], [2118, 2152, 2154], [2153, 2155], [2154, 2156, 2253], [2155, 2157], [2119, 2156, 2158], [2157, 2159], [2158, 2160, 2254], [2159, 2161], [2120, 2160, 2162], [2161, 2163], [2162, 2164, 2255], [2163, 2165], [2121, 2164, 2166], [2165, 2167], [2166, 2168, 2256], [2167, 2169], [2122, 2168, 2170], [2169, 2171], [2170, 2172, 2257], [2171, 2173], [2123, 2172, 2174], [2173, 2175], [2174, 2176, 2258], [2175, 2177], [2124, 2176, 2178], [2177, 2179], [2178, 2180, 2259], [2179, 2181], [2125, 2180, 2182], [2181, 2183], [2182, 2184, 2260], [2183, 2185], [2126, 2184, 2186], [2185, 2187], [2186, 2188, 2261], [2187, 2189], [2127, 2188, 2190], [2189, 2191], [2190, 2192, 2262], [2191, 2193], [2128, 2192, 2194], [2193, 2195], [2194, 2196, 2263], [2195, 2197], [2129, 2196, 2198], [2197, 2199], [2198, 2200, 2264], [2199, 2201], [2130, 2200, 2202], [2201, 2203], [2202, 2204, 2265], [2203, 2205], [2131, 2204, 2206], [2205, 2207], [2206, 2208, 2266], [2207, 2209], [2132, 2208, 2210], [2209, 2211], [2210, 2212, 2267], [2211, 2213], [2133, 2212, 2214], [2213, 2215], [2214, 2216, 2268], [2215, 2217], [2134, 2216, 2218], [2217, 2219], [2218, 2220, 2269], [2219, 2221], [2135, 2220, 2222], [2221, 2223], [2222, 2224, 2270], [2223, 2225], [2136, 2224, 2226], [2225, 2227], [2226, 2228, 2271], [2227, 2229], [2137, 2228, 2230], [2229, 2231], [2230, 2232, 2272], [2231, 2233], [2138, 2232, 2234], [2233, 2235], [2234, 2236, 2273], [2235, 2237], [2139, 2236, 2238], [2237, 2239], [2238, 2240, 2274], [2239, 2241], [2140, 2240, 2242], [2241, 2243], [2242, 2244, 2275], [2243, 2245], [2141, 2244, 2246], [2245, 2247], [2246, 2248, 2276], [2247, 2249], [2142, 2248], [2143, 2277], [2147, 2281], [2151, 2285], [2155, 2289], [2159, 2293], [2163, 2297], [2167, 2301], [2171, 2305], [2175, 2309], [2179, 2313], [2183, 2317], [2187, 2321], [2191, 2325], [2195, 2329], [2199, 2333], [2203, 2337], [2207, 2341], [2211, 2345], [2215, 2349], [2219, 2353], [2223, 2357], [2227, 2361], [2231, 2365], [2235, 2369], [2239, 2373], [2243, 2377], [2247, 2381], [2250, 2278], [2277, 2279], [2278, 2280, 2384], [2279, 2281], [2251, 2280, 2282], [2281, 2283], [2282, 2284, 2385], [2283, 2285], [2252, 2284, 2286], [2285, 2287], [2286, 2288, 2386], [2287, 2289], [2253, 2288, 2290], [2289, 2291], [2290, 2292, 2387], [2291, 2293], [2254, 2292, 2294], [2293, 2295], [2294, 2296, 2388], [2295, 2297], [2255, 2296, 2298], [2297, 2299], [2298, 2300, 2389], [2299, 2301], [2256, 2300, 2302], [2301, 2303], [2302, 2304, 2390], [2303, 2305], [2257, 2304, 2306], [2305, 2307], [2306, 2308, 2391], [2307, 2309], [2258, 2308, 2310], [2309, 2311], [2310, 2312, 2392], [2311, 2313], [2259, 2312, 2314], [2313, 2315], [2314, 2316, 2393], [2315, 2317], [2260, 2316, 2318], [2317, 2319], [2318, 2320, 2394], [2319, 2321], [2261, 2320, 2322], [2321, 2323], [2322, 2324, 2395], [2323, 2325], [2262, 2324, 2326], [2325, 2327], [2326, 2328, 2396], [2327, 2329], [2263, 2328, 2330], [2329, 2331], [2330, 2332, 2397], [2331, 2333], [2264, 2332, 2334], [2333, 2335], [2334, 2336, 2398], [2335, 2337], [2265, 2336, 2338], [2337, 2339], [2338, 2340, 2399], [2339, 2341], [2266, 2340, 2342], [2341, 2343], [2342, 2344, 2400], [2343, 2345], [2267, 2344, 2346], [2345, 2347], [2346, 2348, 2401], [2347, 2349], [2268, 2348, 2350], [2349, 2351], [2350, 2352, 2402], [2351, 2353], [2269, 2352, 2354], [2353, 2355], [2354, 2356, 2403], [2355, 2357], [2270, 2356, 2358], [2357, 2359], [2358, 2360, 2404], [2359, 2361], [2271, 2360, 2362], [2361, 2363], [2362, 2364, 2405], [2363, 2365], [2272, 2364, 2366], [2365, 2367], [2366, 2368, 2406], [2367, 2369], [2273, 2368, 2370], [2369, 2371], [2370, 2372, 2407], [2371, 2373], [2274, 2372, 2374], [2373, 2375], [2374, 2376, 2408], [2375, 2377], [2275, 2376, 2378], [2377, 2379], [2378, 2380, 2409], [2379, 2381], [2276, 2380, 2382], [2381, 2383], [2382, 2410], [2279, 2413], [2283, 2417], [2287, 2421], [2291, 2425], [2295, 2429], [2299, 2433], [2303, 2437], [2307, 2441], [2311, 2445], [2315, 2449], [2319, 2453], [2323, 2457], [2327, 2461], [2331, 2465], [2335, 2469], [2339, 2473], [2343, 2477], [2347, 2481], [2351, 2485], [2355, 2489], [2359, 2493], [2363, 2497], [2367, 2501], [2371, 2505], [2375, 2509], [2379, 2513], [2383, 2517], [2412, 2518], [2411, 2413], [2384, 2412, 2414], [2413, 2415], [2414, 2416, 2519], [2415, 2417], [2385, 2416, 2418], [2417, 2419], [2418, 2420, 2520], [2419, 2421], [2386, 2420, 2422], [2421, 2423], [2422, 2424, 2521], [2423, 2425], [2387, 2424, 2426], [2425, 2427], [2426, 2428, 2522], [2427, 2429], [2388, 2428, 2430], [2429, 2431], [2430, 2432, 2523], [2431, 2433], [2389, 2432, 2434], [2433, 2435], [2434, 2436, 2524], [2435, 2437], [2390, 2436, 2438], [2437, 2439], [2438, 2440, 2525], [2439, 2441], [2391, 2440, 2442], [2441, 2443], [2442, 2444, 2526], [2443, 2445], [2392, 2444, 2446], [2445, 2447], [2446, 2448, 2527], [2447, 2449], [2393, 2448, 2450], [2449, 2451], [2450, 2452, 2528], [2451, 2453], [2394, 2452, 2454], [2453, 2455], [2454, 2456, 2529], [2455, 2457], [2395, 2456, 2458], [2457, 2459], [2458, 2460, 2530], [2459, 2461], [2396, 2460, 2462], [2461, 2463], [2462, 2464, 2531], [2463, 2465], [2397, 2464, 2466], [2465, 2467], [2466, 2468, 2532], [2467, 2469], [2398, 2468, 2470], [2469, 2471], [2470, 2472, 2533], [2471, 2473], [2399, 2472, 2474], [2473, 2475], [2474, 2476, 2534], [2475, 2477], [2400, 2476, 2478], [2477, 2479], [2478, 2480, 2535], [2479, 2481], [2401, 2480, 2482], [2481, 2483], [2482, 2484, 2536], [2483, 2485], [2402, 2484, 2486], [2485, 2487], [2486, 2488, 2537], [2487, 2489], [2403, 2488, 2490], [2489, 2491], [2490, 2492, 2538], [2491, 2493], [2404, 2492, 2494], [2493, 2495], [2494, 2496, 2539], [2495, 2497], [2405, 2496, 2498], [2497, 2499], [2498, 2500, 2540], [2499, 2501], [2406, 2500, 2502], [2501, 2503], [2502, 2504, 2541], [2503, 2505], [2407, 2504, 2506], [2505, 2507], [2506, 2508, 2542], [2507, 2509], [2408, 2508, 2510], [2509, 2511], [2510, 2512, 2543], [2511, 2513], [2409, 2512, 2514], [2513, 2515], [2514, 2516, 2544], [2515, 2517], [2410, 2516], [2411, 2545], [2415, 2549], [2419, 2553], [2423, 2557], [2427, 2561], [2431, 2565], [2435, 2569], [2439, 2573], [2443, 2577], [2447, 2581], [2451, 2585], [2455, 2589], [2459, 2593], [2463, 2597], [2467, 2601], [2471, 2605], [2475, 2609], [2479, 2613], [2483, 2617], [2487, 2621], [2491, 2625], [2495, 2629], [2499, 2633], [2503, 2637], [2507, 2641], [2511, 2645], [2515, 2649], [2518, 2546], [2545, 2547], [2546, 2548, 2652], [2547, 2549], [2519, 2548, 2550], [2549, 2551], [2550, 2552, 2653], [2551, 2553], [2520, 2552, 2554], [2553, 2555], [2554, 2556, 2654], [2555, 2557], [2521, 2556, 2558], [2557, 2559], [2558, 2560, 2655], [2559, 2561], [2522, 2560, 2562], [2561, 2563], [2562, 2564, 2656], [2563, 2565], [2523, 2564, 2566], [2565, 2567], [2566, 2568, 2657], [2567, 2569], [2524, 2568, 2570], [2569, 2571], [2570, 2572, 2658], [2571, 2573], [2525, 2572, 2574], [2573, 2575], [2574, 2576, 2659], [2575, 2577], [2526, 2576, 2578], [2577, 2579], [2578, 2580, 2660], [2579, 2581], [2527, 2580, 2582], [2581, 2583], [2582, 2584, 2661], [2583, 2585], [2528, 2584, 2586], [2585, 2587], [2586, 2588, 2662], [2587, 2589], [2529, 2588, 2590], [2589, 2591], [2590, 2592, 2663], [2591, 2593], [2530, 2592, 2594], [2593, 2595], [2594, 2596, 2664], [2595, 2597], [2531, 2596, 2598], [2597, 2599], [2598, 2600, 2665], [2599, 2601], [2532, 2600, 2602], [2601, 2603], [2602, 2604, 2666], [2603, 2605], [2533, 2604, 2606], [2605, 2607], [2606, 2608, 2667], [2607, 2609], [2534, 2608, 2610], [2609, 2611], [2610, 2612, 2668], [2611, 2613], [2535, 2612, 2614], [2613, 2615], [2614, 2616, 2669], [2615, 2617], [2536, 2616, 2618], [2617, 2619], [2618, 2620, 2670], [2619, 2621], [2537, 2620, 2622], [2621, 2623], [2622, 2624, 2671], [2623, 2625], [2538, 2624, 2626], [2625, 2627], [2626, 2628, 2672], [2627, 2629], [2539, 2628, 2630], [2629, 2631], [2630, 2632, 2673], [2631, 2633], [2540, 2632, 2634], [2633, 2635], [2634, 2636, 2674], [2635, 2637], [2541, 2636, 2638], [2637, 2639], [2638, 2640, 2675], [2639, 2641], [2542, 2640, 2642], [2641, 2643], [2642, 2644, 2676], [2643, 2645], [2543, 2644, 2646], [2645, 2647], [2646, 2648, 2677], [2647, 2649], [2544, 2648, 2650], [2649, 2651], [2650, 2678], [2547, 2681], [2551, 2685], [2555, 2689], [2559, 2693], [2563, 2697], [2567, 2701], [2571, 2705], [2575, 2709], [2579, 2713], [2583, 2717], [2587, 2721], [2591, 2725], [2595, 2729], [2599, 2733], [2603, 2737], [2607, 2741], [2611, 2745], [2615, 2749], [2619, 2753], [2623, 2757], [2627, 2761], [2631, 2765], [2635, 2769], [2639, 2773], [2643, 2777], [2647, 2781], [2651, 2785], [2680, 2786], [2679, 2681], [2652, 2680, 2682], [2681, 2683], [2682, 2684, 2787], [2683, 2685], [2653, 2684, 2686], [2685, 2687], [2686, 2688, 2788], [2687, 2689], [2654, 2688, 2690], [2689, 2691], [2690, 2692, 2789], [2691, 2693], [2655, 2692, 2694], [2693, 2695], [2694, 2696, 2790], [2695, 2697], [2656, 2696, 2698], [2697, 2699], [2698, 2700, 2791], [2699, 2701], [2657, 2700, 2702], [2701, 2703], [2702, 2704, 2792], [2703, 2705], [2658, 2704, 2706], [2705, 2707], [2706, 2708, 2793], [2707, 2709], [2659, 2708, 2710], [2709, 2711], [2710, 2712, 2794], [2711, 2713], [2660, 2712, 2714], [2713, 2715], [2714, 2716, 2795], [2715, 2717], [2661, 2716, 2718], [2717, 2719], [2718, 2720, 2796], [2719, 2721], [2662, 2720, 2722], [2721, 2723], [2722, 2724, 2797], [2723, 2725], [2663, 2724, 2726], [2725, 2727], [2726, 2728, 2798], [2727, 2729], [2664, 2728, 2730], [2729, 2731], [2730, 2732, 2799], [2731, 2733], [2665, 2732, 2734], [2733, 2735], [2734, 2736, 2800], [2735, 2737], [2666, 2736, 2738], [2737, 2739], [2738, 2740, 2801], [2739, 2741], [2667, 2740, 2742], [2741, 2743], [2742, 2744, 2802], [2743, 2745], [2668, 2744, 2746], [2745, 2747], [2746, 2748, 2803], [2747, 2749], [2669, 2748, 2750], [2749, 2751], [2750, 2752, 2804], [2751, 2753], [2670, 2752, 2754], [2753, 2755], [2754, 2756, 2805], [2755, 2757], [2671, 2756, 2758], [2757, 2759], [2758, 2760, 2806], [2759, 2761], [2672, 2760, 2762], [2761, 2763], [2762, 2764, 2807], [2763, 2765], [2673, 2764, 2766], [2765, 2767], [2766, 2768, 2808], [2767, 2769], [2674, 2768, 2770], [2769, 2771], [2770, 2772, 2809], [2771, 2773], [2675, 2772, 2774], [2773, 2775], [2774, 2776, 2810], [2775, 2777], [2676, 2776, 2778], [2777, 2779], [2778, 2780, 2811], [2779, 2781], [2677, 2780, 2782], [2781, 2783], [2782, 2784, 2812], [2783, 2785], [2678, 2784], [2679, 2813], [2683, 2817], [2687, 2821], [2691, 2825], [2695, 2829], [2699, 2833], [2703, 2837], [2707, 2841], [2711, 2845], [2715, 2849], [2719, 2853], [2723, 2857], [2727, 2861], [2731, 2865], [2735, 2869], [2739, 2873], [2743, 2877], [2747, 2881], [2751, 2885], [2755, 2889], [2759, 2893], [2763, 2897], [2767, 2901], [2771, 2905], [2775, 2909], [2779, 2913], [2783, 2917], [2786, 2814], [2813, 2815], [2814, 2816, 2920], [2815, 2817], [2787, 2816, 2818], [2817, 2819], [2818, 2820, 2921], [2819, 2821], [2788, 2820, 2822], [2821, 2823], [2822, 2824, 2922], [2823, 2825], [2789, 2824, 2826], [2825, 2827], [2826, 2828, 2923], [2827, 2829], [2790, 2828, 2830], [2829, 2831], [2830, 2832, 2924], [2831, 2833], [2791, 2832, 2834], [2833, 2835], [2834, 2836, 2925], [2835, 2837], [2792, 2836, 2838], [2837, 2839], [2838, 2840, 2926], [2839, 2841], [2793, 2840, 2842], [2841, 2843], [2842, 2844, 2927], [2843, 2845], [2794, 2844, 2846], [2845, 2847], [2846, 2848, 2928], [2847, 2849], [2795, 2848, 2850], [2849, 2851], [2850, 2852, 2929], [2851, 2853], [2796, 2852, 2854], [2853, 2855], [2854, 2856, 2930], [2855, 2857], [2797, 2856, 2858], [2857, 2859], [2858, 2860, 2931], [2859, 2861], [2798, 2860, 2862], [2861, 2863], [2862, 2864, 2932], [2863, 2865], [2799, 2864, 2866], [2865, 2867], [2866, 2868, 2933], [2867, 2869], [2800, 2868, 2870], [2869, 2871], [2870, 2872, 2934], [2871, 2873], [2801, 2872, 2874], [2873, 2875], [2874, 2876, 2935], [2875, 2877], [2802, 2876, 2878], [2877, 2879], [2878, 2880, 2936], [2879, 2881], [2803, 2880, 2882], [2881, 2883], [2882, 2884, 2937], [2883, 2885], [2804, 2884, 2886], [2885, 2887], [2886, 2888, 2938], [2887, 2889], [2805, 2888, 2890], [2889, 2891], [2890, 2892, 2939], [2891, 2893], [2806, 2892, 2894], [2893, 2895], [2894, 2896, 2940], [2895, 2897], [2807, 2896, 2898], [2897, 2899], [2898, 2900, 2941], [2899, 2901], [2808, 2900, 2902], [2901, 2903], [2902, 2904, 2942], [2903, 2905], [2809, 2904, 2906], [2905, 2907], [2906, 2908, 2943], [2907, 2909], [2810, 2908, 2910], [2909, 2911], [2910, 2912, 2944], [2911, 2913], [2811, 2912, 2914], [2913, 2915], [2914, 2916, 2945], [2915, 2917], [2812, 2916, 2918], [2917, 2919], [2918, 2946], [2815, 2949], [2819, 2953], [2823, 2957], [2827, 2961], [2831, 2965], [2835, 2969], [2839, 2973], [2843, 2977], [2847, 2981], [2851, 2985], [2855, 2989], [2859, 2993], [2863, 2997], [2867, 3001], [2871, 3005], [2875, 3009], [2879, 3013], [2883, 3017], [2887, 3021], [2891, 3025], [2895, 3029], [2899, 3033], [2903, 3037], [2907, 3041], [2911, 3045], [2915, 3049], [2919, 3053], [2948, 3054], [2947, 2949], [2920, 2948, 2950], [2949, 2951], [2950, 2952, 3055], [2951, 2953], [2921, 2952, 2954], [2953, 2955], [2954, 2956, 3056], [2955, 2957], [2922, 2956, 2958], [2957, 2959], [2958, 2960, 3057], [2959, 2961], [2923, 2960, 2962], [2961, 2963], [2962, 2964, 3058], [2963, 2965], [2924, 2964, 2966], [2965, 2967], [2966, 2968, 3059], [2967, 2969], [2925, 2968, 2970], [2969, 2971], [2970, 2972, 3060], [2971, 2973], [2926, 2972, 2974], [2973, 2975], [2974, 2976, 3061], [2975, 2977], [2927, 2976, 2978], [2977, 2979], [2978, 2980, 3062], [2979, 2981], [2928, 2980, 2982], [2981, 2983], [2982, 2984, 3063], [2983, 2985], [2929, 2984, 2986], [2985, 2987], [2986, 2988, 3064], [2987, 2989], [2930, 2988, 2990], [2989, 2991], [2990, 2992, 3065], [2991, 2993], [2931, 2992, 2994], [2993, 2995], [2994, 2996, 3066], [2995, 2997], [2932, 2996, 2998], [2997, 2999], [2998, 3000, 3067], [2999, 3001], [2933, 3000, 3002], [3001, 3003], [3002, 3004, 3068], [3003, 3005], [2934, 3004, 3006], [3005, 3007], [3006, 3008, 3069], [3007, 3009], [2935, 3008, 3010], [3009, 3011], [3010, 3012, 3070], [3011, 3013], [2936, 3012, 3014], [3013, 3015], [3014, 3016, 3071], [3015, 3017], [2937, 3016, 3018], [3017, 3019], [3018, 3020, 3072], [3019, 3021], [2938, 3020, 3022], [3021, 3023], [3022, 3024, 3073], [3023, 3025], [2939, 3024, 3026], [3025, 3027], [3026, 3028, 3074], [3027, 3029], [2940, 3028, 3030], [3029, 3031], [3030, 3032, 3075], [3031, 3033], [2941, 3032, 3034], [3033, 3035], [3034, 3036, 3076], [3035, 3037], [2942, 3036, 3038], [3037, 3039], [3038, 3040, 3077], [3039, 3041], [2943, 3040, 3042], [3041, 3043], [3042, 3044, 3078], [3043, 3045], [2944, 3044, 3046], [3045, 3047], [3046, 3048, 3079], [3047, 3049], [2945, 3048, 3050], [3049, 3051], [3050, 3052, 3080], [3051, 3053], [2946, 3052], [2947, 3081], [2951, 3085], [2955, 3089], [2959, 3093], [2963, 3097], [2967, 3101], [2971, 3105], [2975, 3109], [2979, 3113], [2983, 3117], [2987, 3121], [2991, 3125], [2995, 3129], [2999, 3133], [3003, 3137], [3007, 3141], [3011, 3145], [3015, 3149], [3019, 3153], [3023, 3157], [3027, 3161], [3031, 3165], [3035, 3169], [3039, 3173], [3043, 3177], [3047, 3181], [3051, 3185], [3054, 3082], [3081, 3083], [3082, 3084, 3188], [3083, 3085], [3055, 3084, 3086], [3085, 3087], [3086, 3088, 3189], [3087, 3089], [3056, 3088, 3090], [3089, 3091], [3090, 3092, 3190], [3091, 3093], [3057, 3092, 3094], [3093, 3095], [3094, 3096, 3191], [3095, 3097], [3058, 3096, 3098], [3097, 3099], [3098, 3100, 3192], [3099, 3101], [3059, 3100, 3102], [3101, 3103], [3102, 3104, 3193], [3103, 3105], [3060, 3104, 3106], [3105, 3107], [3106, 3108, 3194], [3107, 3109], [3061, 3108, 3110], [3109, 3111], [3110, 3112, 3195], [3111, 3113], [3062, 3112, 3114], [3113, 3115], [3114, 3116, 3196], [3115, 3117], [3063, 3116, 3118], [3117, 3119], [3118, 3120, 3197], [3119, 3121], [3064, 3120, 3122], [3121, 3123], [3122, 3124, 3198], [3123, 3125], [3065, 3124, 3126], [3125, 3127], [3126, 3128, 3199], [3127, 3129], [3066, 3128, 3130], [3129, 3131], [3130, 3132, 3200], [3131, 3133], [3067, 3132, 3134], [3133, 3135], [3134, 3136, 3201], [3135, 3137], [3068, 3136, 3138], [3137, 3139], [3138, 3140, 3202], [3139, 3141], [3069, 3140, 3142], [3141, 3143], [3142, 3144, 3203], [3143, 3145], [3070, 3144, 3146], [3145, 3147], [3146, 3148, 3204], [3147, 3149], [3071, 3148, 3150], [3149, 3151], [3150, 3152, 3205], [3151, 3153], [3072, 3152, 3154], [3153, 3155], [3154, 3156, 3206], [3155, 3157], [3073, 3156, 3158], [3157, 3159], [3158, 3160, 3207], [3159, 3161], [3074, 3160, 3162], [3161, 3163], [3162, 3164, 3208], [3163, 3165], [3075, 3164, 3166], [3165, 3167], [3166, 3168, 3209], [3167, 3169], [3076, 3168, 3170], [3169, 3171], [3170, 3172, 3210], [3171, 3173], [3077, 3172, 3174], [3173, 3175], [3174, 3176, 3211], [3175, 3177], [3078, 3176, 3178], [3177, 3179], [3178, 3180, 3212], [3179, 3181], [3079, 3180, 3182], [3181, 3183], [3182, 3184, 3213], [3183, 3185], [3080, 3184, 3186], [3185, 3187], [3186, 3214], [3083, 3217], [3087, 3221], [3091, 3225], [3095, 3229], [3099, 3233], [3103, 3237], [3107, 3241], [3111, 3245], [3115, 3249], [3119, 3253], [3123, 3257], [3127, 3261], [3131, 3265], [3135, 3269], [3139, 3273], [3143, 3277], [3147, 3281], [3151, 3285], [3155, 3289], [3159, 3293], [3163, 3297], [3167, 3301], [3171, 3305], [3175, 3309], [3179, 3313], [3183, 3317], [3187, 3321], [3216, 3322], [3215, 3217], [3188, 3216, 3218], [3217, 3219], [3218, 3220, 3323], [3219, 3221], [3189, 3220, 3222], [3221, 3223], [3222, 3224, 3324], [3223, 3225], [3190, 3224, 3226], [3225, 3227], [3226, 3228, 3325], [3227, 3229], [3191, 3228, 3230], [3229, 3231], [3230, 3232, 3326], [3231, 3233], [3192, 3232, 3234], [3233, 3235], [3234, 3236, 3327], [3235, 3237], [3193, 3236, 3238], [3237, 3239], [3238, 3240, 3328], [3239, 3241], [3194, 3240, 3242], [3241, 3243], [3242, 3244, 3329], [3243, 3245], [3195, 3244, 3246], [3245, 3247], [3246, 3248, 3330], [3247, 3249], [3196, 3248, 3250], [3249, 3251], [3250, 3252, 3331], [3251, 3253], [3197, 3252, 3254], [3253, 3255], [3254, 3256, 3332], [3255, 3257], [3198, 3256, 3258], [3257, 3259], [3258, 3260, 3333], [3259, 3261], [3199, 3260, 3262], [3261, 3263], [3262, 3264, 3334], [3263, 3265], [3200, 3264, 3266], [3265, 3267], [3266, 3268, 3335], [3267, 3269], [3201, 3268, 3270], [3269, 3271], [3270, 3272, 3336], [3271, 3273], [3202, 3272, 3274], [3273, 3275], [3274, 3276, 3337], [3275, 3277], [3203, 3276, 3278], [3277, 3279], [3278, 3280, 3338], [3279, 3281], [3204, 3280, 3282], [3281, 3283], [3282, 3284, 3339], [3283, 3285], [3205, 3284, 3286], [3285, 3287], [3286, 3288, 3340], [3287, 3289], [3206, 3288, 3290], [3289, 3291], [3290, 3292, 3341], [3291, 3293], [3207, 3292, 3294], [3293, 3295], [3294, 3296, 3342], [3295, 3297], [3208, 3296, 3298], [3297, 3299], [3298, 3300, 3343], [3299, 3301], [3209, 3300, 3302], [3301, 3303], [3302, 3304, 3344], [3303, 3305], [3210, 3304, 3306], [3305, 3307], [3306, 3308, 3345], [3307, 3309], [3211, 3308, 3310], [3309, 3311], [3310, 3312, 3346], [3311, 3313], [3212, 3312, 3314], [3313, 3315], [3314, 3316, 3347], [3315, 3317], [3213, 3316, 3318], [3317, 3319], [3318, 3320, 3348], [3319, 3321], [3214, 3320], [3215, 3349], [3219, 3353], [3223, 3357], [3227, 3361], [3231, 3365], [3235, 3369], [3239, 3373], [3243, 3377], [3247, 3381], [3251, 3385], [3255, 3389], [3259, 3393], [3263, 3397], [3267, 3401], [3271, 3405], [3275, 3409], [3279, 3413], [3283, 3417], [3287, 3421], [3291, 3425], [3295, 3429], [3299, 3433], [3303, 3437], [3307, 3441], [3311, 3445], [3315, 3449], [3319, 3453], [3322, 3350], [3349, 3351], [3350, 3352, 3456], [3351, 3353], [3323, 3352, 3354], [3353, 3355], [3354, 3356, 3457], [3355, 3357], [3324, 3356, 3358], [3357, 3359], [3358, 3360, 3458], [3359, 3361], [3325, 3360, 3362], [3361, 3363], [3362, 3364, 3459], [3363, 3365], [3326, 3364, 3366], [3365, 3367], [3366, 3368, 3460], [3367, 3369], [3327, 3368, 3370], [3369, 3371], [3370, 3372, 3461], [3371, 3373], [3328, 3372, 3374], [3373, 3375], [3374, 3376, 3462], [3375, 3377], [3329, 3376, 3378], [3377, 3379], [3378, 3380, 3463], [3379, 3381], [3330, 3380, 3382], [3381, 3383], [3382, 3384, 3464], [3383, 3385], [3331, 3384, 3386], [3385, 3387], [3386, 3388, 3465], [3387, 3389], [3332, 3388, 3390], [3389, 3391], [3390, 3392, 3466], [3391, 3393], [3333, 3392, 3394], [3393, 3395], [3394, 3396, 3467], [3395, 3397], [3334, 3396, 3398], [3397, 3399], [3398, 3400, 3468], [3399, 3401], [3335, 3400, 3402], [3401, 3403], [3402, 3404, 3469], [3403, 3405], [3336, 3404, 3406], [3405, 3407], [3406, 3408, 3470], [3407, 3409], [3337, 3408, 3410], [3409, 3411], [3410, 3412, 3471], [3411, 3413], [3338, 3412, 3414], [3413, 3415], [3414, 3416, 3472], [3415, 3417], [3339, 3416, 3418], [3417, 3419], [3418, 3420, 3473], [3419, 3421], [3340, 3420, 3422], [3421, 3423], [3422, 3424, 3474], [3423, 3425], [3341, 3424, 3426], [3425, 3427], [3426, 3428, 3475], [3427, 3429], [3342, 3428, 3430], [3429, 3431], [3430, 3432, 3476], [3431, 3433], [3343, 3432, 3434], [3433, 3435], [3434, 3436, 3477], [3435, 3437], [3344, 3436, 3438], [3437, 3439], [3438, 3440, 3478], [3439, 3441], [3345, 3440, 3442], [3441, 3443], [3442, 3444, 3479], [3443, 3445], [3346, 3444, 3446], [3445, 3447], [3446, 3448, 3480], [3447, 3449], [3347, 3448, 3450], [3449, 3451], [3450, 3452, 3481], [3451, 3453], [3348, 3452, 3454], [3453, 3455], [3454, 3482], [3351, 3485], [3355, 3489], [3359, 3493], [3363, 3497], [3367, 3501], [3371, 3505], [3375, 3509], [3379, 3513], [3383, 3517], [3387, 3521], [3391, 3525], [3395, 3529], [3399, 3533], [3403, 3537], [3407, 3541], [3411, 3545], [3415, 3549], [3419, 3553], [3423, 3557], [3427, 3561], [3431, 3565], [3435, 3569], [3439, 3573], [3443, 3577], [3447, 3581], [3451, 3585], [3455, 3589], [3484, 3590], [3483, 3485], [3456, 3484, 3486], [3485, 3487], [3486, 3488, 3591], [3487, 3489], [3457, 3488, 3490], [3489, 3491], [3490, 3492, 3592], [3491, 3493], [3458, 3492, 3494], [3493, 3495], [3494, 3496, 3593], [3495, 3497], [3459, 3496, 3498], [3497, 3499], [3498, 3500, 3594], [3499, 3501], [3460, 3500, 3502], [3501, 3503], [3502, 3504, 3595], [3503, 3505], [3461, 3504, 3506], [3505, 3507], [3506, 3508, 3596], [3507, 3509], [3462, 3508, 3510], [3509, 3511], [3510, 3512, 3597], [3511, 3513], [3463, 3512, 3514], [3513, 3515], [3514, 3516, 3598], [3515, 3517], [3464, 3516, 3518], [3517, 3519], [3518, 3520, 3599], [3519, 3521], [3465, 3520, 3522], [3521, 3523], [3522, 3524, 3600], [3523, 3525], [3466, 3524, 3526], [3525, 3527], [3526, 3528, 3601], [3527, 3529], [3467, 3528, 3530], [3529, 3531], [3530, 3532, 3602], [3531, 3533], [3468, 3532, 3534], [3533, 3535], [3534, 3536, 3603], [3535, 3537], [3469, 3536, 3538], [3537, 3539], [3538, 3540, 3604], [3539, 3541], [3470, 3540, 3542], [3541, 3543], [3542, 3544, 3605], [3543, 3545], [3471, 3544, 3546], [3545, 3547], [3546, 3548, 3606], [3547, 3549], [3472, 3548, 3550], [3549, 3551], [3550, 3552, 3607], [3551, 3553], [3473, 3552, 3554], [3553, 3555], [3554, 3556, 3608], [3555, 3557], [3474, 3556, 3558], [3557, 3559], [3558, 3560, 3609], [3559, 3561], [3475, 3560, 3562], [3561, 3563], [3562, 3564, 3610], [3563, 3565], [3476, 3564, 3566], [3565, 3567], [3566, 3568, 3611], [3567, 3569], [3477, 3568, 3570], [3569, 3571], [3570, 3572, 3612], [3571, 3573], [3478, 3572, 3574], [3573, 3575], [3574, 3576, 3613], [3575, 3577], [3479, 3576, 3578], [3577, 3579], [3578, 3580, 3614], [3579, 3581], [3480, 3580, 3582], [3581, 3583], [3582, 3584, 3615], [3583, 3585], [3481, 3584, 3586], [3585, 3587], [3586, 3588, 3616], [3587, 3589], [3482, 3588], [3483, 3617], [3487, 3621], [3491, 3625], [3495, 3629], [3499, 3633], [3503, 3637], [3507, 3641], [3511, 3645], [3515, 3649], [3519, 3653], [3523, 3657], [3527, 3661], [3531, 3665], [3535, 3669], [3539, 3673], [3543, 3677], [3547, 3681], [3551, 3685], [3555, 3689], [3559, 3693], [3563, 3697], [3567, 3701], [3571, 3705], [3575, 3709], [3579, 3713], [3583, 3717], [3587, 3721], [3590, 3618], [3617, 3619], [3618, 3620, 3724], [3619, 3621], [3591, 3620, 3622], [3621, 3623], [3622, 3624, 3725], [3623, 3625], [3592, 3624, 3626], [3625, 3627], [3626, 3628, 3726], [3627, 3629], [3593, 3628, 3630], [3629, 3631], [3630, 3632, 3727], [3631, 3633], [3594, 3632, 3634], [3633, 3635], [3634, 3636, 3728], [3635, 3637], [3595, 3636, 3638], [3637, 3639], [3638, 3640, 3729], [3639, 3641], [3596, 3640, 3642], [3641, 3643], [3642, 3644, 3730], [3643, 3645], [3597, 3644, 3646], [3645, 3647], [3646, 3648, 3731], [3647, 3649], [3598, 3648, 3650], [3649, 3651], [3650, 3652, 3732], [3651, 3653], [3599, 3652, 3654], [3653, 3655], [3654, 3656, 3733], [3655, 3657], [3600, 3656, 3658], [3657, 3659], [3658, 3660, 3734], [3659, 3661], [3601, 3660, 3662], [3661, 3663], [3662, 3664, 3735], [3663, 3665], [3602, 3664, 3666], [3665, 3667], [3666, 3668, 3736], [3667, 3669], [3603, 3668, 3670], [3669, 3671], [3670, 3672, 3737], [3671, 3673], [3604, 3672, 3674], [3673, 3675], [3674, 3676, 3738], [3675, 3677], [3605, 3676, 3678], [3677, 3679], [3678, 3680, 3739], [3679, 3681], [3606, 3680, 3682], [3681, 3683], [3682, 3684, 3740], [3683, 3685], [3607, 3684, 3686], [3685, 3687], [3686, 3688, 3741], [3687, 3689], [3608, 3688, 3690], [3689, 3691], [3690, 3692, 3742], [3691, 3693], [3609, 3692, 3694], [3693, 3695], [3694, 3696, 3743], [3695, 3697], [3610, 3696, 3698], [3697, 3699], [3698, 3700, 3744], [3699, 3701], [3611, 3700, 3702], [3701, 3703], [3702, 3704, 3745], [3703, 3705], [3612, 3704, 3706], [3705, 3707], [3706, 3708, 3746], [3707, 3709], [3613, 3708, 3710], [3709, 3711], [3710, 3712, 3747], [3711, 3713], [3614, 3712, 3714], [3713, 3715], [3714, 3716, 3748], [3715, 3717], [3615, 3716, 3718], [3717, 3719], [3718, 3720, 3749], [3719, 3721], [3616, 3720, 3722], [3721, 3723], [3722, 3750], [3619, 3753], [3623, 3757], [3627, 3761], [3631, 3765], [3635, 3769], [3639, 3773], [3643, 3777], [3647, 3781], [3651, 3785], [3655, 3789], [3659, 3793], [3663, 3797], [3667, 3801], [3671, 3805], [3675, 3809], [3679, 3813], [3683, 3817], [3687, 3821], [3691, 3825], [3695, 3829], [3699, 3833], [3703, 3837], [3707, 3841], [3711, 3845], [3715, 3849], [3719, 3853], [3723, 3857], [3752, 3858], [3751, 3753], [3724, 3752, 3754], [3753, 3755], [3754, 3756, 3859], [3755, 3757], [3725, 3756, 3758], [3757, 3759], [3758, 3760, 3860], [3759, 3761], [3726, 3760, 3762], [3761, 3763], [3762, 3764, 3861], [3763, 3765], [3727, 3764, 3766], [3765, 3767], [3766, 3768, 3862], [3767, 3769], [3728, 3768, 3770], [3769, 3771], [3770, 3772, 3863], [3771, 3773], [3729, 3772, 3774], [3773, 3775], [3774, 3776, 3864], [3775, 3777], [3730, 3776, 3778], [3777, 3779], [3778, 3780, 3865], [3779, 3781], [3731, 3780, 3782], [3781, 3783], [3782, 3784, 3866], [3783, 3785], [3732, 3784, 3786], [3785, 3787], [3786, 3788, 3867], [3787, 3789], [3733, 3788, 3790], [3789, 3791], [3790, 3792, 3868], [3791, 3793], [3734, 3792, 3794], [3793, 3795], [3794, 3796, 3869], [3795, 3797], [3735, 3796, 3798], [3797, 3799], [3798, 3800, 3870], [3799, 3801], [3736, 3800, 3802], [3801, 3803], [3802, 3804, 3871], [3803, 3805], [3737, 3804, 3806], [3805, 3807], [3806, 3808, 3872], [3807, 3809], [3738, 3808, 3810], [3809, 3811], [3810, 3812, 3873], [3811, 3813], [3739, 3812, 3814], [3813, 3815], [3814, 3816, 3874], [3815, 3817], [3740, 3816, 3818], [3817, 3819], [3818, 3820, 3875], [3819, 3821], [3741, 3820, 3822], [3821, 3823], [3822, 3824, 3876], [3823, 3825], [3742, 3824, 3826], [3825, 3827], [3826, 3828, 3877], [3827, 3829], [3743, 3828, 3830], [3829, 3831], [3830, 3832, 3878], [3831, 3833], [3744, 3832, 3834], [3833, 3835], [3834, 3836, 3879], [3835, 3837], [3745, 3836, 3838], [3837, 3839], [3838, 3840, 3880], [3839, 3841], [3746, 3840, 3842], [3841, 3843], [3842, 3844, 3881], [3843, 3845], [3747, 3844, 3846], [3845, 3847], [3846, 3848, 3882], [3847, 3849], [3748, 3848, 3850], [3849, 3851], [3850, 3852, 3883], [3851, 3853], [3749, 3852, 3854], [3853, 3855], [3854, 3856, 3884], [3855, 3857], [3750, 3856], [3751, 3885], [3755, 3889], [3759, 3893], [3763, 3897], [3767, 3901], [3771, 3905], [3775, 3909], [3779, 3913], [3783, 3917], [3787, 3921], [3791, 3925], [3795, 3929], [3799, 3933], [3803, 3937], [3807, 3941], [3811, 3945], [3815, 3949], [3819, 3953], [3823, 3957], [3827, 3961], [3831, 3965], [3835, 3969], [3839, 3973], [3843, 3977], [3847, 3981], [3851, 3985], [3855, 3989], [3858, 3886], [3885, 3887], [3886, 3888, 3992], [3887, 3889], [3859, 3888, 3890], [3889, 3891], [3890, 3892, 3993], [3891, 3893], [3860, 3892, 3894], [3893, 3895], [3894, 3896, 3994], [3895, 3897], [3861, 3896, 3898], [3897, 3899], [3898, 3900, 3995], [3899, 3901], [3862, 3900, 3902], [3901, 3903], [3902, 3904, 3996], [3903, 3905], [3863, 3904, 3906], [3905, 3907], [3906, 3908, 3997], [3907, 3909], [3864, 3908, 3910], [3909, 3911], [3910, 3912, 3998], [3911, 3913], [3865, 3912, 3914], [3913, 3915], [3914, 3916, 3999], [3915, 3917], [3866, 3916, 3918], [3917, 3919], [3918, 3920, 4000], [3919, 3921], [3867, 3920, 3922], [3921, 3923], [3922, 3924, 4001], [3923, 3925], [3868, 3924, 3926], [3925, 3927], [3926, 3928, 4002], [3927, 3929], [3869, 3928, 3930], [3929, 3931], [3930, 3932, 4003], [3931, 3933], [3870, 3932, 3934], [3933, 3935], [3934, 3936, 4004], [3935, 3937], [3871, 3936, 3938], [3937, 3939], [3938, 3940, 4005], [3939, 3941], [3872, 3940, 3942], [3941, 3943], [3942, 3944, 4006], [3943, 3945], [3873, 3944, 3946], [3945, 3947], [3946, 3948, 4007], [3947, 3949], [3874, 3948, 3950], [3949, 3951], [3950, 3952, 4008], [3951, 3953], [3875, 3952, 3954], [3953, 3955], [3954, 3956, 4009], [3955, 3957], [3876, 3956, 3958], [3957, 3959], [3958, 3960, 4010], [3959, 3961], [3877, 3960, 3962], [3961, 3963], [3962, 3964, 4011], [3963, 3965], [3878, 3964, 3966], [3965, 3967], [3966, 3968, 4012], [3967, 3969], [3879, 3968, 3970], [3969, 3971], [3970, 3972, 4013], [3971, 3973], [3880, 3972, 3974], [3973, 3975], [3974, 3976, 4014], [3975, 3977], [3881, 3976, 3978], [3977, 3979], [3978, 3980, 4015], [3979, 3981], [3882, 3980, 3982], [3981, 3983], [3982, 3984, 4016], [3983, 3985], [3883, 3984, 3986], [3985, 3987], [3986, 3988, 4017], [3987, 3989], [3884, 3988, 3990], [3989, 3991], [3990, 4018], [3887, 4021], [3891, 4025], [3895, 4029], [3899, 4033], [3903, 4037], [3907, 4041], [3911, 4045], [3915, 4049], [3919, 4053], [3923, 4057], [3927, 4061], [3931, 4065], [3935, 4069], [3939, 4073], [3943, 4077], [3947, 4081], [3951, 4085], [3955, 4089], [3959, 4093], [3963, 4097], [3967, 4101], [3971, 4105], [3975, 4109], [3979, 4113], [3983, 4117], [3987, 4121], [3991, 4125], [4020, 4126], [4019, 4021], [3992, 4020, 4022], [4021, 4023], [4022, 4024, 4127], [4023, 4025], [3993, 4024, 4026], [4025, 4027], [4026, 4028, 4128], [4027, 4029], [3994, 4028, 4030], [4029, 4031], [4030, 4032, 4129], [4031, 4033], [3995, 4032, 4034], [4033, 4035], [4034, 4036, 4130], [4035, 4037], [3996, 4036, 4038], [4037, 4039], [4038, 4040, 4131], [4039, 4041], [3997, 4040, 4042], [4041, 4043], [4042, 4044, 4132], [4043, 4045], [3998, 4044, 4046], [4045, 4047], [4046, 4048, 4133], [4047, 4049], [3999, 4048, 4050], [4049, 4051], [4050, 4052, 4134], [4051, 4053], [4000, 4052, 4054], [4053, 4055], [4054, 4056, 4135], [4055, 4057], [4001, 4056, 4058], [4057, 4059], [4058, 4060, 4136], [4059, 4061], [4002, 4060, 4062], [4061, 4063], [4062, 4064, 4137], [4063, 4065], [4003, 4064, 4066], [4065, 4067], [4066, 4068, 4138], [4067, 4069], [4004, 4068, 4070], [4069, 4071], [4070, 4072, 4139], [4071, 4073], [4005, 4072, 4074], [4073, 4075], [4074, 4076, 4140], [4075, 4077], [4006, 4076, 4078], [4077, 4079], [4078, 4080, 4141], [4079, 4081], [4007, 4080, 4082], [4081, 4083], [4082, 4084, 4142], [4083, 4085], [4008, 4084, 4086], [4085, 4087], [4086, 4088, 4143], [4087, 4089], [4009, 4088, 4090], [4089, 4091], [4090, 4092, 4144], [4091, 4093], [4010, 4092, 4094], [4093, 4095], [4094, 4096, 4145], [4095, 4097], [4011, 4096, 4098], [4097, 4099], [4098, 4100, 4146], [4099, 4101], [4012, 4100, 4102], [4101, 4103], [4102, 4104, 4147], [4103, 4105], [4013, 4104, 4106], [4105, 4107], [4106, 4108, 4148], [4107, 4109], [4014, 4108, 4110], [4109, 4111], [4110, 4112, 4149], [4111, 4113], [4015, 4112, 4114], [4113, 4115], [4114, 4116, 4150], [4115, 4117], [4016, 4116, 4118], [4117, 4119], [4118, 4120, 4151], [4119, 4121], [4017, 4120, 4122], [4121, 4123], [4122, 4124, 4152], [4123, 4125], [4018, 4124], [4019, 4153], [4023, 4157], [4027, 4161], [4031, 4165], [4035, 4169], [4039, 4173], [4043, 4177], [4047, 4181], [4051, 4185], [4055, 4189], [4059, 4193], [4063, 4197], [4067, 4201], [4071, 4205], [4075, 4209], [4079, 4213], [4083, 4217], [4087, 4221], [4091, 4225], [4095, 4229], [4099, 4233], [4103, 4237], [4107, 4241], [4111, 4245], [4115, 4249], [4119, 4253], [4123, 4257], [4126, 4154], [4153, 4155], [4154, 4156, 4260], [4155, 4157], [4127, 4156, 4158], [4157, 4159], [4158, 4160, 4261], [4159, 4161], [4128, 4160, 4162], [4161, 4163], [4162, 4164, 4262], [4163, 4165], [4129, 4164, 4166], [4165, 4167], [4166, 4168, 4263], [4167, 4169], [4130, 4168, 4170], [4169, 4171], [4170, 4172, 4264], [4171, 4173], [4131, 4172, 4174], [4173, 4175], [4174, 4176, 4265], [4175, 4177], [4132, 4176, 4178], [4177, 4179], [4178, 4180, 4266], [4179, 4181], [4133, 4180, 4182], [4181, 4183], [4182, 4184, 4267], [4183, 4185], [4134, 4184, 4186], [4185, 4187], [4186, 4188, 4268], [4187, 4189], [4135, 4188, 4190], [4189, 4191], [4190, 4192, 4269], [4191, 4193], [4136, 4192, 4194], [4193, 4195], [4194, 4196, 4270], [4195, 4197], [4137, 4196, 4198], [4197, 4199], [4198, 4200, 4271], [4199, 4201], [4138, 4200, 4202], [4201, 4203], [4202, 4204, 4272], [4203, 4205], [4139, 4204, 4206], [4205, 4207], [4206, 4208, 4273], [4207, 4209], [4140, 4208, 4210], [4209, 4211], [4210, 4212, 4274], [4211, 4213], [4141, 4212, 4214], [4213, 4215], [4214, 4216, 4275], [4215, 4217], [4142, 4216, 4218], [4217, 4219], [4218, 4220, 4276], [4219, 4221], [4143, 4220, 4222], [4221, 4223], [4222, 4224, 4277], [4223, 4225], [4144, 4224, 4226], [4225, 4227], [4226, 4228, 4278], [4227, 4229], [4145, 4228, 4230], [4229, 4231], [4230, 4232, 4279], [4231, 4233], [4146, 4232, 4234], [4233, 4235], [4234, 4236, 4280], [4235, 4237], [4147, 4236, 4238], [4237, 4239], [4238, 4240, 4281], [4239, 4241], [4148, 4240, 4242], [4241, 4243], [4242, 4244, 4282], [4243, 4245], [4149, 4244, 4246], [4245, 4247], [4246, 4248, 4283], [4247, 4249], [4150, 4248, 4250], [4249, 4251], [4250, 4252, 4284], [4251, 4253], [4151, 4252, 4254], [4253, 4255], [4254, 4256, 4285], [4255, 4257], [4152, 4256, 4258], [4257, 4259], [4258, 4286], [4155, 4289], [4159, 4293], [4163, 4297], [4167, 4301], [4171, 4305], [4175, 4309], [4179, 4313], [4183, 4317], [4187, 4321], [4191, 4325], [4195, 4329], [4199, 4333], [4203, 4337], [4207, 4341], [4211, 4345], [4215, 4349], [4219, 4353], [4223, 4357], [4227, 4361], [4231, 4365], [4235, 4369], [4239, 4373], [4243, 4377], [4247, 4381], [4251, 4385], [4255, 4389], [4259, 4393], [4288, 4394], [4287, 4289], [4260, 4288, 4290], [4289, 4291], [4290, 4292, 4395], [4291, 4293], [4261, 4292, 4294], [4293, 4295], [4294, 4296, 4396], [4295, 4297], [4262, 4296, 4298], [4297, 4299], [4298, 4300, 4397], [4299, 4301], [4263, 4300, 4302], [4301, 4303], [4302, 4304, 4398], [4303, 4305], [4264, 4304, 4306], [4305, 4307], [4306, 4308, 4399], [4307, 4309], [4265, 4308, 4310], [4309, 4311], [4310, 4312, 4400], [4311, 4313], [4266, 4312, 4314], [4313, 4315], [4314, 4316, 4401], [4315, 4317], [4267, 4316, 4318], [4317, 4319], [4318, 4320, 4402], [4319, 4321], [4268, 4320, 4322], [4321, 4323], [4322, 4324, 4403], [4323, 4325], [4269, 4324, 4326], [4325, 4327], [4326, 4328, 4404], [4327, 4329], [4270, 4328, 4330], [4329, 4331], [4330, 4332, 4405], [4331, 4333], [4271, 4332, 4334], [4333, 4335], [4334, 4336, 4406], [4335, 4337], [4272, 4336, 4338], [4337, 4339], [4338, 4340, 4407], [4339, 4341], [4273, 4340, 4342], [4341, 4343], [4342, 4344, 4408], [4343, 4345], [4274, 4344, 4346], [4345, 4347], [4346, 4348, 4409], [4347, 4349], [4275, 4348, 4350], [4349, 4351], [4350, 4352, 4410], [4351, 4353], [4276, 4352, 4354], [4353, 4355], [4354, 4356, 4411], [4355, 4357], [4277, 4356, 4358], [4357, 4359], [4358, 4360, 4412], [4359, 4361], [4278, 4360, 4362], [4361, 4363], [4362, 4364, 4413], [4363, 4365], [4279, 4364, 4366], [4365, 4367], [4366, 4368, 4414], [4367, 4369], [4280, 4368, 4370], [4369, 4371], [4370, 4372, 4415], [4371, 4373], [4281, 4372, 4374], [4373, 4375], [4374, 4376, 4416], [4375, 4377], [4282, 4376, 4378], [4377, 4379], [4378, 4380, 4417], [4379, 4381], [4283, 4380, 4382], [4381, 4383], [4382, 4384, 4418], [4383, 4385], [4284, 4384, 4386], [4385, 4387], [4386, 4388, 4419], [4387, 4389], [4285, 4388, 4390], [4389, 4391], [4390, 4392, 4420], [4391, 4393], [4286, 4392], [4287, 4421], [4291, 4425], [4295, 4429], [4299, 4433], [4303, 4437], [4307, 4441], [4311, 4445], [4315, 4449], [4319, 4453], [4323, 4457], [4327, 4461], [4331, 4465], [4335, 4469], [4339, 4473], [4343, 4477], [4347, 4481], [4351, 4485], [4355, 4489], [4359, 4493], [4363, 4497], [4367, 4501], [4371, 4505], [4375, 4509], [4379, 4513], [4383, 4517], [4387, 4521], [4391, 4525], [4394, 4422], [4421, 4423], [4422, 4424, 4528], [4423, 4425], [4395, 4424, 4426], [4425, 4427], [4426, 4428, 4529], [4427, 4429], [4396, 4428, 4430], [4429, 4431], [4430, 4432, 4530], [4431, 4433], [4397, 4432, 4434], [4433, 4435], [4434, 4436, 4531], [4435, 4437], [4398, 4436, 4438], [4437, 4439], [4438, 4440, 4532], [4439, 4441], [4399, 4440, 4442], [4441, 4443], [4442, 4444, 4533], [4443, 4445], [4400, 4444, 4446], [4445, 4447], [4446, 4448, 4534], [4447, 4449], [4401, 4448, 4450], [4449, 4451], [4450, 4452, 4535], [4451, 4453], [4402, 4452, 4454], [4453, 4455], [4454, 4456, 4536], [4455, 4457], [4403, 4456, 4458], [4457, 4459], [4458, 4460, 4537], [4459, 4461], [4404, 4460, 4462], [4461, 4463], [4462, 4464, 4538], [4463, 4465], [4405, 4464, 4466], [4465, 4467], [4466, 4468, 4539], [4467, 4469], [4406, 4468, 4470], [4469, 4471], [4470, 4472, 4540], [4471, 4473], [4407, 4472, 4474], [4473, 4475], [4474, 4476, 4541], [4475, 4477], [4408, 4476, 4478], [4477, 4479], [4478, 4480, 4542], [4479, 4481], [4409, 4480, 4482], [4481, 4483], [4482, 4484, 4543], [4483, 4485], [4410, 4484, 4486], [4485, 4487], [4486, 4488, 4544], [4487, 4489], [4411, 4488, 4490], [4489, 4491], [4490, 4492, 4545], [4491, 4493], [4412, 4492, 4494], [4493, 4495], [4494, 4496, 4546], [4495, 4497], [4413, 4496, 4498], [4497, 4499], [4498, 4500, 4547], [4499, 4501], [4414, 4500, 4502], [4501, 4503], [4502, 4504, 4548], [4503, 4505], [4415, 4504, 4506], [4505, 4507], [4506, 4508, 4549], [4507, 4509], [4416, 4508, 4510], [4509, 4511], [4510, 4512, 4550], [4511, 4513], [4417, 4512, 4514], [4513, 4515], [4514, 4516, 4551], [4515, 4517], [4418, 4516, 4518], [4517, 4519], [4518, 4520, 4552], [4519, 4521], [4419, 4520, 4522], [4521, 4523], [4522, 4524, 4553], [4523, 4525], [4420, 4524, 4526], [4525, 4527], [4526, 4554], [4423, 4557], [4427, 4561], [4431, 4565], [4435, 4569], [4439, 4573], [4443, 4577], [4447, 4581], [4451, 4585], [4455, 4589], [4459, 4593], [4463, 4597], [4467, 4601], [4471, 4605], [4475, 4609], [4479, 4613], [4483, 4617], [4487, 4621], [4491, 4625], [4495, 4629], [4499, 4633], [4503, 4637], [4507, 4641], [4511, 4645], [4515, 4649], [4519, 4653], [4523, 4657], [4527, 4661], [4556, 4662], [4555, 4557], [4528, 4556, 4558], [4557, 4559], [4558, 4560, 4663], [4559, 4561], [4529, 4560, 4562], [4561, 4563], [4562, 4564, 4664], [4563, 4565], [4530, 4564, 4566], [4565, 4567], [4566, 4568, 4665], [4567, 4569], [4531, 4568, 4570], [4569, 4571], [4570, 4572, 4666], [4571, 4573], [4532, 4572, 4574], [4573, 4575], [4574, 4576, 4667], [4575, 4577], [4533, 4576, 4578], [4577, 4579], [4578, 4580, 4668], [4579, 4581], [4534, 4580, 4582], [4581, 4583], [4582, 4584, 4669], [4583, 4585], [4535, 4584, 4586], [4585, 4587], [4586, 4588, 4670], [4587, 4589], [4536, 4588, 4590], [4589, 4591], [4590, 4592, 4671], [4591, 4593], [4537, 4592, 4594], [4593, 4595], [4594, 4596, 4672], [4595, 4597], [4538, 4596, 4598], [4597, 4599], [4598, 4600, 4673], [4599, 4601], [4539, 4600, 4602], [4601, 4603], [4602, 4604, 4674], [4603, 4605], [4540, 4604, 4606], [4605, 4607], [4606, 4608, 4675], [4607, 4609], [4541, 4608, 4610], [4609, 4611], [4610, 4612, 4676], [4611, 4613], [4542, 4612, 4614], [4613, 4615], [4614, 4616, 4677], [4615, 4617], [4543, 4616, 4618], [4617, 4619], [4618, 4620, 4678], [4619, 4621], [4544, 4620, 4622], [4621, 4623], [4622, 4624, 4679], [4623, 4625], [4545, 4624, 4626], [4625, 4627], [4626, 4628, 4680], [4627, 4629], [4546, 4628, 4630], [4629, 4631], [4630, 4632, 4681], [4631, 4633], [4547, 4632, 4634], [4633, 4635], [4634, 4636, 4682], [4635, 4637], [4548, 4636, 4638], [4637, 4639], [4638, 4640, 4683], [4639, 4641], [4549, 4640, 4642], [4641, 4643], [4642, 4644, 4684], [4643, 4645], [4550, 4644, 4646], [4645, 4647], [4646, 4648, 4685], [4647, 4649], [4551, 4648, 4650], [4649, 4651], [4650, 4652, 4686], [4651, 4653], [4552, 4652, 4654], [4653, 4655], [4654, 4656, 4687], [4655, 4657], [4553, 4656, 4658], [4657, 4659], [4658, 4660, 4688], [4659, 4661], [4554, 4660], [4555, 4689], [4559, 4693], [4563, 4697], [4567, 4701], [4571, 4705], [4575, 4709], [4579, 4713], [4583, 4717], [4587, 4721], [4591, 4725], [4595, 4729], [4599, 4733], [4603, 4737], [4607, 4741], [4611, 4745], [4615, 4749], [4619, 4753], [4623, 4757], [4627, 4761], [4631, 4765], [4635, 4769], [4639, 4773], [4643, 4777], [4647, 4781], [4651, 4785], [4655, 4789], [4659, 4793], [4662, 4690], [4689, 4691], [4690, 4692, 4796], [4691, 4693], [4663, 4692, 4694], [4693, 4695], [4694, 4696, 4797], [4695, 4697], [4664, 4696, 4698], [4697, 4699], [4698, 4700, 4798], [4699, 4701], [4665, 4700, 4702], [4701, 4703], [4702, 4704, 4799], [4703, 4705], [4666, 4704, 4706], [4705, 4707], [4706, 4708, 4800], [4707, 4709], [4667, 4708, 4710], [4709, 4711], [4710, 4712, 4801], [4711, 4713], [4668, 4712, 4714], [4713, 4715], [4714, 4716, 4802], [4715, 4717], [4669, 4716, 4718], [4717, 4719], [4718, 4720, 4803], [4719, 4721], [4670, 4720, 4722], [4721, 4723], [4722, 4724, 4804], [4723, 4725], [4671, 4724, 4726], [4725, 4727], [4726, 4728, 4805], [4727, 4729], [4672, 4728, 4730], [4729, 4731], [4730, 4732, 4806], [4731, 4733], [4673, 4732, 4734], [4733, 4735], [4734, 4736, 4807], [4735, 4737], [4674, 4736, 4738], [4737, 4739], [4738, 4740, 4808], [4739, 4741], [4675, 4740, 4742], [4741, 4743], [4742, 4744, 4809], [4743, 4745], [4676, 4744, 4746], [4745, 4747], [4746, 4748, 4810], [4747, 4749], [4677, 4748, 4750], [4749, 4751], [4750, 4752, 4811], [4751, 4753], [4678, 4752, 4754], [4753, 4755], [4754, 4756, 4812], [4755, 4757], [4679, 4756, 4758], [4757, 4759], [4758, 4760, 4813], [4759, 4761], [4680, 4760, 4762], [4761, 4763], [4762, 4764, 4814], [4763, 4765], [4681, 4764, 4766], [4765, 4767], [4766, 4768, 4815], [4767, 4769], [4682, 4768, 4770], [4769, 4771], [4770, 4772, 4816], [4771, 4773], [4683, 4772, 4774], [4773, 4775], [4774, 4776, 4817], [4775, 4777], [4684, 4776, 4778], [4777, 4779], [4778, 4780, 4818], [4779, 4781], [4685, 4780, 4782], [4781, 4783], [4782, 4784, 4819], [4783, 4785], [4686, 4784, 4786], [4785, 4787], [4786, 4788, 4820], [4787, 4789], [4687, 4788, 4790], [4789, 4791], [4790, 4792, 4821], [4791, 4793], [4688, 4792, 4794], [4793, 4795], [4794, 4822], [4691, 4825], [4695, 4829], [4699, 4833], [4703, 4837], [4707, 4841], [4711, 4845], [4715, 4849], [4719, 4853], [4723, 4857], [4727, 4861], [4731, 4865], [4735, 4869], [4739, 4873], [4743, 4877], [4747, 4881], [4751, 4885], [4755, 4889], [4759, 4893], [4763, 4897], [4767, 4901], [4771, 4905], [4775, 4909], [4779, 4913], [4783, 4917], [4787, 4921], [4791, 4925], [4795, 4929], [4824, 4930], [4823, 4825], [4796, 4824, 4826], [4825, 4827], [4826, 4828, 4931], [4827, 4829], [4797, 4828, 4830], [4829, 4831], [4830, 4832, 4932], [4831, 4833], [4798, 4832, 4834], [4833, 4835], [4834, 4836, 4933], [4835, 4837], [4799, 4836, 4838], [4837, 4839], [4838, 4840, 4934], [4839, 4841], [4800, 4840, 4842], [4841, 4843], [4842, 4844, 4935], [4843, 4845], [4801, 4844, 4846], [4845, 4847], [4846, 4848, 4936], [4847, 4849], [4802, 4848, 4850], [4849, 4851], [4850, 4852, 4937], [4851, 4853], [4803, 4852, 4854], [4853, 4855], [4854, 4856, 4938], [4855, 4857], [4804, 4856, 4858], [4857, 4859], [4858, 4860, 4939], [4859, 4861], [4805, 4860, 4862], [4861, 4863], [4862, 4864, 4940], [4863, 4865], [4806, 4864, 4866], [4865, 4867], [4866, 4868, 4941], [4867, 4869], [4807, 4868, 4870], [4869, 4871], [4870, 4872, 4942], [4871, 4873], [4808, 4872, 4874], [4873, 4875], [4874, 4876, 4943], [4875, 4877], [4809, 4876, 4878], [4877, 4879], [4878, 4880, 4944], [4879, 4881], [4810, 4880, 4882], [4881, 4883], [4882, 4884, 4945], [4883, 4885], [4811, 4884, 4886], [4885, 4887], [4886, 4888, 4946], [4887, 4889], [4812, 4888, 4890], [4889, 4891], [4890, 4892, 4947], [4891, 4893], [4813, 4892, 4894], [4893, 4895], [4894, 4896, 4948], [4895, 4897], [4814, 4896, 4898], [4897, 4899], [4898, 4900, 4949], [4899, 4901], [4815, 4900, 4902], [4901, 4903], [4902, 4904, 4950], [4903, 4905], [4816, 4904, 4906], [4905, 4907], [4906, 4908, 4951], [4907, 4909], [4817, 4908, 4910], [4909, 4911], [4910, 4912, 4952], [4911, 4913], [4818, 4912, 4914], [4913, 4915], [4914, 4916, 4953], [4915, 4917], [4819, 4916, 4918], [4917, 4919], [4918, 4920, 4954], [4919, 4921], [4820, 4920, 4922], [4921, 4923], [4922, 4924, 4955], [4923, 4925], [4821, 4924, 4926], [4925, 4927], [4926, 4928, 4956], [4927, 4929], [4822, 4928], [4823, 4957], [4827, 4961], [4831, 4965], [4835, 4969], [4839, 4973], [4843, 4977], [4847, 4981], [4851, 4985], [4855, 4989], [4859, 4993], [4863, 4997], [4867, 5001], [4871, 5005], [4875, 5009], [4879, 5013], [4883, 5017], [4887, 5021], [4891, 5025], [4895, 5029], [4899, 5033], [4903, 5037], [4907, 5041], [4911, 5045], [4915, 5049], [4919, 5053], [4923, 5057], [4927, 5061], [4930, 4958], [4957, 4959], [4958, 4960, 5064], [4959, 4961], [4931, 4960, 4962], [4961, 4963], [4962, 4964, 5065], [4963, 4965], [4932, 4964, 4966], [4965, 4967], [4966, 4968, 5066], [4967, 4969], [4933, 4968, 4970], [4969, 4971], [4970, 4972, 5067], [4971, 4973], [4934, 4972, 4974], [4973, 4975], [4974, 4976, 5068], [4975, 4977], [4935, 4976, 4978], [4977, 4979], [4978, 4980, 5069], [4979, 4981], [4936, 4980, 4982], [4981, 4983], [4982, 4984, 5070], [4983, 4985], [4937, 4984, 4986], [4985, 4987], [4986, 4988, 5071], [4987, 4989], [4938, 4988, 4990], [4989, 4991], [4990, 4992, 5072], [4991, 4993], [4939, 4992, 4994], [4993, 4995], [4994, 4996, 5073], [4995, 4997], [4940, 4996, 4998], [4997, 4999], [4998, 5000, 5074], [4999, 5001], [4941, 5000, 5002], [5001, 5003], [5002, 5004, 5075], [5003, 5005], [4942, 5004, 5006], [5005, 5007], [5006, 5008, 5076], [5007, 5009], [4943, 5008, 5010], [5009, 5011], [5010, 5012, 5077], [5011, 5013], [4944, 5012, 5014], [5013, 5015], [5014, 5016, 5078], [5015, 5017], [4945, 5016, 5018], [5017, 5019], [5018, 5020, 5079], [5019, 5021], [4946, 5020, 5022], [5021, 5023], [5022, 5024, 5080], [5023, 5025], [4947, 5024, 5026], [5025, 5027], [5026, 5028, 5081], [5027, 5029], [4948, 5028, 5030], [5029, 5031], [5030, 5032, 5082], [5031, 5033], [4949, 5032, 5034], [5033, 5035], [5034, 5036, 5083], [5035, 5037], [4950, 5036, 5038], [5037, 5039], [5038, 5040, 5084], [5039, 5041], [4951, 5040, 5042], [5041, 5043], [5042, 5044, 5085], [5043, 5045], [4952, 5044, 5046], [5045, 5047], [5046, 5048, 5086], [5047, 5049], [4953, 5048, 5050], [5049, 5051], [5050, 5052, 5087], [5051, 5053], [4954, 5052, 5054], [5053, 5055], [5054, 5056, 5088], [5055, 5057], [4955, 5056, 5058], [5057, 5059], [5058, 5060, 5089], [5059, 5061], [4956, 5060, 5062], [5061, 5063], [5062, 5090], [4959, 5093], [4963, 5097], [4967, 5101], [4971, 5105], [4975, 5109], [4979, 5113], [4983, 5117], [4987, 5121], [4991, 5125], [4995, 5129], [4999, 5133], [5003, 5137], [5007, 5141], [5011, 5145], [5015, 5149], [5019, 5153], [5023, 5157], [5027, 5161], [5031, 5165], [5035, 5169], [5039, 5173], [5043, 5177], [5047, 5181], [5051, 5185], [5055, 5189], [5059, 5193], [5063, 5197], [5092, 5198], [5091, 5093], [5064, 5092, 5094], [5093, 5095], [5094, 5096, 5199], [5095, 5097], [5065, 5096, 5098], [5097, 5099], [5098, 5100, 5200], [5099, 5101], [5066, 5100, 5102], [5101, 5103], [5102, 5104, 5201], [5103, 5105], [5067, 5104, 5106], [5105, 5107], [5106, 5108, 5202], [5107, 5109], [5068, 5108, 5110], [5109, 5111], [5110, 5112, 5203], [5111, 5113], [5069, 5112, 5114], [5113, 5115], [5114, 5116, 5204], [5115, 5117], [5070, 5116, 5118], [5117, 5119], [5118, 5120, 5205], [5119, 5121], [5071, 5120, 5122], [5121, 5123], [5122, 5124, 5206], [5123, 5125], [5072, 5124, 5126], [5125, 5127], [5126, 5128, 5207], [5127, 5129], [5073, 5128, 5130], [5129, 5131], [5130, 5132, 5208], [5131, 5133], [5074, 5132, 5134], [5133, 5135], [5134, 5136, 5209], [5135, 5137], [5075, 5136, 5138], [5137, 5139], [5138, 5140, 5210], [5139, 5141], [5076, 5140, 5142], [5141, 5143], [5142, 5144, 5211], [5143, 5145], [5077, 5144, 5146], [5145, 5147], [5146, 5148, 5212], [5147, 5149], [5078, 5148, 5150], [5149, 5151], [5150, 5152, 5213], [5151, 5153], [5079, 5152, 5154], [5153, 5155], [5154, 5156, 5214], [5155, 5157], [5080, 5156, 5158], [5157, 5159], [5158, 5160, 5215], [5159, 5161], [5081, 5160, 5162], [5161, 5163], [5162, 5164, 5216], [5163, 5165], [5082, 5164, 5166], [5165, 5167], [5166, 5168, 5217], [5167, 5169], [5083, 5168, 5170], [5169, 5171], [5170, 5172, 5218], [5171, 5173], [5084, 5172, 5174], [5173, 5175], [5174, 5176, 5219], [5175, 5177], [5085, 5176, 5178], [5177, 5179], [5178, 5180, 5220], [5179, 5181], [5086, 5180, 5182], [5181, 5183], [5182, 5184, 5221], [5183, 5185], [5087, 5184, 5186], [5185, 5187], [5186, 5188, 5222], [5187, 5189], [5088, 5188, 5190], [5189, 5191], [5190, 5192, 5223], [5191, 5193], [5089, 5192, 5194], [5193, 5195], [5194, 5196, 5224], [5195, 5197], [5090, 5196], [5091, 5225], [5095, 5229], [5099, 5233], [5103, 5237], [5107, 5241], [5111, 5245], [5115, 5249], [5119, 5253], [5123, 5257], [5127, 5261], [5131, 5265], [5135, 5269], [5139, 5273], [5143, 5277], [5147, 5281], [5151, 5285], [5155, 5289], [5159, 5293], [5163, 5297], [5167, 5301], [5171, 5305], [5175, 5309], [5179, 5313], [5183, 5317], [5187, 5321], [5191, 5325], [5195, 5329], [5198, 5226], [5225, 5227], [5226, 5228, 5332], [5227, 5229], [5199, 5228, 5230], [5229, 5231], [5230, 5232, 5333], [5231, 5233], [5200, 5232, 5234], [5233, 5235], [5234, 5236, 5334], [5235, 5237], [5201, 5236, 5238], [5237, 5239], [5238, 5240, 5335], [5239, 5241], [5202, 5240, 5242], [5241, 5243], [5242, 5244, 5336], [5243, 5245], [5203, 5244, 5246], [5245, 5247], [5246, 5248, 5337], [5247, 5249], [5204, 5248, 5250], [5249, 5251], [5250, 5252, 5338], [5251, 5253], [5205, 5252, 5254], [5253, 5255], [5254, 5256, 5339], [5255, 5257], [5206, 5256, 5258], [5257, 5259], [5258, 5260, 5340], [5259, 5261], [5207, 5260, 5262], [5261, 5263], [5262, 5264, 5341], [5263, 5265], [5208, 5264, 5266], [5265, 5267], [5266, 5268, 5342], [5267, 5269], [5209, 5268, 5270], [5269, 5271], [5270, 5272, 5343], [5271, 5273], [5210, 5272, 5274], [5273, 5275], [5274, 5276, 5344], [5275, 5277], [5211, 5276, 5278], [5277, 5279], [5278, 5280, 5345], [5279, 5281], [5212, 5280, 5282], [5281, 5283], [5282, 5284, 5346], [5283, 5285], [5213, 5284, 5286], [5285, 5287], [5286, 5288, 5347], [5287, 5289], [5214, 5288, 5290], [5289, 5291], [5290, 5292, 5348], [5291, 5293], [5215, 5292, 5294], [5293, 5295], [5294, 5296, 5349], [5295, 5297], [5216, 5296, 5298], [5297, 5299], [5298, 5300, 5350], [5299, 5301], [5217, 5300, 5302], [5301, 5303], [5302, 5304, 5351], [5303, 5305], [5218, 5304, 5306], [5305, 5307], [5306, 5308, 5352], [5307, 5309], [5219, 5308, 5310], [5309, 5311], [5310, 5312, 5353], [5311, 5313], [5220, 5312, 5314], [5313, 5315], [5314, 5316, 5354], [5315, 5317], [5221, 5316, 5318], [5317, 5319], [5318, 5320, 5355], [5319, 5321], [5222, 5320, 5322], [5321, 5323], [5322, 5324, 5356], [5323, 5325], [5223, 5324, 5326], [5325, 5327], [5326, 5328, 5357], [5327, 5329], [5224, 5328, 5330], [5329, 5331], [5330, 5358], [5227, 5361], [5231, 5365], [5235, 5369], [5239, 5373], [5243, 5377], [5247, 5381], [5251, 5385], [5255, 5389], [5259, 5393], [5263, 5397], [5267, 5401], [5271, 5405], [5275, 5409], [5279, 5413], [5283, 5417], [5287, 5421], [5291, 5425], [5295, 5429], [5299, 5433], [5303, 5437], [5307, 5441], [5311, 5445], [5315, 5449], [5319, 5453], [5323, 5457], [5327, 5461], [5331, 5465], [5360, 5466], [5359, 5361], [5332, 5360, 5362], [5361, 5363], [5362, 5364, 5467], [5363, 5365], [5333, 5364, 5366], [5365, 5367], [5366, 5368, 5468], [5367, 5369], [5334, 5368, 5370], [5369, 5371], [5370, 5372, 5469], [5371, 5373], [5335, 5372, 5374], [5373, 5375], [5374, 5376, 5470], [5375, 5377], [5336, 5376, 5378], [5377, 5379], [5378, 5380, 5471], [5379, 5381], [5337, 5380, 5382], [5381, 5383], [5382, 5384, 5472], [5383, 5385], [5338, 5384, 5386], [5385, 5387], [5386, 5388, 5473], [5387, 5389], [5339, 5388, 5390], [5389, 5391], [5390, 5392, 5474], [5391, 5393], [5340, 5392, 5394], [5393, 5395], [5394, 5396, 5475], [5395, 5397], [5341, 5396, 5398], [5397, 5399], [5398, 5400, 5476], [5399, 5401], [5342, 5400, 5402], [5401, 5403], [5402, 5404, 5477], [5403, 5405], [5343, 5404, 5406], [5405, 5407], [5406, 5408, 5478], [5407, 5409], [5344, 5408, 5410], [5409, 5411], [5410, 5412, 5479], [5411, 5413], [5345, 5412, 5414], [5413, 5415], [5414, 5416, 5480], [5415, 5417], [5346, 5416, 5418], [5417, 5419], [5418, 5420, 5481], [5419, 5421], [5347, 5420, 5422], [5421, 5423], [5422, 5424, 5482], [5423, 5425], [5348, 5424, 5426], [5425, 5427], [5426, 5428, 5483], [5427, 5429], [5349, 5428, 5430], [5429, 5431], [5430, 5432, 5484], [5431, 5433], [5350, 5432, 5434], [5433, 5435], [5434, 5436, 5485], [5435, 5437], [5351, 5436, 5438], [5437, 5439], [5438, 5440, 5486], [5439, 5441], [5352, 5440, 5442], [5441, 5443], [5442, 5444, 5487], [5443, 5445], [5353, 5444, 5446], [5445, 5447], [5446, 5448, 5488], [5447, 5449], [5354, 5448, 5450], [5449, 5451], [5450, 5452, 5489], [5451, 5453], [5355, 5452, 5454], [5453, 5455], [5454, 5456, 5490], [5455, 5457], [5356, 5456, 5458], [5457, 5459], [5458, 5460, 5491], [5459, 5461], [5357, 5460, 5462], [5461, 5463], [5462, 5464, 5492], [5463, 5465], [5358, 5464], [5359, 5493], [5363, 5497], [5367, 5501], [5371, 5505], [5375, 5509], [5379, 5513], [5383, 5517], [5387, 5521], [5391, 5525], [5395, 5529], [5399, 5533], [5403, 5537], [5407, 5541], [5411, 5545], [5415, 5549], [5419, 5553], [5423, 5557], [5427, 5561], [5431, 5565], [5435, 5569], [5439, 5573], [5443, 5577], [5447, 5581], [5451, 5585], [5455, 5589], [5459, 5593], [5463, 5597], [5466, 5494], [5493, 5495], [5494, 5496, 5600], [5495, 5497], [5467, 5496, 5498], [5497, 5499], [5498, 5500, 5601], [5499, 5501], [5468, 5500, 5502], [5501, 5503], [5502, 5504, 5602], [5503, 5505], [5469, 5504, 5506], [5505, 5507], [5506, 5508, 5603], [5507, 5509], [5470, 5508, 5510], [5509, 5511], [5510, 5512, 5604], [5511, 5513], [5471, 5512, 5514], [5513, 5515], [5514, 5516, 5605], [5515, 5517], [5472, 5516, 5518], [5517, 5519], [5518, 5520, 5606], [5519, 5521], [5473, 5520, 5522], [5521, 5523], [5522, 5524, 5607], [5523, 5525], [5474, 5524, 5526], [5525, 5527], [5526, 5528, 5608], [5527, 5529], [5475, 5528, 5530], [5529, 5531], [5530, 5532, 5609], [5531, 5533], [5476, 5532, 5534], [5533, 5535], [5534, 5536, 5610], [5535, 5537], [5477, 5536, 5538], [5537, 5539], [5538, 5540, 5611], [5539, 5541], [5478, 5540, 5542], [5541, 5543], [5542, 5544, 5612], [5543, 5545], [5479, 5544, 5546], [5545, 5547], [5546, 5548, 5613], [5547, 5549], [5480, 5548, 5550], [5549, 5551], [5550, 5552, 5614], [5551, 5553], [5481, 5552, 5554], [5553, 5555], [5554, 5556, 5615], [5555, 5557], [5482, 5556, 5558], [5557, 5559], [5558, 5560, 5616], [5559, 5561], [5483, 5560, 5562], [5561, 5563], [5562, 5564, 5617], [5563, 5565], [5484, 5564, 5566], [5565, 5567], [5566, 5568, 5618], [5567, 5569], [5485, 5568, 5570], [5569, 5571], [5570, 5572, 5619], [5571, 5573], [5486, 5572, 5574], [5573, 5575], [5574, 5576, 5620], [5575, 5577], [5487, 5576, 5578], [5577, 5579], [5578, 5580, 5621], [5579, 5581], [5488, 5580, 5582], [5581, 5583], [5582, 5584, 5622], [5583, 5585], [5489, 5584, 5586], [5585, 5587], [5586, 5588, 5623], [5587, 5589], [5490, 5588, 5590], [5589, 5591], [5590, 5592, 5624], [5591, 5593], [5491, 5592, 5594], [5593, 5595], [5594, 5596, 5625], [5595, 5597], [5492, 5596, 5598], [5597, 5599], [5598, 5626], [5495, 5629], [5499, 5633], [5503, 5637], [5507, 5641], [5511, 5645], [5515, 5649], [5519, 5653], [5523, 5657], [5527, 5661], [5531, 5665], [5535, 5669], [5539, 5673], [5543, 5677], [5547, 5681], [5551, 5685], [5555, 5689], [5559, 5693], [5563, 5697], [5567, 5701], [5571, 5705], [5575, 5709], [5579, 5713], [5583, 5717], [5587, 5721], [5591, 5725], [5595, 5729], [5599, 5733], [5628, 5734], [5627, 5629], [5600, 5628, 5630], [5629, 5631], [5630, 5632, 5735], [5631, 5633], [5601, 5632, 5634], [5633, 5635], [5634, 5636, 5736], [5635, 5637], [5602, 5636, 5638], [5637, 5639], [5638, 5640, 5737], [5639, 5641], [5603, 5640, 5642], [5641, 5643], [5642, 5644, 5738], [5643, 5645], [5604, 5644, 5646], [5645, 5647], [5646, 5648, 5739], [5647, 5649], [5605, 5648, 5650], [5649, 5651], [5650, 5652, 5740], [5651, 5653], [5606, 5652, 5654], [5653, 5655], [5654, 5656, 5741], [5655, 5657], [5607, 5656, 5658], [5657, 5659], [5658, 5660, 5742], [5659, 5661], [5608, 5660, 5662], [5661, 5663], [5662, 5664, 5743], [5663, 5665], [5609, 5664, 5666], [5665, 5667], [5666, 5668, 5744], [5667, 5669], [5610, 5668, 5670], [5669, 5671], [5670, 5672, 5745], [5671, 5673], [5611, 5672, 5674], [5673, 5675], [5674, 5676, 5746], [5675, 5677], [5612, 5676, 5678], [5677, 5679], [5678, 5680, 5747], [5679, 5681], [5613, 5680, 5682], [5681, 5683], [5682, 5684, 5748], [5683, 5685], [5614, 5684, 5686], [5685, 5687], [5686, 5688, 5749], [5687, 5689], [5615, 5688, 5690], [5689, 5691], [5690, 5692, 5750], [5691, 5693], [5616, 5692, 5694], [5693, 5695], [5694, 5696, 5751], [5695, 5697], [5617, 5696, 5698], [5697, 5699], [5698, 5700, 5752], [5699, 5701], [5618, 5700, 5702], [5701, 5703], [5702, 5704, 5753], [5703, 5705], [5619, 5704, 5706], [5705, 5707], [5706, 5708, 5754], [5707, 5709], [5620, 5708, 5710], [5709, 5711], [5710, 5712, 5755], [5711, 5713], [5621, 5712, 5714], [5713, 5715], [5714, 5716, 5756], [5715, 5717], [5622, 5716, 5718], [5717, 5719], [5718, 5720, 5757], [5719, 5721], [5623, 5720, 5722], [5721, 5723], [5722, 5724, 5758], [5723, 5725], [5624, 5724, 5726], [5725, 5727], [5726, 5728, 5759], [5727, 5729], [5625, 5728, 5730], [5729, 5731], [5730, 5732, 5760], [5731, 5733], [5626, 5732], [5627, 5761], [5631, 5765], [5635, 5769], [5639, 5773], [5643, 5777], [5647, 5781], [5651, 5785], [5655, 5789], [5659, 5793], [5663, 5797], [5667, 5801], [5671, 5805], [5675, 5809], [5679, 5813], [5683, 5817], [5687, 5821], [5691, 5825], [5695, 5829], [5699, 5833], [5703, 5837], [5707, 5841], [5711, 5845], [5715, 5849], [5719, 5853], [5723, 5857], [5727, 5861], [5731, 5865], [5734, 5762], [5761, 5763], [5762, 5764, 5868], [5763, 5765], [5735, 5764, 5766], [5765, 5767], [5766, 5768, 5869], [5767, 5769], [5736, 5768, 5770], [5769, 5771], [5770, 5772, 5870], [5771, 5773], [5737, 5772, 5774], [5773, 5775], [5774, 5776, 5871], [5775, 5777], [5738, 5776, 5778], [5777, 5779], [5778, 5780, 5872], [5779, 5781], [5739, 5780, 5782], [5781, 5783], [5782, 5784, 5873], [5783, 5785], [5740, 5784, 5786], [5785, 5787], [5786, 5788, 5874], [5787, 5789], [5741, 5788, 5790], [5789, 5791], [5790, 5792, 5875], [5791, 5793], [5742, 5792, 5794], [5793, 5795], [5794, 5796, 5876], [5795, 5797], [5743, 5796, 5798], [5797, 5799], [5798, 5800, 5877], [5799, 5801], [5744, 5800, 5802], [5801, 5803], [5802, 5804, 5878], [5803, 5805], [5745, 5804, 5806], [5805, 5807], [5806, 5808, 5879], [5807, 5809], [5746, 5808, 5810], [5809, 5811], [5810, 5812, 5880], [5811, 5813], [5747, 5812, 5814], [5813, 5815], [5814, 5816, 5881], [5815, 5817], [5748, 5816, 5818], [5817, 5819], [5818, 5820, 5882], [5819, 5821], [5749, 5820, 5822], [5821, 5823], [5822, 5824, 5883], [5823, 5825], [5750, 5824, 5826], [5825, 5827], [5826, 5828, 5884], [5827, 5829], [5751, 5828, 5830], [5829, 5831], [5830, 5832, 5885], [5831, 5833], [5752, 5832, 5834], [5833, 5835], [5834, 5836, 5886], [5835, 5837], [5753, 5836, 5838], [5837, 5839], [5838, 5840, 5887], [5839, 5841], [5754, 5840, 5842], [5841, 5843], [5842, 5844, 5888], [5843, 5845], [5755, 5844, 5846], [5845, 5847], [5846, 5848, 5889], [5847, 5849], [5756, 5848, 5850], [5849, 5851], [5850, 5852, 5890], [5851, 5853], [5757, 5852, 5854], [5853, 5855], [5854, 5856, 5891], [5855, 5857], [5758, 5856, 5858], [5857, 5859], [5858, 5860, 5892], [5859, 5861], [5759, 5860, 5862], [5861, 5863], [5862, 5864, 5893], [5863, 5865], [5760, 5864, 5866], [5865, 5867], [5866, 5894], [5763, 5897], [5767, 5901], [5771, 5905], [5775, 5909], [5779, 5913], [5783, 5917], [5787, 5921], [5791, 5925], [5795, 5929], [5799, 5933], [5803, 5937], [5807, 5941], [5811, 5945], [5815, 5949], [5819, 5953], [5823, 5957], [5827, 5961], [5831, 5965], [5835, 5969], [5839, 5973], [5843, 5977], [5847, 5981], [5851, 5985], [5855, 5989], [5859, 5993], [5863, 5997], [5867, 6001], [5896, 6002], [5895, 5897], [5868, 5896, 5898], [5897, 5899], [5898, 5900, 6003], [5899, 5901], [5869, 5900, 5902], [5901, 5903], [5902, 5904, 6004], [5903, 5905], [5870, 5904, 5906], [5905, 5907], [5906, 5908, 6005], [5907, 5909], [5871, 5908, 5910], [5909, 5911], [5910, 5912, 6006], [5911, 5913], [5872, 5912, 5914], [5913, 5915], [5914, 5916, 6007], [5915, 5917], [5873, 5916, 5918], [5917, 5919], [5918, 5920, 6008], [5919, 5921], [5874, 5920, 5922], [5921, 5923], [5922, 5924, 6009], [5923, 5925], [5875, 5924, 5926], [5925, 5927], [5926, 5928, 6010], [5927, 5929], [5876, 5928, 5930], [5929, 5931], [5930, 5932, 6011], [5931, 5933], [5877, 5932, 5934], [5933, 5935], [5934, 5936, 6012], [5935, 5937], [5878, 5936, 5938], [5937, 5939], [5938, 5940, 6013], [5939, 5941], [5879, 5940, 5942], [5941, 5943], [5942, 5944, 6014], [5943, 5945], [5880, 5944, 5946], [5945, 5947], [5946, 5948, 6015], [5947, 5949], [5881, 5948, 5950], [5949, 5951], [5950, 5952, 6016], [5951, 5953], [5882, 5952, 5954], [5953, 5955], [5954, 5956, 6017], [5955, 5957], [5883, 5956, 5958], [5957, 5959], [5958, 5960, 6018], [5959, 5961], [5884, 5960, 5962], [5961, 5963], [5962, 5964, 6019], [5963, 5965], [5885, 5964, 5966], [5965, 5967], [5966, 5968, 6020], [5967, 5969], [5886, 5968, 5970], [5969, 5971], [5970, 5972, 6021], [5971, 5973], [5887, 5972, 5974], [5973, 5975], [5974, 5976, 6022], [5975, 5977], [5888, 5976, 5978], [5977, 5979], [5978, 5980, 6023], [5979, 5981], [5889, 5980, 5982], [5981, 5983], [5982, 5984, 6024], [5983, 5985], [5890, 5984, 5986], [5985, 5987], [5986, 5988, 6025], [5987, 5989], [5891, 5988, 5990], [5989, 5991], [5990, 5992, 6026], [5991, 5993], [5892, 5992, 5994], [5993, 5995], [5994, 5996, 6027], [5995, 5997], [5893, 5996, 5998], [5997, 5999], [5998, 6000, 6028], [5999, 6001], [5894, 6000], [5895, 6029], [5899, 6033], [5903, 6037], [5907, 6041], [5911, 6045], [5915, 6049], [5919, 6053], [5923, 6057], [5927, 6061], [5931, 6065], [5935, 6069], [5939, 6073], [5943, 6077], [5947, 6081], [5951, 6085], [5955, 6089], [5959, 6093], [5963, 6097], [5967, 6101], [5971, 6105], [5975, 6109], [5979, 6113], [5983, 6117], [5987, 6121], [5991, 6125], [5995, 6129], [5999, 6133], [6002, 6030], [6029, 6031], [6030, 6032, 6136], [6031, 6033], [6003, 6032, 6034], [6033, 6035], [6034, 6036, 6137], [6035, 6037], [6004, 6036, 6038], [6037, 6039], [6038, 6040, 6138], [6039, 6041], [6005, 6040, 6042], [6041, 6043], [6042, 6044, 6139], [6043, 6045], [6006, 6044, 6046], [6045, 6047], [6046, 6048, 6140], [6047, 6049], [6007, 6048, 6050], [6049, 6051], [6050, 6052, 6141], [6051, 6053], [6008, 6052, 6054], [6053, 6055], [6054, 6056, 6142], [6055, 6057], [6009, 6056, 6058], [6057, 6059], [6058, 6060, 6143], [6059, 6061], [6010, 6060, 6062], [6061, 6063], [6062, 6064, 6144], [6063, 6065], [6011, 6064, 6066], [6065, 6067], [6066, 6068, 6145], [6067, 6069], [6012, 6068, 6070], [6069, 6071], [6070, 6072, 6146], [6071, 6073], [6013, 6072, 6074], [6073, 6075], [6074, 6076, 6147], [6075, 6077], [6014, 6076, 6078], [6077, 6079], [6078, 6080, 6148], [6079, 6081], [6015, 6080, 6082], [6081, 6083], [6082, 6084, 6149], [6083, 6085], [6016, 6084, 6086], [6085, 6087], [6086, 6088, 6150], [6087, 6089], [6017, 6088, 6090], [6089, 6091], [6090, 6092, 6151], [6091, 6093], [6018, 6092, 6094], [6093, 6095], [6094, 6096, 6152], [6095, 6097], [6019, 6096, 6098], [6097, 6099], [6098, 6100, 6153], [6099, 6101], [6020, 6100, 6102], [6101, 6103], [6102, 6104, 6154], [6103, 6105], [6021, 6104, 6106], [6105, 6107], [6106, 6108, 6155], [6107, 6109], [6022, 6108, 6110], [6109, 6111], [6110, 6112, 6156], [6111, 6113], [6023, 6112, 6114], [6113, 6115], [6114, 6116, 6157], [6115, 6117], [6024, 6116, 6118], [6117, 6119], [6118, 6120, 6158], [6119, 6121], [6025, 6120, 6122], [6121, 6123], [6122, 6124, 6159], [6123, 6125], [6026, 6124, 6126], [6125, 6127], [6126, 6128, 6160], [6127, 6129], [6027, 6128, 6130], [6129, 6131], [6130, 6132, 6161], [6131, 6133], [6028, 6132, 6134], [6133, 6135], [6134, 6162], [6031, 6165], [6035, 6169], [6039, 6173], [6043, 6177], [6047, 6181], [6051, 6185], [6055, 6189], [6059, 6193], [6063, 6197], [6067, 6201], [6071, 6205], [6075, 6209], [6079, 6213], [6083, 6217], [6087, 6221], [6091, 6225], [6095, 6229], [6099, 6233], [6103, 6237], [6107, 6241], [6111, 6245], [6115, 6249], [6119, 6253], [6123, 6257], [6127, 6261], [6131, 6265], [6135, 6269], [6164, 6270], [6163, 6165], [6136, 6164, 6166], [6165, 6167], [6166, 6168, 6271], [6167, 6169], [6137, 6168, 6170], [6169, 6171], [6170, 6172, 6272], [6171, 6173], [6138, 6172, 6174], [6173, 6175], [6174, 6176, 6273], [6175, 6177], [6139, 6176, 6178], [6177, 6179], [6178, 6180, 6274], [6179, 6181], [6140, 6180, 6182], [6181, 6183], [6182, 6184, 6275], [6183, 6185], [6141, 6184, 6186], [6185, 6187], [6186, 6188, 6276], [6187, 6189], [6142, 6188, 6190], [6189, 6191], [6190, 6192, 6277], [6191, 6193], [6143, 6192, 6194], [6193, 6195], [6194, 6196, 6278], [6195, 6197], [6144, 6196, 6198], [6197, 6199], [6198, 6200, 6279], [6199, 6201], [6145, 6200, 6202], [6201, 6203], [6202, 6204, 6280], [6203, 6205], [6146, 6204, 6206], [6205, 6207], [6206, 6208, 6281], [6207, 6209], [6147, 6208, 6210], [6209, 6211], [6210, 6212, 6282], [6211, 6213], [6148, 6212, 6214], [6213, 6215], [6214, 6216, 6283], [6215, 6217], [6149, 6216, 6218], [6217, 6219], [6218, 6220, 6284], [6219, 6221], [6150, 6220, 6222], [6221, 6223], [6222, 6224, 6285], [6223, 6225], [6151, 6224, 6226], [6225, 6227], [6226, 6228, 6286], [6227, 6229], [6152, 6228, 6230], [6229, 6231], [6230, 6232, 6287], [6231, 6233], [6153, 6232, 6234], [6233, 6235], [6234, 6236, 6288], [6235, 6237], [6154, 6236, 6238], [6237, 6239], [6238, 6240, 6289], [6239, 6241], [6155, 6240, 6242], [6241, 6243], [6242, 6244, 6290], [6243, 6245], [6156, 6244, 6246], [6245, 6247], [6246, 6248, 6291], [6247, 6249], [6157, 6248, 6250], [6249, 6251], [6250, 6252, 6292], [6251, 6253], [6158, 6252, 6254], [6253, 6255], [6254, 6256, 6293], [6255, 6257], [6159, 6256, 6258], [6257, 6259], [6258, 6260, 6294], [6259, 6261], [6160, 6260, 6262], [6261, 6263], [6262, 6264, 6295], [6263, 6265], [6161, 6264, 6266], [6265, 6267], [6266, 6268, 6296], [6267, 6269], [6162, 6268], [6163, 6297], [6167, 6301], [6171, 6305], [6175, 6309], [6179, 6313], [6183, 6317], [6187, 6321], [6191, 6325], [6195, 6329], [6199, 6333], [6203, 6337], [6207, 6341], [6211, 6345], [6215, 6349], [6219, 6353], [6223, 6357], [6227, 6361], [6231, 6365], [6235, 6369], [6239, 6373], [6243, 6377], [6247, 6381], [6251, 6385], [6255, 6389], [6259, 6393], [6263, 6397], [6267, 6401], [6270, 6298], [6297, 6299], [6298, 6300, 6404], [6299, 6301], [6271, 6300, 6302], [6301, 6303], [6302, 6304, 6405], [6303, 6305], [6272, 6304, 6306], [6305, 6307], [6306, 6308, 6406], [6307, 6309], [6273, 6308, 6310], [6309, 6311], [6310, 6312, 6407], [6311, 6313], [6274, 6312, 6314], [6313, 6315], [6314, 6316, 6408], [6315, 6317], [6275, 6316, 6318], [6317, 6319], [6318, 6320, 6409], [6319, 6321], [6276, 6320, 6322], [6321, 6323], [6322, 6324, 6410], [6323, 6325], [6277, 6324, 6326], [6325, 6327], [6326, 6328, 6411], [6327, 6329], [6278, 6328, 6330], [6329, 6331], [6330, 6332, 6412], [6331, 6333], [6279, 6332, 6334], [6333, 6335], [6334, 6336, 6413], [6335, 6337], [6280, 6336, 6338], [6337, 6339], [6338, 6340, 6414], [6339, 6341], [6281, 6340, 6342], [6341, 6343], [6342, 6344, 6415], [6343, 6345], [6282, 6344, 6346], [6345, 6347], [6346, 6348, 6416], [6347, 6349], [6283, 6348, 6350], [6349, 6351], [6350, 6352, 6417], [6351, 6353], [6284, 6352, 6354], [6353, 6355], [6354, 6356, 6418], [6355, 6357], [6285, 6356, 6358], [6357, 6359], [6358, 6360, 6419], [6359, 6361], [6286, 6360, 6362], [6361, 6363], [6362, 6364, 6420], [6363, 6365], [6287, 6364, 6366], [6365, 6367], [6366, 6368, 6421], [6367, 6369], [6288, 6368, 6370], [6369, 6371], [6370, 6372, 6422], [6371, 6373], [6289, 6372, 6374], [6373, 6375], [6374, 6376, 6423], [6375, 6377], [6290, 6376, 6378], [6377, 6379], [6378, 6380, 6424], [6379, 6381], [6291, 6380, 6382], [6381, 6383], [6382, 6384, 6425], [6383, 6385], [6292, 6384, 6386], [6385, 6387], [6386, 6388, 6426], [6387, 6389], [6293, 6388, 6390], [6389, 6391], [6390, 6392, 6427], [6391, 6393], [6294, 6392, 6394], [6393, 6395], [6394, 6396, 6428], [6395, 6397], [6295, 6396, 6398], [6397, 6399], [6398, 6400, 6429], [6399, 6401], [6296, 6400, 6402], [6401, 6403], [6402, 6430], [6299, 6433], [6303, 6437], [6307, 6441], [6311, 6445], [6315, 6449], [6319, 6453], [6323, 6457], [6327, 6461], [6331, 6465], [6335, 6469], [6339, 6473], [6343, 6477], [6347, 6481], [6351, 6485], [6355, 6489], [6359, 6493], [6363, 6497], [6367, 6501], [6371, 6505], [6375, 6509], [6379, 6513], [6383, 6517], [6387, 6521], [6391, 6525], [6395, 6529], [6399, 6533], [6403, 6537], [6432, 6538], [6431, 6433], [6404, 6432, 6434], [6433, 6435], [6434, 6436, 6539], [6435, 6437], [6405, 6436, 6438], [6437, 6439], [6438, 6440, 6540], [6439, 6441], [6406, 6440, 6442], [6441, 6443], [6442, 6444, 6541], [6443, 6445], [6407, 6444, 6446], [6445, 6447], [6446, 6448, 6542], [6447, 6449], [6408, 6448, 6450], [6449, 6451], [6450, 6452, 6543], [6451, 6453], [6409, 6452, 6454], [6453, 6455], [6454, 6456, 6544], [6455, 6457], [6410, 6456, 6458], [6457, 6459], [6458, 6460, 6545], [6459, 6461], [6411, 6460, 6462], [6461, 6463], [6462, 6464, 6546], [6463, 6465], [6412, 6464, 6466], [6465, 6467], [6466, 6468, 6547], [6467, 6469], [6413, 6468, 6470], [6469, 6471], [6470, 6472, 6548], [6471, 6473], [6414, 6472, 6474], [6473, 6475], [6474, 6476, 6549], [6475, 6477], [6415, 6476, 6478], [6477, 6479], [6478, 6480, 6550], [6479, 6481], [6416, 6480, 6482], [6481, 6483], [6482, 6484, 6551], [6483, 6485], [6417, 6484, 6486], [6485, 6487], [6486, 6488, 6552], [6487, 6489], [6418, 6488, 6490], [6489, 6491], [6490, 6492, 6553], [6491, 6493], [6419, 6492, 6494], [6493, 6495], [6494, 6496, 6554], [6495, 6497], [6420, 6496, 6498], [6497, 6499], [6498, 6500, 6555], [6499, 6501], [6421, 6500, 6502], [6501, 6503], [6502, 6504, 6556], [6503, 6505], [6422, 6504, 6506], [6505, 6507], [6506, 6508, 6557], [6507, 6509], [6423, 6508, 6510], [6509, 6511], [6510, 6512, 6558], [6511, 6513], [6424, 6512, 6514], [6513, 6515], [6514, 6516, 6559], [6515, 6517], [6425, 6516, 6518], [6517, 6519], [6518, 6520, 6560], [6519, 6521], [6426, 6520, 6522], [6521, 6523], [6522, 6524, 6561], [6523, 6525], [6427, 6524, 6526], [6525, 6527], [6526, 6528, 6562], [6527, 6529], [6428, 6528, 6530], [6529, 6531], [6530, 6532, 6563], [6531, 6533], [6429, 6532, 6534], [6533, 6535], [6534, 6536, 6564], [6535, 6537], [6430, 6536], [6431, 6565], [6435, 6569], [6439, 6573], [6443, 6577], [6447, 6581], [6451, 6585], [6455, 6589], [6459, 6593], [6463, 6597], [6467, 6601], [6471, 6605], [6475, 6609], [6479, 6613], [6483, 6617], [6487, 6621], [6491, 6625], [6495, 6629], [6499, 6633], [6503, 6637], [6507, 6641], [6511, 6645], [6515, 6649], [6519, 6653], [6523, 6657], [6527, 6661], [6531, 6665], [6535, 6669], [6538, 6566], [6565, 6567], [6566, 6568, 6672], [6567, 6569], [6539, 6568, 6570], [6569, 6571], [6570, 6572, 6673], [6571, 6573], [6540, 6572, 6574], [6573, 6575], [6574, 6576, 6674], [6575, 6577], [6541, 6576, 6578], [6577, 6579], [6578, 6580, 6675], [6579, 6581], [6542, 6580, 6582], [6581, 6583], [6582, 6584, 6676], [6583, 6585], [6543, 6584, 6586], [6585, 6587], [6586, 6588, 6677], [6587, 6589], [6544, 6588, 6590], [6589, 6591], [6590, 6592, 6678], [6591, 6593], [6545, 6592, 6594], [6593, 6595], [6594, 6596, 6679], [6595, 6597], [6546, 6596, 6598], [6597, 6599], [6598, 6600, 6680], [6599, 6601], [6547, 6600, 6602], [6601, 6603], [6602, 6604, 6681], [6603, 6605], [6548, 6604, 6606], [6605, 6607], [6606, 6608, 6682], [6607, 6609], [6549, 6608, 6610], [6609, 6611], [6610, 6612, 6683], [6611, 6613], [6550, 6612, 6614], [6613, 6615], [6614, 6616, 6684], [6615, 6617], [6551, 6616, 6618], [6617, 6619], [6618, 6620, 6685], [6619, 6621], [6552, 6620, 6622], [6621, 6623], [6622, 6624, 6686], [6623, 6625], [6553, 6624, 6626], [6625, 6627], [6626, 6628, 6687], [6627, 6629], [6554, 6628, 6630], [6629, 6631], [6630, 6632, 6688], [6631, 6633], [6555, 6632, 6634], [6633, 6635], [6634, 6636, 6689], [6635, 6637], [6556, 6636, 6638], [6637, 6639], [6638, 6640, 6690], [6639, 6641], [6557, 6640, 6642], [6641, 6643], [6642, 6644, 6691], [6643, 6645], [6558, 6644, 6646], [6645, 6647], [6646, 6648, 6692], [6647, 6649], [6559, 6648, 6650], [6649, 6651], [6650, 6652, 6693], [6651, 6653], [6560, 6652, 6654], [6653, 6655], [6654, 6656, 6694], [6655, 6657], [6561, 6656, 6658], [6657, 6659], [6658, 6660, 6695], [6659, 6661], [6562, 6660, 6662], [6661, 6663], [6662, 6664, 6696], [6663, 6665], [6563, 6664, 6666], [6665, 6667], [6666, 6668, 6697], [6667, 6669], [6564, 6668, 6670], [6669, 6671], [6670, 6698], [6567, 6701], [6571, 6705], [6575, 6709], [6579, 6713], [6583, 6717], [6587, 6721], [6591, 6725], [6595, 6729], [6599, 6733], [6603, 6737], [6607, 6741], [6611, 6745], [6615, 6749], [6619, 6753], [6623, 6757], [6627, 6761], [6631, 6765], [6635, 6769], [6639, 6773], [6643, 6777], [6647, 6781], [6651, 6785], [6655, 6789], [6659, 6793], [6663, 6797], [6667, 6801], [6671, 6805], [6700, 6806], [6699, 6701], [6672, 6700, 6702], [6701, 6703], [6702, 6704, 6807], [6703, 6705], [6673, 6704, 6706], [6705, 6707], [6706, 6708, 6808], [6707, 6709], [6674, 6708, 6710], [6709, 6711], [6710, 6712, 6809], [6711, 6713], [6675, 6712, 6714], [6713, 6715], [6714, 6716, 6810], [6715, 6717], [6676, 6716, 6718], [6717, 6719], [6718, 6720, 6811], [6719, 6721], [6677, 6720, 6722], [6721, 6723], [6722, 6724, 6812], [6723, 6725], [6678, 6724, 6726], [6725, 6727], [6726, 6728, 6813], [6727, 6729], [6679, 6728, 6730], [6729, 6731], [6730, 6732, 6814], [6731, 6733], [6680, 6732, 6734], [6733, 6735], [6734, 6736, 6815], [6735, 6737], [6681, 6736, 6738], [6737, 6739], [6738, 6740, 6816], [6739, 6741], [6682, 6740, 6742], [6741, 6743], [6742, 6744, 6817], [6743, 6745], [6683, 6744, 6746], [6745, 6747], [6746, 6748, 6818], [6747, 6749], [6684, 6748, 6750], [6749, 6751], [6750, 6752, 6819], [6751, 6753], [6685, 6752, 6754], [6753, 6755], [6754, 6756, 6820], [6755, 6757], [6686, 6756, 6758], [6757, 6759], [6758, 6760, 6821], [6759, 6761], [6687, 6760, 6762], [6761, 6763], [6762, 6764, 6822], [6763, 6765], [6688, 6764, 6766], [6765, 6767], [6766, 6768, 6823], [6767, 6769], [6689, 6768, 6770], [6769, 6771], [6770, 6772, 6824], [6771, 6773], [6690, 6772, 6774], [6773, 6775], [6774, 6776, 6825], [6775, 6777], [6691, 6776, 6778], [6777, 6779], [6778, 6780, 6826], [6779, 6781], [6692, 6780, 6782], [6781, 6783], [6782, 6784, 6827], [6783, 6785], [6693, 6784, 6786], [6785, 6787], [6786, 6788, 6828], [6787, 6789], [6694, 6788, 6790], [6789, 6791], [6790, 6792, 6829], [6791, 6793], [6695, 6792, 6794], [6793, 6795], [6794, 6796, 6830], [6795, 6797], [6696, 6796, 6798], [6797, 6799], [6798, 6800, 6831], [6799, 6801], [6697, 6800, 6802], [6801, 6803], [6802, 6804, 6832], [6803, 6805], [6698, 6804], [6699, 6833], [6703, 6837], [6707, 6841], [6711, 6845], [6715, 6849], [6719, 6853], [6723, 6857], [6727, 6861], [6731, 6865], [6735, 6869], [6739, 6873], [6743, 6877], [6747, 6881], [6751, 6885], [6755, 6889], [6759, 6893], [6763, 6897], [6767, 6901], [6771, 6905], [6775, 6909], [6779, 6913], [6783, 6917], [6787, 6921], [6791, 6925], [6795, 6929], [6799, 6933], [6803, 6937], [6806, 6834], [6833, 6835], [6834, 6836, 6940], [6835, 6837], [6807, 6836, 6838], [6837, 6839], [6838, 6840, 6941], [6839, 6841], [6808, 6840, 6842], [6841, 6843], [6842, 6844, 6942], [6843, 6845], [6809, 6844, 6846], [6845, 6847], [6846, 6848, 6943], [6847, 6849], [6810, 6848, 6850], [6849, 6851], [6850, 6852, 6944], [6851, 6853], [6811, 6852, 6854], [6853, 6855], [6854, 6856, 6945], [6855, 6857], [6812, 6856, 6858], [6857, 6859], [6858, 6860, 6946], [6859, 6861], [6813, 6860, 6862], [6861, 6863], [6862, 6864, 6947], [6863, 6865], [6814, 6864, 6866], [6865, 6867], [6866, 6868, 6948], [6867, 6869], [6815, 6868, 6870], [6869, 6871], [6870, 6872, 6949], [6871, 6873], [6816, 6872, 6874], [6873, 6875], [6874, 6876, 6950], [6875, 6877], [6817, 6876, 6878], [6877, 6879], [6878, 6880, 6951], [6879, 6881], [6818, 6880, 6882], [6881, 6883], [6882, 6884, 6952], [6883, 6885], [6819, 6884, 6886], [6885, 6887], [6886, 6888, 6953], [6887, 6889], [6820, 6888, 6890], [6889, 6891], [6890, 6892, 6954], [6891, 6893], [6821, 6892, 6894], [6893, 6895], [6894, 6896, 6955], [6895, 6897], [6822, 6896, 6898], [6897, 6899], [6898, 6900, 6956], [6899, 6901], [6823, 6900, 6902], [6901, 6903], [6902, 6904, 6957], [6903, 6905], [6824, 6904, 6906], [6905, 6907], [6906, 6908, 6958], [6907, 6909], [6825, 6908, 6910], [6909, 6911], [6910, 6912, 6959], [6911, 6913], [6826, 6912, 6914], [6913, 6915], [6914, 6916, 6960], [6915, 6917], [6827, 6916, 6918], [6917, 6919], [6918, 6920, 6961], [6919, 6921], [6828, 6920, 6922], [6921, 6923], [6922, 6924, 6962], [6923, 6925], [6829, 6924, 6926], [6925, 6927], [6926, 6928, 6963], [6927, 6929], [6830, 6928, 6930], [6929, 6931], [6930, 6932, 6964], [6931, 6933], [6831, 6932, 6934], [6933, 6935], [6934, 6936, 6965], [6935, 6937], [6832, 6936, 6938], [6937, 6939], [6938, 6966], [6835, 6968], [6839, 6972], [6843, 6976], [6847, 6980], [6851, 6984], [6855, 6988], [6859, 6992], [6863, 6996], [6867, 7000], [6871, 7004], [6875, 7008], [6879, 7012], [6883, 7016], [6887, 7020], [6891, 7024], [6895, 7028], [6899, 7032], [6903, 7036], [6907, 7040], [6911, 7044], [6915, 7048], [6919, 7052], [6923, 7056], [6927, 7060], [6931, 7064], [6935, 7068], [6939, 7072], [6968], [6940, 6967, 6969], [6968, 6970], [6969, 6971], [6970, 6972], [6941, 6971, 6973], [6972, 6974], [6973, 6975], [6974, 6976], [6942, 6975, 6977], [6976, 6978], [6977, 6979], [6978, 6980], [6943, 6979, 6981], [6980, 6982], [6981, 6983], [6982, 6984], [6944, 6983, 6985], [6984, 6986], [6985, 6987], [6986, 6988], [6945, 6987, 6989], [6988, 6990], [6989, 6991], [6990, 6992], [6946, 6991, 6993], [6992, 6994], [6993, 6995], [6994, 6996], [6947, 6995, 6997], [6996, 6998], [6997, 6999], [6998, 7000], [6948, 6999, 7001], [7000, 7002], [7001, 7003], [7002, 7004], [6949, 7003, 7005], [7004, 7006], [7005, 7007], [7006, 7008], [6950, 7007, 7009], [7008, 7010], [7009, 7011], [7010, 7012], [6951, 7011, 7013], [7012, 7014], [7013, 7015], [7014, 7016], [6952, 7015, 7017], [7016, 7018], [7017, 7019], [7018, 7020], [6953, 7019, 7021], [7020, 7022], [7021, 7023], [7022, 7024], [6954, 7023, 7025], [7024, 7026], [7025, 7027], [7026, 7028], [6955, 7027, 7029], [7028, 7030], [7029, 7031], [7030, 7032], [6956, 7031, 7033], [7032, 7034], [7033, 7035], [7034, 7036], [6957, 7035, 7037], [7036, 7038], [7037, 7039], [7038, 7040], [6958, 7039, 7041], [7040, 7042], [7041, 7043], [7042, 7044], [6959, 7043, 7045], [7044, 7046], [7045, 7047], [7046, 7048], [6960, 7047, 7049], [7048, 7050], [7049, 7051], [7050, 7052], [6961, 7051, 7053], [7052, 7054], [7053, 7055], [7054, 7056], [6962, 7055, 7057], [7056, 7058], [7057, 7059], [7058, 7060], [6963, 7059, 7061], [7060, 7062], [7061, 7063], [7062, 7064], [6964, 7063, 7065], [7064, 7066], [7065, 7067], [7066, 7068], [6965, 7067, 7069], [7068, 7070], [7069, 7071], [7070, 7072], [6966, 7071]] -CNOTTIME: [[1, 106], [0, 2], [1, 3], [2, 4], [3, 5, 107], [4, 6], [5, 7], [6, 8], [7, 9, 108], [8, 10], [9, 11], [10, 12], [11, 13, 109], [12, 14], [13, 15], [14, 16], [15, 17, 110], [16, 18], [17, 19], [18, 20], [19, 21, 111], [20, 22], [21, 23], [22, 24], [23, 25, 112], [24, 26], [25, 27], [26, 28], [27, 29, 113], [28, 30], [29, 31], [30, 32], [31, 33, 114], [32, 34], [33, 35], [34, 36], [35, 37, 115], [36, 38], [37, 39], [38, 40], [39, 41, 116], [40, 42], [41, 43], [42, 44], [43, 45, 117], [44, 46], [45, 47], [46, 48], [47, 49, 118], [48, 50], [49, 51], [50, 52], [51, 53, 119], [52, 54], [53, 55], [54, 56], [55, 57, 120], [56, 58], [57, 59], [58, 60], [59, 61, 121], [60, 62], [61, 63], [62, 64], [63, 65, 122], [64, 66], [65, 67], [66, 68], [67, 69, 123], [68, 70], [69, 71], [70, 72], [71, 73, 124], [72, 74], [73, 75], [74, 76], [75, 77, 125], [76, 78], [77, 79], [78, 80], [79, 81, 126], [80, 82], [81, 83], [82, 84], [83, 85, 127], [84, 86], [85, 87], [86, 88], [87, 89, 128], [88, 90], [89, 91], [90, 92], [91, 93, 129], [92, 94], [93, 95], [94, 96], [95, 97, 130], [96, 98], [97, 99], [98, 100], [99, 101, 131], [100, 102], [101, 103], [102, 104], [103, 105, 132], [104], [0, 133], [4, 137], [8, 141], [12, 145], [16, 149], [20, 153], [24, 157], [28, 161], [32, 165], [36, 169], [40, 173], [44, 177], [48, 181], [52, 185], [56, 189], [60, 193], [64, 197], [68, 201], [72, 205], [76, 209], [80, 213], [84, 217], [88, 221], [92, 225], [96, 229], [100, 233], [104, 237], [106, 134], [133, 135], [134, 136, 240], [135, 137], [107, 136, 138], [137, 139], [138, 140, 241], [139, 141], [108, 140, 142], [141, 143], [142, 144, 242], [143, 145], [109, 144, 146], [145, 147], [146, 148, 243], [147, 149], [110, 148, 150], [149, 151], [150, 152, 244], [151, 153], [111, 152, 154], [153, 155], [154, 156, 245], [155, 157], [112, 156, 158], [157, 159], [158, 160, 246], [159, 161], [113, 160, 162], [161, 163], [162, 164, 247], [163, 165], [114, 164, 166], [165, 167], [166, 168, 248], [167, 169], [115, 168, 170], [169, 171], [170, 172, 249], [171, 173], [116, 172, 174], [173, 175], [174, 176, 250], [175, 177], [117, 176, 178], [177, 179], [178, 180, 251], [179, 181], [118, 180, 182], [181, 183], [182, 184, 252], [183, 185], [119, 184, 186], [185, 187], [186, 188, 253], [187, 189], [120, 188, 190], [189, 191], [190, 192, 254], [191, 193], [121, 192, 194], [193, 195], [194, 196, 255], [195, 197], [122, 196, 198], [197, 199], [198, 200, 256], [199, 201], [123, 200, 202], [201, 203], [202, 204, 257], [203, 205], [124, 204, 206], [205, 207], [206, 208, 258], [207, 209], [125, 208, 210], [209, 211], [210, 212, 259], [211, 213], [126, 212, 214], [213, 215], [214, 216, 260], [215, 217], [127, 216, 218], [217, 219], [218, 220, 261], [219, 221], [128, 220, 222], [221, 223], [222, 224, 262], [223, 225], [129, 224, 226], [225, 227], [226, 228, 263], [227, 229], [130, 228, 230], [229, 231], [230, 232, 264], [231, 233], [131, 232, 234], [233, 235], [234, 236, 265], [235, 237], [132, 236, 238], [237, 239], [238, 266], [135, 269], [139, 273], [143, 277], [147, 281], [151, 285], [155, 289], [159, 293], [163, 297], [167, 301], [171, 305], [175, 309], [179, 313], [183, 317], [187, 321], [191, 325], [195, 329], [199, 333], [203, 337], [207, 341], [211, 345], [215, 349], [219, 353], [223, 357], [227, 361], [231, 365], [235, 369], [239, 373], [268, 374], [267, 269], [240, 268, 270], [269, 271], [270, 272, 375], [271, 273], [241, 272, 274], [273, 275], [274, 276, 376], [275, 277], [242, 276, 278], [277, 279], [278, 280, 377], [279, 281], [243, 280, 282], [281, 283], [282, 284, 378], [283, 285], [244, 284, 286], [285, 287], [286, 288, 379], [287, 289], [245, 288, 290], [289, 291], [290, 292, 380], [291, 293], [246, 292, 294], [293, 295], [294, 296, 381], [295, 297], [247, 296, 298], [297, 299], [298, 300, 382], [299, 301], [248, 300, 302], [301, 303], [302, 304, 383], [303, 305], [249, 304, 306], [305, 307], [306, 308, 384], [307, 309], [250, 308, 310], [309, 311], [310, 312, 385], [311, 313], [251, 312, 314], [313, 315], [314, 316, 386], [315, 317], [252, 316, 318], [317, 319], [318, 320, 387], [319, 321], [253, 320, 322], [321, 323], [322, 324, 388], [323, 325], [254, 324, 326], [325, 327], [326, 328, 389], [327, 329], [255, 328, 330], [329, 331], [330, 332, 390], [331, 333], [256, 332, 334], [333, 335], [334, 336, 391], [335, 337], [257, 336, 338], [337, 339], [338, 340, 392], [339, 341], [258, 340, 342], [341, 343], [342, 344, 393], [343, 345], [259, 344, 346], [345, 347], [346, 348, 394], [347, 349], [260, 348, 350], [349, 351], [350, 352, 395], [351, 353], [261, 352, 354], [353, 355], [354, 356, 396], [355, 357], [262, 356, 358], [357, 359], [358, 360, 397], [359, 361], [263, 360, 362], [361, 363], [362, 364, 398], [363, 365], [264, 364, 366], [365, 367], [366, 368, 399], [367, 369], [265, 368, 370], [369, 371], [370, 372, 400], [371, 373], [266, 372], [267, 401], [271, 405], [275, 409], [279, 413], [283, 417], [287, 421], [291, 425], [295, 429], [299, 433], [303, 437], [307, 441], [311, 445], [315, 449], [319, 453], [323, 457], [327, 461], [331, 465], [335, 469], [339, 473], [343, 477], [347, 481], [351, 485], [355, 489], [359, 493], [363, 497], [367, 501], [371, 505], [374, 402], [401, 403], [402, 404, 508], [403, 405], [375, 404, 406], [405, 407], [406, 408, 509], [407, 409], [376, 408, 410], [409, 411], [410, 412, 510], [411, 413], [377, 412, 414], [413, 415], [414, 416, 511], [415, 417], [378, 416, 418], [417, 419], [418, 420, 512], [419, 421], [379, 420, 422], [421, 423], [422, 424, 513], [423, 425], [380, 424, 426], [425, 427], [426, 428, 514], [427, 429], [381, 428, 430], [429, 431], [430, 432, 515], [431, 433], [382, 432, 434], [433, 435], [434, 436, 516], [435, 437], [383, 436, 438], [437, 439], [438, 440, 517], [439, 441], [384, 440, 442], [441, 443], [442, 444, 518], [443, 445], [385, 444, 446], [445, 447], [446, 448, 519], [447, 449], [386, 448, 450], [449, 451], [450, 452, 520], [451, 453], [387, 452, 454], [453, 455], [454, 456, 521], [455, 457], [388, 456, 458], [457, 459], [458, 460, 522], [459, 461], [389, 460, 462], [461, 463], [462, 464, 523], [463, 465], [390, 464, 466], [465, 467], [466, 468, 524], [467, 469], [391, 468, 470], [469, 471], [470, 472, 525], [471, 473], [392, 472, 474], [473, 475], [474, 476, 526], [475, 477], [393, 476, 478], [477, 479], [478, 480, 527], [479, 481], [394, 480, 482], [481, 483], [482, 484, 528], [483, 485], [395, 484, 486], [485, 487], [486, 488, 529], [487, 489], [396, 488, 490], [489, 491], [490, 492, 530], [491, 493], [397, 492, 494], [493, 495], [494, 496, 531], [495, 497], [398, 496, 498], [497, 499], [498, 500, 532], [499, 501], [399, 500, 502], [501, 503], [502, 504, 533], [503, 505], [400, 504, 506], [505, 507], [506, 534], [403, 537], [407, 541], [411, 545], [415, 549], [419, 553], [423, 557], [427, 561], [431, 565], [435, 569], [439, 573], [443, 577], [447, 581], [451, 585], [455, 589], [459, 593], [463, 597], [467, 601], [471, 605], [475, 609], [479, 613], [483, 617], [487, 621], [491, 625], [495, 629], [499, 633], [503, 637], [507, 641], [536, 642], [535, 537], [508, 536, 538], [537, 539], [538, 540, 643], [539, 541], [509, 540, 542], [541, 543], [542, 544, 644], [543, 545], [510, 544, 546], [545, 547], [546, 548, 645], [547, 549], [511, 548, 550], [549, 551], [550, 552, 646], [551, 553], [512, 552, 554], [553, 555], [554, 556, 647], [555, 557], [513, 556, 558], [557, 559], [558, 560, 648], [559, 561], [514, 560, 562], [561, 563], [562, 564, 649], [563, 565], [515, 564, 566], [565, 567], [566, 568, 650], [567, 569], [516, 568, 570], [569, 571], [570, 572, 651], [571, 573], [517, 572, 574], [573, 575], [574, 576, 652], [575, 577], [518, 576, 578], [577, 579], [578, 580, 653], [579, 581], [519, 580, 582], [581, 583], [582, 584, 654], [583, 585], [520, 584, 586], [585, 587], [586, 588, 655], [587, 589], [521, 588, 590], [589, 591], [590, 592, 656], [591, 593], [522, 592, 594], [593, 595], [594, 596, 657], [595, 597], [523, 596, 598], [597, 599], [598, 600, 658], [599, 601], [524, 600, 602], [601, 603], [602, 604, 659], [603, 605], [525, 604, 606], [605, 607], [606, 608, 660], [607, 609], [526, 608, 610], [609, 611], [610, 612, 661], [611, 613], [527, 612, 614], [613, 615], [614, 616, 662], [615, 617], [528, 616, 618], [617, 619], [618, 620, 663], [619, 621], [529, 620, 622], [621, 623], [622, 624, 664], [623, 625], [530, 624, 626], [625, 627], [626, 628, 665], [627, 629], [531, 628, 630], [629, 631], [630, 632, 666], [631, 633], [532, 632, 634], [633, 635], [634, 636, 667], [635, 637], [533, 636, 638], [637, 639], [638, 640, 668], [639, 641], [534, 640], [535, 669], [539, 673], [543, 677], [547, 681], [551, 685], [555, 689], [559, 693], [563, 697], [567, 701], [571, 705], [575, 709], [579, 713], [583, 717], [587, 721], [591, 725], [595, 729], [599, 733], [603, 737], [607, 741], [611, 745], [615, 749], [619, 753], [623, 757], [627, 761], [631, 765], [635, 769], [639, 773], [642, 670], [669, 671], [670, 672, 776], [671, 673], [643, 672, 674], [673, 675], [674, 676, 777], [675, 677], [644, 676, 678], [677, 679], [678, 680, 778], [679, 681], [645, 680, 682], [681, 683], [682, 684, 779], [683, 685], [646, 684, 686], [685, 687], [686, 688, 780], [687, 689], [647, 688, 690], [689, 691], [690, 692, 781], [691, 693], [648, 692, 694], [693, 695], [694, 696, 782], [695, 697], [649, 696, 698], [697, 699], [698, 700, 783], [699, 701], [650, 700, 702], [701, 703], [702, 704, 784], [703, 705], [651, 704, 706], [705, 707], [706, 708, 785], [707, 709], [652, 708, 710], [709, 711], [710, 712, 786], [711, 713], [653, 712, 714], [713, 715], [714, 716, 787], [715, 717], [654, 716, 718], [717, 719], [718, 720, 788], [719, 721], [655, 720, 722], [721, 723], [722, 724, 789], [723, 725], [656, 724, 726], [725, 727], [726, 728, 790], [727, 729], [657, 728, 730], [729, 731], [730, 732, 791], [731, 733], [658, 732, 734], [733, 735], [734, 736, 792], [735, 737], [659, 736, 738], [737, 739], [738, 740, 793], [739, 741], [660, 740, 742], [741, 743], [742, 744, 794], [743, 745], [661, 744, 746], [745, 747], [746, 748, 795], [747, 749], [662, 748, 750], [749, 751], [750, 752, 796], [751, 753], [663, 752, 754], [753, 755], [754, 756, 797], [755, 757], [664, 756, 758], [757, 759], [758, 760, 798], [759, 761], [665, 760, 762], [761, 763], [762, 764, 799], [763, 765], [666, 764, 766], [765, 767], [766, 768, 800], [767, 769], [667, 768, 770], [769, 771], [770, 772, 801], [771, 773], [668, 772, 774], [773, 775], [774, 802], [671, 805], [675, 809], [679, 813], [683, 817], [687, 821], [691, 825], [695, 829], [699, 833], [703, 837], [707, 841], [711, 845], [715, 849], [719, 853], [723, 857], [727, 861], [731, 865], [735, 869], [739, 873], [743, 877], [747, 881], [751, 885], [755, 889], [759, 893], [763, 897], [767, 901], [771, 905], [775, 909], [804, 910], [803, 805], [776, 804, 806], [805, 807], [806, 808, 911], [807, 809], [777, 808, 810], [809, 811], [810, 812, 912], [811, 813], [778, 812, 814], [813, 815], [814, 816, 913], [815, 817], [779, 816, 818], [817, 819], [818, 820, 914], [819, 821], [780, 820, 822], [821, 823], [822, 824, 915], [823, 825], [781, 824, 826], [825, 827], [826, 828, 916], [827, 829], [782, 828, 830], [829, 831], [830, 832, 917], [831, 833], [783, 832, 834], [833, 835], [834, 836, 918], [835, 837], [784, 836, 838], [837, 839], [838, 840, 919], [839, 841], [785, 840, 842], [841, 843], [842, 844, 920], [843, 845], [786, 844, 846], [845, 847], [846, 848, 921], [847, 849], [787, 848, 850], [849, 851], [850, 852, 922], [851, 853], [788, 852, 854], [853, 855], [854, 856, 923], [855, 857], [789, 856, 858], [857, 859], [858, 860, 924], [859, 861], [790, 860, 862], [861, 863], [862, 864, 925], [863, 865], [791, 864, 866], [865, 867], [866, 868, 926], [867, 869], [792, 868, 870], [869, 871], [870, 872, 927], [871, 873], [793, 872, 874], [873, 875], [874, 876, 928], [875, 877], [794, 876, 878], [877, 879], [878, 880, 929], [879, 881], [795, 880, 882], [881, 883], [882, 884, 930], [883, 885], [796, 884, 886], [885, 887], [886, 888, 931], [887, 889], [797, 888, 890], [889, 891], [890, 892, 932], [891, 893], [798, 892, 894], [893, 895], [894, 896, 933], [895, 897], [799, 896, 898], [897, 899], [898, 900, 934], [899, 901], [800, 900, 902], [901, 903], [902, 904, 935], [903, 905], [801, 904, 906], [905, 907], [906, 908, 936], [907, 909], [802, 908], [803, 937], [807, 941], [811, 945], [815, 949], [819, 953], [823, 957], [827, 961], [831, 965], [835, 969], [839, 973], [843, 977], [847, 981], [851, 985], [855, 989], [859, 993], [863, 997], [867, 1001], [871, 1005], [875, 1009], [879, 1013], [883, 1017], [887, 1021], [891, 1025], [895, 1029], [899, 1033], [903, 1037], [907, 1041], [910, 938], [937, 939], [938, 940, 1044], [939, 941], [911, 940, 942], [941, 943], [942, 944, 1045], [943, 945], [912, 944, 946], [945, 947], [946, 948, 1046], [947, 949], [913, 948, 950], [949, 951], [950, 952, 1047], [951, 953], [914, 952, 954], [953, 955], [954, 956, 1048], [955, 957], [915, 956, 958], [957, 959], [958, 960, 1049], [959, 961], [916, 960, 962], [961, 963], [962, 964, 1050], [963, 965], [917, 964, 966], [965, 967], [966, 968, 1051], [967, 969], [918, 968, 970], [969, 971], [970, 972, 1052], [971, 973], [919, 972, 974], [973, 975], [974, 976, 1053], [975, 977], [920, 976, 978], [977, 979], [978, 980, 1054], [979, 981], [921, 980, 982], [981, 983], [982, 984, 1055], [983, 985], [922, 984, 986], [985, 987], [986, 988, 1056], [987, 989], [923, 988, 990], [989, 991], [990, 992, 1057], [991, 993], [924, 992, 994], [993, 995], [994, 996, 1058], [995, 997], [925, 996, 998], [997, 999], [998, 1000, 1059], [999, 1001], [926, 1000, 1002], [1001, 1003], [1002, 1004, 1060], [1003, 1005], [927, 1004, 1006], [1005, 1007], [1006, 1008, 1061], [1007, 1009], [928, 1008, 1010], [1009, 1011], [1010, 1012, 1062], [1011, 1013], [929, 1012, 1014], [1013, 1015], [1014, 1016, 1063], [1015, 1017], [930, 1016, 1018], [1017, 1019], [1018, 1020, 1064], [1019, 1021], [931, 1020, 1022], [1021, 1023], [1022, 1024, 1065], [1023, 1025], [932, 1024, 1026], [1025, 1027], [1026, 1028, 1066], [1027, 1029], [933, 1028, 1030], [1029, 1031], [1030, 1032, 1067], [1031, 1033], [934, 1032, 1034], [1033, 1035], [1034, 1036, 1068], [1035, 1037], [935, 1036, 1038], [1037, 1039], [1038, 1040, 1069], [1039, 1041], [936, 1040, 1042], [1041, 1043], [1042, 1070], [939, 1073], [943, 1077], [947, 1081], [951, 1085], [955, 1089], [959, 1093], [963, 1097], [967, 1101], [971, 1105], [975, 1109], [979, 1113], [983, 1117], [987, 1121], [991, 1125], [995, 1129], [999, 1133], [1003, 1137], [1007, 1141], [1011, 1145], [1015, 1149], [1019, 1153], [1023, 1157], [1027, 1161], [1031, 1165], [1035, 1169], [1039, 1173], [1043, 1177], [1072, 1178], [1071, 1073], [1044, 1072, 1074], [1073, 1075], [1074, 1076, 1179], [1075, 1077], [1045, 1076, 1078], [1077, 1079], [1078, 1080, 1180], [1079, 1081], [1046, 1080, 1082], [1081, 1083], [1082, 1084, 1181], [1083, 1085], [1047, 1084, 1086], [1085, 1087], [1086, 1088, 1182], [1087, 1089], [1048, 1088, 1090], [1089, 1091], [1090, 1092, 1183], [1091, 1093], [1049, 1092, 1094], [1093, 1095], [1094, 1096, 1184], [1095, 1097], [1050, 1096, 1098], [1097, 1099], [1098, 1100, 1185], [1099, 1101], [1051, 1100, 1102], [1101, 1103], [1102, 1104, 1186], [1103, 1105], [1052, 1104, 1106], [1105, 1107], [1106, 1108, 1187], [1107, 1109], [1053, 1108, 1110], [1109, 1111], [1110, 1112, 1188], [1111, 1113], [1054, 1112, 1114], [1113, 1115], [1114, 1116, 1189], [1115, 1117], [1055, 1116, 1118], [1117, 1119], [1118, 1120, 1190], [1119, 1121], [1056, 1120, 1122], [1121, 1123], [1122, 1124, 1191], [1123, 1125], [1057, 1124, 1126], [1125, 1127], [1126, 1128, 1192], [1127, 1129], [1058, 1128, 1130], [1129, 1131], [1130, 1132, 1193], [1131, 1133], [1059, 1132, 1134], [1133, 1135], [1134, 1136, 1194], [1135, 1137], [1060, 1136, 1138], [1137, 1139], [1138, 1140, 1195], [1139, 1141], [1061, 1140, 1142], [1141, 1143], [1142, 1144, 1196], [1143, 1145], [1062, 1144, 1146], [1145, 1147], [1146, 1148, 1197], [1147, 1149], [1063, 1148, 1150], [1149, 1151], [1150, 1152, 1198], [1151, 1153], [1064, 1152, 1154], [1153, 1155], [1154, 1156, 1199], [1155, 1157], [1065, 1156, 1158], [1157, 1159], [1158, 1160, 1200], [1159, 1161], [1066, 1160, 1162], [1161, 1163], [1162, 1164, 1201], [1163, 1165], [1067, 1164, 1166], [1165, 1167], [1166, 1168, 1202], [1167, 1169], [1068, 1168, 1170], [1169, 1171], [1170, 1172, 1203], [1171, 1173], [1069, 1172, 1174], [1173, 1175], [1174, 1176, 1204], [1175, 1177], [1070, 1176], [1071, 1205], [1075, 1209], [1079, 1213], [1083, 1217], [1087, 1221], [1091, 1225], [1095, 1229], [1099, 1233], [1103, 1237], [1107, 1241], [1111, 1245], [1115, 1249], [1119, 1253], [1123, 1257], [1127, 1261], [1131, 1265], [1135, 1269], [1139, 1273], [1143, 1277], [1147, 1281], [1151, 1285], [1155, 1289], [1159, 1293], [1163, 1297], [1167, 1301], [1171, 1305], [1175, 1309], [1178, 1206], [1205, 1207], [1206, 1208, 1312], [1207, 1209], [1179, 1208, 1210], [1209, 1211], [1210, 1212, 1313], [1211, 1213], [1180, 1212, 1214], [1213, 1215], [1214, 1216, 1314], [1215, 1217], [1181, 1216, 1218], [1217, 1219], [1218, 1220, 1315], [1219, 1221], [1182, 1220, 1222], [1221, 1223], [1222, 1224, 1316], [1223, 1225], [1183, 1224, 1226], [1225, 1227], [1226, 1228, 1317], [1227, 1229], [1184, 1228, 1230], [1229, 1231], [1230, 1232, 1318], [1231, 1233], [1185, 1232, 1234], [1233, 1235], [1234, 1236, 1319], [1235, 1237], [1186, 1236, 1238], [1237, 1239], [1238, 1240, 1320], [1239, 1241], [1187, 1240, 1242], [1241, 1243], [1242, 1244, 1321], [1243, 1245], [1188, 1244, 1246], [1245, 1247], [1246, 1248, 1322], [1247, 1249], [1189, 1248, 1250], [1249, 1251], [1250, 1252, 1323], [1251, 1253], [1190, 1252, 1254], [1253, 1255], [1254, 1256, 1324], [1255, 1257], [1191, 1256, 1258], [1257, 1259], [1258, 1260, 1325], [1259, 1261], [1192, 1260, 1262], [1261, 1263], [1262, 1264, 1326], [1263, 1265], [1193, 1264, 1266], [1265, 1267], [1266, 1268, 1327], [1267, 1269], [1194, 1268, 1270], [1269, 1271], [1270, 1272, 1328], [1271, 1273], [1195, 1272, 1274], [1273, 1275], [1274, 1276, 1329], [1275, 1277], [1196, 1276, 1278], [1277, 1279], [1278, 1280, 1330], [1279, 1281], [1197, 1280, 1282], [1281, 1283], [1282, 1284, 1331], [1283, 1285], [1198, 1284, 1286], [1285, 1287], [1286, 1288, 1332], [1287, 1289], [1199, 1288, 1290], [1289, 1291], [1290, 1292, 1333], [1291, 1293], [1200, 1292, 1294], [1293, 1295], [1294, 1296, 1334], [1295, 1297], [1201, 1296, 1298], [1297, 1299], [1298, 1300, 1335], [1299, 1301], [1202, 1300, 1302], [1301, 1303], [1302, 1304, 1336], [1303, 1305], [1203, 1304, 1306], [1305, 1307], [1306, 1308, 1337], [1307, 1309], [1204, 1308, 1310], [1309, 1311], [1310, 1338], [1207, 1341], [1211, 1345], [1215, 1349], [1219, 1353], [1223, 1357], [1227, 1361], [1231, 1365], [1235, 1369], [1239, 1373], [1243, 1377], [1247, 1381], [1251, 1385], [1255, 1389], [1259, 1393], [1263, 1397], [1267, 1401], [1271, 1405], [1275, 1409], [1279, 1413], [1283, 1417], [1287, 1421], [1291, 1425], [1295, 1429], [1299, 1433], [1303, 1437], [1307, 1441], [1311, 1445], [1340, 1446], [1339, 1341], [1312, 1340, 1342], [1341, 1343], [1342, 1344, 1447], [1343, 1345], [1313, 1344, 1346], [1345, 1347], [1346, 1348, 1448], [1347, 1349], [1314, 1348, 1350], [1349, 1351], [1350, 1352, 1449], [1351, 1353], [1315, 1352, 1354], [1353, 1355], [1354, 1356, 1450], [1355, 1357], [1316, 1356, 1358], [1357, 1359], [1358, 1360, 1451], [1359, 1361], [1317, 1360, 1362], [1361, 1363], [1362, 1364, 1452], [1363, 1365], [1318, 1364, 1366], [1365, 1367], [1366, 1368, 1453], [1367, 1369], [1319, 1368, 1370], [1369, 1371], [1370, 1372, 1454], [1371, 1373], [1320, 1372, 1374], [1373, 1375], [1374, 1376, 1455], [1375, 1377], [1321, 1376, 1378], [1377, 1379], [1378, 1380, 1456], [1379, 1381], [1322, 1380, 1382], [1381, 1383], [1382, 1384, 1457], [1383, 1385], [1323, 1384, 1386], [1385, 1387], [1386, 1388, 1458], [1387, 1389], [1324, 1388, 1390], [1389, 1391], [1390, 1392, 1459], [1391, 1393], [1325, 1392, 1394], [1393, 1395], [1394, 1396, 1460], [1395, 1397], [1326, 1396, 1398], [1397, 1399], [1398, 1400, 1461], [1399, 1401], [1327, 1400, 1402], [1401, 1403], [1402, 1404, 1462], [1403, 1405], [1328, 1404, 1406], [1405, 1407], [1406, 1408, 1463], [1407, 1409], [1329, 1408, 1410], [1409, 1411], [1410, 1412, 1464], [1411, 1413], [1330, 1412, 1414], [1413, 1415], [1414, 1416, 1465], [1415, 1417], [1331, 1416, 1418], [1417, 1419], [1418, 1420, 1466], [1419, 1421], [1332, 1420, 1422], [1421, 1423], [1422, 1424, 1467], [1423, 1425], [1333, 1424, 1426], [1425, 1427], [1426, 1428, 1468], [1427, 1429], [1334, 1428, 1430], [1429, 1431], [1430, 1432, 1469], [1431, 1433], [1335, 1432, 1434], [1433, 1435], [1434, 1436, 1470], [1435, 1437], [1336, 1436, 1438], [1437, 1439], [1438, 1440, 1471], [1439, 1441], [1337, 1440, 1442], [1441, 1443], [1442, 1444, 1472], [1443, 1445], [1338, 1444], [1339, 1473], [1343, 1477], [1347, 1481], [1351, 1485], [1355, 1489], [1359, 1493], [1363, 1497], [1367, 1501], [1371, 1505], [1375, 1509], [1379, 1513], [1383, 1517], [1387, 1521], [1391, 1525], [1395, 1529], [1399, 1533], [1403, 1537], [1407, 1541], [1411, 1545], [1415, 1549], [1419, 1553], [1423, 1557], [1427, 1561], [1431, 1565], [1435, 1569], [1439, 1573], [1443, 1577], [1446, 1474], [1473, 1475], [1474, 1476, 1580], [1475, 1477], [1447, 1476, 1478], [1477, 1479], [1478, 1480, 1581], [1479, 1481], [1448, 1480, 1482], [1481, 1483], [1482, 1484, 1582], [1483, 1485], [1449, 1484, 1486], [1485, 1487], [1486, 1488, 1583], [1487, 1489], [1450, 1488, 1490], [1489, 1491], [1490, 1492, 1584], [1491, 1493], [1451, 1492, 1494], [1493, 1495], [1494, 1496, 1585], [1495, 1497], [1452, 1496, 1498], [1497, 1499], [1498, 1500, 1586], [1499, 1501], [1453, 1500, 1502], [1501, 1503], [1502, 1504, 1587], [1503, 1505], [1454, 1504, 1506], [1505, 1507], [1506, 1508, 1588], [1507, 1509], [1455, 1508, 1510], [1509, 1511], [1510, 1512, 1589], [1511, 1513], [1456, 1512, 1514], [1513, 1515], [1514, 1516, 1590], [1515, 1517], [1457, 1516, 1518], [1517, 1519], [1518, 1520, 1591], [1519, 1521], [1458, 1520, 1522], [1521, 1523], [1522, 1524, 1592], [1523, 1525], [1459, 1524, 1526], [1525, 1527], [1526, 1528, 1593], [1527, 1529], [1460, 1528, 1530], [1529, 1531], [1530, 1532, 1594], [1531, 1533], [1461, 1532, 1534], [1533, 1535], [1534, 1536, 1595], [1535, 1537], [1462, 1536, 1538], [1537, 1539], [1538, 1540, 1596], [1539, 1541], [1463, 1540, 1542], [1541, 1543], [1542, 1544, 1597], [1543, 1545], [1464, 1544, 1546], [1545, 1547], [1546, 1548, 1598], [1547, 1549], [1465, 1548, 1550], [1549, 1551], [1550, 1552, 1599], [1551, 1553], [1466, 1552, 1554], [1553, 1555], [1554, 1556, 1600], [1555, 1557], [1467, 1556, 1558], [1557, 1559], [1558, 1560, 1601], [1559, 1561], [1468, 1560, 1562], [1561, 1563], [1562, 1564, 1602], [1563, 1565], [1469, 1564, 1566], [1565, 1567], [1566, 1568, 1603], [1567, 1569], [1470, 1568, 1570], [1569, 1571], [1570, 1572, 1604], [1571, 1573], [1471, 1572, 1574], [1573, 1575], [1574, 1576, 1605], [1575, 1577], [1472, 1576, 1578], [1577, 1579], [1578, 1606], [1475, 1609], [1479, 1613], [1483, 1617], [1487, 1621], [1491, 1625], [1495, 1629], [1499, 1633], [1503, 1637], [1507, 1641], [1511, 1645], [1515, 1649], [1519, 1653], [1523, 1657], [1527, 1661], [1531, 1665], [1535, 1669], [1539, 1673], [1543, 1677], [1547, 1681], [1551, 1685], [1555, 1689], [1559, 1693], [1563, 1697], [1567, 1701], [1571, 1705], [1575, 1709], [1579, 1713], [1608, 1714], [1607, 1609], [1580, 1608, 1610], [1609, 1611], [1610, 1612, 1715], [1611, 1613], [1581, 1612, 1614], [1613, 1615], [1614, 1616, 1716], [1615, 1617], [1582, 1616, 1618], [1617, 1619], [1618, 1620, 1717], [1619, 1621], [1583, 1620, 1622], [1621, 1623], [1622, 1624, 1718], [1623, 1625], [1584, 1624, 1626], [1625, 1627], [1626, 1628, 1719], [1627, 1629], [1585, 1628, 1630], [1629, 1631], [1630, 1632, 1720], [1631, 1633], [1586, 1632, 1634], [1633, 1635], [1634, 1636, 1721], [1635, 1637], [1587, 1636, 1638], [1637, 1639], [1638, 1640, 1722], [1639, 1641], [1588, 1640, 1642], [1641, 1643], [1642, 1644, 1723], [1643, 1645], [1589, 1644, 1646], [1645, 1647], [1646, 1648, 1724], [1647, 1649], [1590, 1648, 1650], [1649, 1651], [1650, 1652, 1725], [1651, 1653], [1591, 1652, 1654], [1653, 1655], [1654, 1656, 1726], [1655, 1657], [1592, 1656, 1658], [1657, 1659], [1658, 1660, 1727], [1659, 1661], [1593, 1660, 1662], [1661, 1663], [1662, 1664, 1728], [1663, 1665], [1594, 1664, 1666], [1665, 1667], [1666, 1668, 1729], [1667, 1669], [1595, 1668, 1670], [1669, 1671], [1670, 1672, 1730], [1671, 1673], [1596, 1672, 1674], [1673, 1675], [1674, 1676, 1731], [1675, 1677], [1597, 1676, 1678], [1677, 1679], [1678, 1680, 1732], [1679, 1681], [1598, 1680, 1682], [1681, 1683], [1682, 1684, 1733], [1683, 1685], [1599, 1684, 1686], [1685, 1687], [1686, 1688, 1734], [1687, 1689], [1600, 1688, 1690], [1689, 1691], [1690, 1692, 1735], [1691, 1693], [1601, 1692, 1694], [1693, 1695], [1694, 1696, 1736], [1695, 1697], [1602, 1696, 1698], [1697, 1699], [1698, 1700, 1737], [1699, 1701], [1603, 1700, 1702], [1701, 1703], [1702, 1704, 1738], [1703, 1705], [1604, 1704, 1706], [1705, 1707], [1706, 1708, 1739], [1707, 1709], [1605, 1708, 1710], [1709, 1711], [1710, 1712, 1740], [1711, 1713], [1606, 1712], [1607, 1741], [1611, 1745], [1615, 1749], [1619, 1753], [1623, 1757], [1627, 1761], [1631, 1765], [1635, 1769], [1639, 1773], [1643, 1777], [1647, 1781], [1651, 1785], [1655, 1789], [1659, 1793], [1663, 1797], [1667, 1801], [1671, 1805], [1675, 1809], [1679, 1813], [1683, 1817], [1687, 1821], [1691, 1825], [1695, 1829], [1699, 1833], [1703, 1837], [1707, 1841], [1711, 1845], [1714, 1742], [1741, 1743], [1742, 1744, 1848], [1743, 1745], [1715, 1744, 1746], [1745, 1747], [1746, 1748, 1849], [1747, 1749], [1716, 1748, 1750], [1749, 1751], [1750, 1752, 1850], [1751, 1753], [1717, 1752, 1754], [1753, 1755], [1754, 1756, 1851], [1755, 1757], [1718, 1756, 1758], [1757, 1759], [1758, 1760, 1852], [1759, 1761], [1719, 1760, 1762], [1761, 1763], [1762, 1764, 1853], [1763, 1765], [1720, 1764, 1766], [1765, 1767], [1766, 1768, 1854], [1767, 1769], [1721, 1768, 1770], [1769, 1771], [1770, 1772, 1855], [1771, 1773], [1722, 1772, 1774], [1773, 1775], [1774, 1776, 1856], [1775, 1777], [1723, 1776, 1778], [1777, 1779], [1778, 1780, 1857], [1779, 1781], [1724, 1780, 1782], [1781, 1783], [1782, 1784, 1858], [1783, 1785], [1725, 1784, 1786], [1785, 1787], [1786, 1788, 1859], [1787, 1789], [1726, 1788, 1790], [1789, 1791], [1790, 1792, 1860], [1791, 1793], [1727, 1792, 1794], [1793, 1795], [1794, 1796, 1861], [1795, 1797], [1728, 1796, 1798], [1797, 1799], [1798, 1800, 1862], [1799, 1801], [1729, 1800, 1802], [1801, 1803], [1802, 1804, 1863], [1803, 1805], [1730, 1804, 1806], [1805, 1807], [1806, 1808, 1864], [1807, 1809], [1731, 1808, 1810], [1809, 1811], [1810, 1812, 1865], [1811, 1813], [1732, 1812, 1814], [1813, 1815], [1814, 1816, 1866], [1815, 1817], [1733, 1816, 1818], [1817, 1819], [1818, 1820, 1867], [1819, 1821], [1734, 1820, 1822], [1821, 1823], [1822, 1824, 1868], [1823, 1825], [1735, 1824, 1826], [1825, 1827], [1826, 1828, 1869], [1827, 1829], [1736, 1828, 1830], [1829, 1831], [1830, 1832, 1870], [1831, 1833], [1737, 1832, 1834], [1833, 1835], [1834, 1836, 1871], [1835, 1837], [1738, 1836, 1838], [1837, 1839], [1838, 1840, 1872], [1839, 1841], [1739, 1840, 1842], [1841, 1843], [1842, 1844, 1873], [1843, 1845], [1740, 1844, 1846], [1845, 1847], [1846, 1874], [1743, 1877], [1747, 1881], [1751, 1885], [1755, 1889], [1759, 1893], [1763, 1897], [1767, 1901], [1771, 1905], [1775, 1909], [1779, 1913], [1783, 1917], [1787, 1921], [1791, 1925], [1795, 1929], [1799, 1933], [1803, 1937], [1807, 1941], [1811, 1945], [1815, 1949], [1819, 1953], [1823, 1957], [1827, 1961], [1831, 1965], [1835, 1969], [1839, 1973], [1843, 1977], [1847, 1981], [1876, 1982], [1875, 1877], [1848, 1876, 1878], [1877, 1879], [1878, 1880, 1983], [1879, 1881], [1849, 1880, 1882], [1881, 1883], [1882, 1884, 1984], [1883, 1885], [1850, 1884, 1886], [1885, 1887], [1886, 1888, 1985], [1887, 1889], [1851, 1888, 1890], [1889, 1891], [1890, 1892, 1986], [1891, 1893], [1852, 1892, 1894], [1893, 1895], [1894, 1896, 1987], [1895, 1897], [1853, 1896, 1898], [1897, 1899], [1898, 1900, 1988], [1899, 1901], [1854, 1900, 1902], [1901, 1903], [1902, 1904, 1989], [1903, 1905], [1855, 1904, 1906], [1905, 1907], [1906, 1908, 1990], [1907, 1909], [1856, 1908, 1910], [1909, 1911], [1910, 1912, 1991], [1911, 1913], [1857, 1912, 1914], [1913, 1915], [1914, 1916, 1992], [1915, 1917], [1858, 1916, 1918], [1917, 1919], [1918, 1920, 1993], [1919, 1921], [1859, 1920, 1922], [1921, 1923], [1922, 1924, 1994], [1923, 1925], [1860, 1924, 1926], [1925, 1927], [1926, 1928, 1995], [1927, 1929], [1861, 1928, 1930], [1929, 1931], [1930, 1932, 1996], [1931, 1933], [1862, 1932, 1934], [1933, 1935], [1934, 1936, 1997], [1935, 1937], [1863, 1936, 1938], [1937, 1939], [1938, 1940, 1998], [1939, 1941], [1864, 1940, 1942], [1941, 1943], [1942, 1944, 1999], [1943, 1945], [1865, 1944, 1946], [1945, 1947], [1946, 1948, 2000], [1947, 1949], [1866, 1948, 1950], [1949, 1951], [1950, 1952, 2001], [1951, 1953], [1867, 1952, 1954], [1953, 1955], [1954, 1956, 2002], [1955, 1957], [1868, 1956, 1958], [1957, 1959], [1958, 1960, 2003], [1959, 1961], [1869, 1960, 1962], [1961, 1963], [1962, 1964, 2004], [1963, 1965], [1870, 1964, 1966], [1965, 1967], [1966, 1968, 2005], [1967, 1969], [1871, 1968, 1970], [1969, 1971], [1970, 1972, 2006], [1971, 1973], [1872, 1972, 1974], [1973, 1975], [1974, 1976, 2007], [1975, 1977], [1873, 1976, 1978], [1977, 1979], [1978, 1980, 2008], [1979, 1981], [1874, 1980], [1875, 2009], [1879, 2013], [1883, 2017], [1887, 2021], [1891, 2025], [1895, 2029], [1899, 2033], [1903, 2037], [1907, 2041], [1911, 2045], [1915, 2049], [1919, 2053], [1923, 2057], [1927, 2061], [1931, 2065], [1935, 2069], [1939, 2073], [1943, 2077], [1947, 2081], [1951, 2085], [1955, 2089], [1959, 2093], [1963, 2097], [1967, 2101], [1971, 2105], [1975, 2109], [1979, 2113], [1982, 2010], [2009, 2011], [2010, 2012, 2116], [2011, 2013], [1983, 2012, 2014], [2013, 2015], [2014, 2016, 2117], [2015, 2017], [1984, 2016, 2018], [2017, 2019], [2018, 2020, 2118], [2019, 2021], [1985, 2020, 2022], [2021, 2023], [2022, 2024, 2119], [2023, 2025], [1986, 2024, 2026], [2025, 2027], [2026, 2028, 2120], [2027, 2029], [1987, 2028, 2030], [2029, 2031], [2030, 2032, 2121], [2031, 2033], [1988, 2032, 2034], [2033, 2035], [2034, 2036, 2122], [2035, 2037], [1989, 2036, 2038], [2037, 2039], [2038, 2040, 2123], [2039, 2041], [1990, 2040, 2042], [2041, 2043], [2042, 2044, 2124], [2043, 2045], [1991, 2044, 2046], [2045, 2047], [2046, 2048, 2125], [2047, 2049], [1992, 2048, 2050], [2049, 2051], [2050, 2052, 2126], [2051, 2053], [1993, 2052, 2054], [2053, 2055], [2054, 2056, 2127], [2055, 2057], [1994, 2056, 2058], [2057, 2059], [2058, 2060, 2128], [2059, 2061], [1995, 2060, 2062], [2061, 2063], [2062, 2064, 2129], [2063, 2065], [1996, 2064, 2066], [2065, 2067], [2066, 2068, 2130], [2067, 2069], [1997, 2068, 2070], [2069, 2071], [2070, 2072, 2131], [2071, 2073], [1998, 2072, 2074], [2073, 2075], [2074, 2076, 2132], [2075, 2077], [1999, 2076, 2078], [2077, 2079], [2078, 2080, 2133], [2079, 2081], [2000, 2080, 2082], [2081, 2083], [2082, 2084, 2134], [2083, 2085], [2001, 2084, 2086], [2085, 2087], [2086, 2088, 2135], [2087, 2089], [2002, 2088, 2090], [2089, 2091], [2090, 2092, 2136], [2091, 2093], [2003, 2092, 2094], [2093, 2095], [2094, 2096, 2137], [2095, 2097], [2004, 2096, 2098], [2097, 2099], [2098, 2100, 2138], [2099, 2101], [2005, 2100, 2102], [2101, 2103], [2102, 2104, 2139], [2103, 2105], [2006, 2104, 2106], [2105, 2107], [2106, 2108, 2140], [2107, 2109], [2007, 2108, 2110], [2109, 2111], [2110, 2112, 2141], [2111, 2113], [2008, 2112, 2114], [2113, 2115], [2114, 2142], [2011, 2145], [2015, 2149], [2019, 2153], [2023, 2157], [2027, 2161], [2031, 2165], [2035, 2169], [2039, 2173], [2043, 2177], [2047, 2181], [2051, 2185], [2055, 2189], [2059, 2193], [2063, 2197], [2067, 2201], [2071, 2205], [2075, 2209], [2079, 2213], [2083, 2217], [2087, 2221], [2091, 2225], [2095, 2229], [2099, 2233], [2103, 2237], [2107, 2241], [2111, 2245], [2115, 2249], [2144, 2250], [2143, 2145], [2116, 2144, 2146], [2145, 2147], [2146, 2148, 2251], [2147, 2149], [2117, 2148, 2150], [2149, 2151], [2150, 2152, 2252], [2151, 2153], [2118, 2152, 2154], [2153, 2155], [2154, 2156, 2253], [2155, 2157], [2119, 2156, 2158], [2157, 2159], [2158, 2160, 2254], [2159, 2161], [2120, 2160, 2162], [2161, 2163], [2162, 2164, 2255], [2163, 2165], [2121, 2164, 2166], [2165, 2167], [2166, 2168, 2256], [2167, 2169], [2122, 2168, 2170], [2169, 2171], [2170, 2172, 2257], [2171, 2173], [2123, 2172, 2174], [2173, 2175], [2174, 2176, 2258], [2175, 2177], [2124, 2176, 2178], [2177, 2179], [2178, 2180, 2259], [2179, 2181], [2125, 2180, 2182], [2181, 2183], [2182, 2184, 2260], [2183, 2185], [2126, 2184, 2186], [2185, 2187], [2186, 2188, 2261], [2187, 2189], [2127, 2188, 2190], [2189, 2191], [2190, 2192, 2262], [2191, 2193], [2128, 2192, 2194], [2193, 2195], [2194, 2196, 2263], [2195, 2197], [2129, 2196, 2198], [2197, 2199], [2198, 2200, 2264], [2199, 2201], [2130, 2200, 2202], [2201, 2203], [2202, 2204, 2265], [2203, 2205], [2131, 2204, 2206], [2205, 2207], [2206, 2208, 2266], [2207, 2209], [2132, 2208, 2210], [2209, 2211], [2210, 2212, 2267], [2211, 2213], [2133, 2212, 2214], [2213, 2215], [2214, 2216, 2268], [2215, 2217], [2134, 2216, 2218], [2217, 2219], [2218, 2220, 2269], [2219, 2221], [2135, 2220, 2222], [2221, 2223], [2222, 2224, 2270], [2223, 2225], [2136, 2224, 2226], [2225, 2227], [2226, 2228, 2271], [2227, 2229], [2137, 2228, 2230], [2229, 2231], [2230, 2232, 2272], [2231, 2233], [2138, 2232, 2234], [2233, 2235], [2234, 2236, 2273], [2235, 2237], [2139, 2236, 2238], [2237, 2239], [2238, 2240, 2274], [2239, 2241], [2140, 2240, 2242], [2241, 2243], [2242, 2244, 2275], [2243, 2245], [2141, 2244, 2246], [2245, 2247], [2246, 2248, 2276], [2247, 2249], [2142, 2248], [2143, 2277], [2147, 2281], [2151, 2285], [2155, 2289], [2159, 2293], [2163, 2297], [2167, 2301], [2171, 2305], [2175, 2309], [2179, 2313], [2183, 2317], [2187, 2321], [2191, 2325], [2195, 2329], [2199, 2333], [2203, 2337], [2207, 2341], [2211, 2345], [2215, 2349], [2219, 2353], [2223, 2357], [2227, 2361], [2231, 2365], [2235, 2369], [2239, 2373], [2243, 2377], [2247, 2381], [2250, 2278], [2277, 2279], [2278, 2280, 2384], [2279, 2281], [2251, 2280, 2282], [2281, 2283], [2282, 2284, 2385], [2283, 2285], [2252, 2284, 2286], [2285, 2287], [2286, 2288, 2386], [2287, 2289], [2253, 2288, 2290], [2289, 2291], [2290, 2292, 2387], [2291, 2293], [2254, 2292, 2294], [2293, 2295], [2294, 2296, 2388], [2295, 2297], [2255, 2296, 2298], [2297, 2299], [2298, 2300, 2389], [2299, 2301], [2256, 2300, 2302], [2301, 2303], [2302, 2304, 2390], [2303, 2305], [2257, 2304, 2306], [2305, 2307], [2306, 2308, 2391], [2307, 2309], [2258, 2308, 2310], [2309, 2311], [2310, 2312, 2392], [2311, 2313], [2259, 2312, 2314], [2313, 2315], [2314, 2316, 2393], [2315, 2317], [2260, 2316, 2318], [2317, 2319], [2318, 2320, 2394], [2319, 2321], [2261, 2320, 2322], [2321, 2323], [2322, 2324, 2395], [2323, 2325], [2262, 2324, 2326], [2325, 2327], [2326, 2328, 2396], [2327, 2329], [2263, 2328, 2330], [2329, 2331], [2330, 2332, 2397], [2331, 2333], [2264, 2332, 2334], [2333, 2335], [2334, 2336, 2398], [2335, 2337], [2265, 2336, 2338], [2337, 2339], [2338, 2340, 2399], [2339, 2341], [2266, 2340, 2342], [2341, 2343], [2342, 2344, 2400], [2343, 2345], [2267, 2344, 2346], [2345, 2347], [2346, 2348, 2401], [2347, 2349], [2268, 2348, 2350], [2349, 2351], [2350, 2352, 2402], [2351, 2353], [2269, 2352, 2354], [2353, 2355], [2354, 2356, 2403], [2355, 2357], [2270, 2356, 2358], [2357, 2359], [2358, 2360, 2404], [2359, 2361], [2271, 2360, 2362], [2361, 2363], [2362, 2364, 2405], [2363, 2365], [2272, 2364, 2366], [2365, 2367], [2366, 2368, 2406], [2367, 2369], [2273, 2368, 2370], [2369, 2371], [2370, 2372, 2407], [2371, 2373], [2274, 2372, 2374], [2373, 2375], [2374, 2376, 2408], [2375, 2377], [2275, 2376, 2378], [2377, 2379], [2378, 2380, 2409], [2379, 2381], [2276, 2380, 2382], [2381, 2383], [2382, 2410], [2279, 2413], [2283, 2417], [2287, 2421], [2291, 2425], [2295, 2429], [2299, 2433], [2303, 2437], [2307, 2441], [2311, 2445], [2315, 2449], [2319, 2453], [2323, 2457], [2327, 2461], [2331, 2465], [2335, 2469], [2339, 2473], [2343, 2477], [2347, 2481], [2351, 2485], [2355, 2489], [2359, 2493], [2363, 2497], [2367, 2501], [2371, 2505], [2375, 2509], [2379, 2513], [2383, 2517], [2412, 2518], [2411, 2413], [2384, 2412, 2414], [2413, 2415], [2414, 2416, 2519], [2415, 2417], [2385, 2416, 2418], [2417, 2419], [2418, 2420, 2520], [2419, 2421], [2386, 2420, 2422], [2421, 2423], [2422, 2424, 2521], [2423, 2425], [2387, 2424, 2426], [2425, 2427], [2426, 2428, 2522], [2427, 2429], [2388, 2428, 2430], [2429, 2431], [2430, 2432, 2523], [2431, 2433], [2389, 2432, 2434], [2433, 2435], [2434, 2436, 2524], [2435, 2437], [2390, 2436, 2438], [2437, 2439], [2438, 2440, 2525], [2439, 2441], [2391, 2440, 2442], [2441, 2443], [2442, 2444, 2526], [2443, 2445], [2392, 2444, 2446], [2445, 2447], [2446, 2448, 2527], [2447, 2449], [2393, 2448, 2450], [2449, 2451], [2450, 2452, 2528], [2451, 2453], [2394, 2452, 2454], [2453, 2455], [2454, 2456, 2529], [2455, 2457], [2395, 2456, 2458], [2457, 2459], [2458, 2460, 2530], [2459, 2461], [2396, 2460, 2462], [2461, 2463], [2462, 2464, 2531], [2463, 2465], [2397, 2464, 2466], [2465, 2467], [2466, 2468, 2532], [2467, 2469], [2398, 2468, 2470], [2469, 2471], [2470, 2472, 2533], [2471, 2473], [2399, 2472, 2474], [2473, 2475], [2474, 2476, 2534], [2475, 2477], [2400, 2476, 2478], [2477, 2479], [2478, 2480, 2535], [2479, 2481], [2401, 2480, 2482], [2481, 2483], [2482, 2484, 2536], [2483, 2485], [2402, 2484, 2486], [2485, 2487], [2486, 2488, 2537], [2487, 2489], [2403, 2488, 2490], [2489, 2491], [2490, 2492, 2538], [2491, 2493], [2404, 2492, 2494], [2493, 2495], [2494, 2496, 2539], [2495, 2497], [2405, 2496, 2498], [2497, 2499], [2498, 2500, 2540], [2499, 2501], [2406, 2500, 2502], [2501, 2503], [2502, 2504, 2541], [2503, 2505], [2407, 2504, 2506], [2505, 2507], [2506, 2508, 2542], [2507, 2509], [2408, 2508, 2510], [2509, 2511], [2510, 2512, 2543], [2511, 2513], [2409, 2512, 2514], [2513, 2515], [2514, 2516, 2544], [2515, 2517], [2410, 2516], [2411, 2545], [2415, 2549], [2419, 2553], [2423, 2557], [2427, 2561], [2431, 2565], [2435, 2569], [2439, 2573], [2443, 2577], [2447, 2581], [2451, 2585], [2455, 2589], [2459, 2593], [2463, 2597], [2467, 2601], [2471, 2605], [2475, 2609], [2479, 2613], [2483, 2617], [2487, 2621], [2491, 2625], [2495, 2629], [2499, 2633], [2503, 2637], [2507, 2641], [2511, 2645], [2515, 2649], [2518, 2546], [2545, 2547], [2546, 2548, 2652], [2547, 2549], [2519, 2548, 2550], [2549, 2551], [2550, 2552, 2653], [2551, 2553], [2520, 2552, 2554], [2553, 2555], [2554, 2556, 2654], [2555, 2557], [2521, 2556, 2558], [2557, 2559], [2558, 2560, 2655], [2559, 2561], [2522, 2560, 2562], [2561, 2563], [2562, 2564, 2656], [2563, 2565], [2523, 2564, 2566], [2565, 2567], [2566, 2568, 2657], [2567, 2569], [2524, 2568, 2570], [2569, 2571], [2570, 2572, 2658], [2571, 2573], [2525, 2572, 2574], [2573, 2575], [2574, 2576, 2659], [2575, 2577], [2526, 2576, 2578], [2577, 2579], [2578, 2580, 2660], [2579, 2581], [2527, 2580, 2582], [2581, 2583], [2582, 2584, 2661], [2583, 2585], [2528, 2584, 2586], [2585, 2587], [2586, 2588, 2662], [2587, 2589], [2529, 2588, 2590], [2589, 2591], [2590, 2592, 2663], [2591, 2593], [2530, 2592, 2594], [2593, 2595], [2594, 2596, 2664], [2595, 2597], [2531, 2596, 2598], [2597, 2599], [2598, 2600, 2665], [2599, 2601], [2532, 2600, 2602], [2601, 2603], [2602, 2604, 2666], [2603, 2605], [2533, 2604, 2606], [2605, 2607], [2606, 2608, 2667], [2607, 2609], [2534, 2608, 2610], [2609, 2611], [2610, 2612, 2668], [2611, 2613], [2535, 2612, 2614], [2613, 2615], [2614, 2616, 2669], [2615, 2617], [2536, 2616, 2618], [2617, 2619], [2618, 2620, 2670], [2619, 2621], [2537, 2620, 2622], [2621, 2623], [2622, 2624, 2671], [2623, 2625], [2538, 2624, 2626], [2625, 2627], [2626, 2628, 2672], [2627, 2629], [2539, 2628, 2630], [2629, 2631], [2630, 2632, 2673], [2631, 2633], [2540, 2632, 2634], [2633, 2635], [2634, 2636, 2674], [2635, 2637], [2541, 2636, 2638], [2637, 2639], [2638, 2640, 2675], [2639, 2641], [2542, 2640, 2642], [2641, 2643], [2642, 2644, 2676], [2643, 2645], [2543, 2644, 2646], [2645, 2647], [2646, 2648, 2677], [2647, 2649], [2544, 2648, 2650], [2649, 2651], [2650, 2678], [2547, 2681], [2551, 2685], [2555, 2689], [2559, 2693], [2563, 2697], [2567, 2701], [2571, 2705], [2575, 2709], [2579, 2713], [2583, 2717], [2587, 2721], [2591, 2725], [2595, 2729], [2599, 2733], [2603, 2737], [2607, 2741], [2611, 2745], [2615, 2749], [2619, 2753], [2623, 2757], [2627, 2761], [2631, 2765], [2635, 2769], [2639, 2773], [2643, 2777], [2647, 2781], [2651, 2785], [2680, 2786], [2679, 2681], [2652, 2680, 2682], [2681, 2683], [2682, 2684, 2787], [2683, 2685], [2653, 2684, 2686], [2685, 2687], [2686, 2688, 2788], [2687, 2689], [2654, 2688, 2690], [2689, 2691], [2690, 2692, 2789], [2691, 2693], [2655, 2692, 2694], [2693, 2695], [2694, 2696, 2790], [2695, 2697], [2656, 2696, 2698], [2697, 2699], [2698, 2700, 2791], [2699, 2701], [2657, 2700, 2702], [2701, 2703], [2702, 2704, 2792], [2703, 2705], [2658, 2704, 2706], [2705, 2707], [2706, 2708, 2793], [2707, 2709], [2659, 2708, 2710], [2709, 2711], [2710, 2712, 2794], [2711, 2713], [2660, 2712, 2714], [2713, 2715], [2714, 2716, 2795], [2715, 2717], [2661, 2716, 2718], [2717, 2719], [2718, 2720, 2796], [2719, 2721], [2662, 2720, 2722], [2721, 2723], [2722, 2724, 2797], [2723, 2725], [2663, 2724, 2726], [2725, 2727], [2726, 2728, 2798], [2727, 2729], [2664, 2728, 2730], [2729, 2731], [2730, 2732, 2799], [2731, 2733], [2665, 2732, 2734], [2733, 2735], [2734, 2736, 2800], [2735, 2737], [2666, 2736, 2738], [2737, 2739], [2738, 2740, 2801], [2739, 2741], [2667, 2740, 2742], [2741, 2743], [2742, 2744, 2802], [2743, 2745], [2668, 2744, 2746], [2745, 2747], [2746, 2748, 2803], [2747, 2749], [2669, 2748, 2750], [2749, 2751], [2750, 2752, 2804], [2751, 2753], [2670, 2752, 2754], [2753, 2755], [2754, 2756, 2805], [2755, 2757], [2671, 2756, 2758], [2757, 2759], [2758, 2760, 2806], [2759, 2761], [2672, 2760, 2762], [2761, 2763], [2762, 2764, 2807], [2763, 2765], [2673, 2764, 2766], [2765, 2767], [2766, 2768, 2808], [2767, 2769], [2674, 2768, 2770], [2769, 2771], [2770, 2772, 2809], [2771, 2773], [2675, 2772, 2774], [2773, 2775], [2774, 2776, 2810], [2775, 2777], [2676, 2776, 2778], [2777, 2779], [2778, 2780, 2811], [2779, 2781], [2677, 2780, 2782], [2781, 2783], [2782, 2784, 2812], [2783, 2785], [2678, 2784], [2679, 2813], [2683, 2817], [2687, 2821], [2691, 2825], [2695, 2829], [2699, 2833], [2703, 2837], [2707, 2841], [2711, 2845], [2715, 2849], [2719, 2853], [2723, 2857], [2727, 2861], [2731, 2865], [2735, 2869], [2739, 2873], [2743, 2877], [2747, 2881], [2751, 2885], [2755, 2889], [2759, 2893], [2763, 2897], [2767, 2901], [2771, 2905], [2775, 2909], [2779, 2913], [2783, 2917], [2786, 2814], [2813, 2815], [2814, 2816, 2920], [2815, 2817], [2787, 2816, 2818], [2817, 2819], [2818, 2820, 2921], [2819, 2821], [2788, 2820, 2822], [2821, 2823], [2822, 2824, 2922], [2823, 2825], [2789, 2824, 2826], [2825, 2827], [2826, 2828, 2923], [2827, 2829], [2790, 2828, 2830], [2829, 2831], [2830, 2832, 2924], [2831, 2833], [2791, 2832, 2834], [2833, 2835], [2834, 2836, 2925], [2835, 2837], [2792, 2836, 2838], [2837, 2839], [2838, 2840, 2926], [2839, 2841], [2793, 2840, 2842], [2841, 2843], [2842, 2844, 2927], [2843, 2845], [2794, 2844, 2846], [2845, 2847], [2846, 2848, 2928], [2847, 2849], [2795, 2848, 2850], [2849, 2851], [2850, 2852, 2929], [2851, 2853], [2796, 2852, 2854], [2853, 2855], [2854, 2856, 2930], [2855, 2857], [2797, 2856, 2858], [2857, 2859], [2858, 2860, 2931], [2859, 2861], [2798, 2860, 2862], [2861, 2863], [2862, 2864, 2932], [2863, 2865], [2799, 2864, 2866], [2865, 2867], [2866, 2868, 2933], [2867, 2869], [2800, 2868, 2870], [2869, 2871], [2870, 2872, 2934], [2871, 2873], [2801, 2872, 2874], [2873, 2875], [2874, 2876, 2935], [2875, 2877], [2802, 2876, 2878], [2877, 2879], [2878, 2880, 2936], [2879, 2881], [2803, 2880, 2882], [2881, 2883], [2882, 2884, 2937], [2883, 2885], [2804, 2884, 2886], [2885, 2887], [2886, 2888, 2938], [2887, 2889], [2805, 2888, 2890], [2889, 2891], [2890, 2892, 2939], [2891, 2893], [2806, 2892, 2894], [2893, 2895], [2894, 2896, 2940], [2895, 2897], [2807, 2896, 2898], [2897, 2899], [2898, 2900, 2941], [2899, 2901], [2808, 2900, 2902], [2901, 2903], [2902, 2904, 2942], [2903, 2905], [2809, 2904, 2906], [2905, 2907], [2906, 2908, 2943], [2907, 2909], [2810, 2908, 2910], [2909, 2911], [2910, 2912, 2944], [2911, 2913], [2811, 2912, 2914], [2913, 2915], [2914, 2916, 2945], [2915, 2917], [2812, 2916, 2918], [2917, 2919], [2918, 2946], [2815, 2949], [2819, 2953], [2823, 2957], [2827, 2961], [2831, 2965], [2835, 2969], [2839, 2973], [2843, 2977], [2847, 2981], [2851, 2985], [2855, 2989], [2859, 2993], [2863, 2997], [2867, 3001], [2871, 3005], [2875, 3009], [2879, 3013], [2883, 3017], [2887, 3021], [2891, 3025], [2895, 3029], [2899, 3033], [2903, 3037], [2907, 3041], [2911, 3045], [2915, 3049], [2919, 3053], [2948, 3054], [2947, 2949], [2920, 2948, 2950], [2949, 2951], [2950, 2952, 3055], [2951, 2953], [2921, 2952, 2954], [2953, 2955], [2954, 2956, 3056], [2955, 2957], [2922, 2956, 2958], [2957, 2959], [2958, 2960, 3057], [2959, 2961], [2923, 2960, 2962], [2961, 2963], [2962, 2964, 3058], [2963, 2965], [2924, 2964, 2966], [2965, 2967], [2966, 2968, 3059], [2967, 2969], [2925, 2968, 2970], [2969, 2971], [2970, 2972, 3060], [2971, 2973], [2926, 2972, 2974], [2973, 2975], [2974, 2976, 3061], [2975, 2977], [2927, 2976, 2978], [2977, 2979], [2978, 2980, 3062], [2979, 2981], [2928, 2980, 2982], [2981, 2983], [2982, 2984, 3063], [2983, 2985], [2929, 2984, 2986], [2985, 2987], [2986, 2988, 3064], [2987, 2989], [2930, 2988, 2990], [2989, 2991], [2990, 2992, 3065], [2991, 2993], [2931, 2992, 2994], [2993, 2995], [2994, 2996, 3066], [2995, 2997], [2932, 2996, 2998], [2997, 2999], [2998, 3000, 3067], [2999, 3001], [2933, 3000, 3002], [3001, 3003], [3002, 3004, 3068], [3003, 3005], [2934, 3004, 3006], [3005, 3007], [3006, 3008, 3069], [3007, 3009], [2935, 3008, 3010], [3009, 3011], [3010, 3012, 3070], [3011, 3013], [2936, 3012, 3014], [3013, 3015], [3014, 3016, 3071], [3015, 3017], [2937, 3016, 3018], [3017, 3019], [3018, 3020, 3072], [3019, 3021], [2938, 3020, 3022], [3021, 3023], [3022, 3024, 3073], [3023, 3025], [2939, 3024, 3026], [3025, 3027], [3026, 3028, 3074], [3027, 3029], [2940, 3028, 3030], [3029, 3031], [3030, 3032, 3075], [3031, 3033], [2941, 3032, 3034], [3033, 3035], [3034, 3036, 3076], [3035, 3037], [2942, 3036, 3038], [3037, 3039], [3038, 3040, 3077], [3039, 3041], [2943, 3040, 3042], [3041, 3043], [3042, 3044, 3078], [3043, 3045], [2944, 3044, 3046], [3045, 3047], [3046, 3048, 3079], [3047, 3049], [2945, 3048, 3050], [3049, 3051], [3050, 3052, 3080], [3051, 3053], [2946, 3052], [2947, 3081], [2951, 3085], [2955, 3089], [2959, 3093], [2963, 3097], [2967, 3101], [2971, 3105], [2975, 3109], [2979, 3113], [2983, 3117], [2987, 3121], [2991, 3125], [2995, 3129], [2999, 3133], [3003, 3137], [3007, 3141], [3011, 3145], [3015, 3149], [3019, 3153], [3023, 3157], [3027, 3161], [3031, 3165], [3035, 3169], [3039, 3173], [3043, 3177], [3047, 3181], [3051, 3185], [3054, 3082], [3081, 3083], [3082, 3084, 3188], [3083, 3085], [3055, 3084, 3086], [3085, 3087], [3086, 3088, 3189], [3087, 3089], [3056, 3088, 3090], [3089, 3091], [3090, 3092, 3190], [3091, 3093], [3057, 3092, 3094], [3093, 3095], [3094, 3096, 3191], [3095, 3097], [3058, 3096, 3098], [3097, 3099], [3098, 3100, 3192], [3099, 3101], [3059, 3100, 3102], [3101, 3103], [3102, 3104, 3193], [3103, 3105], [3060, 3104, 3106], [3105, 3107], [3106, 3108, 3194], [3107, 3109], [3061, 3108, 3110], [3109, 3111], [3110, 3112, 3195], [3111, 3113], [3062, 3112, 3114], [3113, 3115], [3114, 3116, 3196], [3115, 3117], [3063, 3116, 3118], [3117, 3119], [3118, 3120, 3197], [3119, 3121], [3064, 3120, 3122], [3121, 3123], [3122, 3124, 3198], [3123, 3125], [3065, 3124, 3126], [3125, 3127], [3126, 3128, 3199], [3127, 3129], [3066, 3128, 3130], [3129, 3131], [3130, 3132, 3200], [3131, 3133], [3067, 3132, 3134], [3133, 3135], [3134, 3136, 3201], [3135, 3137], [3068, 3136, 3138], [3137, 3139], [3138, 3140, 3202], [3139, 3141], [3069, 3140, 3142], [3141, 3143], [3142, 3144, 3203], [3143, 3145], [3070, 3144, 3146], [3145, 3147], [3146, 3148, 3204], [3147, 3149], [3071, 3148, 3150], [3149, 3151], [3150, 3152, 3205], [3151, 3153], [3072, 3152, 3154], [3153, 3155], [3154, 3156, 3206], [3155, 3157], [3073, 3156, 3158], [3157, 3159], [3158, 3160, 3207], [3159, 3161], [3074, 3160, 3162], [3161, 3163], [3162, 3164, 3208], [3163, 3165], [3075, 3164, 3166], [3165, 3167], [3166, 3168, 3209], [3167, 3169], [3076, 3168, 3170], [3169, 3171], [3170, 3172, 3210], [3171, 3173], [3077, 3172, 3174], [3173, 3175], [3174, 3176, 3211], [3175, 3177], [3078, 3176, 3178], [3177, 3179], [3178, 3180, 3212], [3179, 3181], [3079, 3180, 3182], [3181, 3183], [3182, 3184, 3213], [3183, 3185], [3080, 3184, 3186], [3185, 3187], [3186, 3214], [3083, 3217], [3087, 3221], [3091, 3225], [3095, 3229], [3099, 3233], [3103, 3237], [3107, 3241], [3111, 3245], [3115, 3249], [3119, 3253], [3123, 3257], [3127, 3261], [3131, 3265], [3135, 3269], [3139, 3273], [3143, 3277], [3147, 3281], [3151, 3285], [3155, 3289], [3159, 3293], [3163, 3297], [3167, 3301], [3171, 3305], [3175, 3309], [3179, 3313], [3183, 3317], [3187, 3321], [3216, 3322], [3215, 3217], [3188, 3216, 3218], [3217, 3219], [3218, 3220, 3323], [3219, 3221], [3189, 3220, 3222], [3221, 3223], [3222, 3224, 3324], [3223, 3225], [3190, 3224, 3226], [3225, 3227], [3226, 3228, 3325], [3227, 3229], [3191, 3228, 3230], [3229, 3231], [3230, 3232, 3326], [3231, 3233], [3192, 3232, 3234], [3233, 3235], [3234, 3236, 3327], [3235, 3237], [3193, 3236, 3238], [3237, 3239], [3238, 3240, 3328], [3239, 3241], [3194, 3240, 3242], [3241, 3243], [3242, 3244, 3329], [3243, 3245], [3195, 3244, 3246], [3245, 3247], [3246, 3248, 3330], [3247, 3249], [3196, 3248, 3250], [3249, 3251], [3250, 3252, 3331], [3251, 3253], [3197, 3252, 3254], [3253, 3255], [3254, 3256, 3332], [3255, 3257], [3198, 3256, 3258], [3257, 3259], [3258, 3260, 3333], [3259, 3261], [3199, 3260, 3262], [3261, 3263], [3262, 3264, 3334], [3263, 3265], [3200, 3264, 3266], [3265, 3267], [3266, 3268, 3335], [3267, 3269], [3201, 3268, 3270], [3269, 3271], [3270, 3272, 3336], [3271, 3273], [3202, 3272, 3274], [3273, 3275], [3274, 3276, 3337], [3275, 3277], [3203, 3276, 3278], [3277, 3279], [3278, 3280, 3338], [3279, 3281], [3204, 3280, 3282], [3281, 3283], [3282, 3284, 3339], [3283, 3285], [3205, 3284, 3286], [3285, 3287], [3286, 3288, 3340], [3287, 3289], [3206, 3288, 3290], [3289, 3291], [3290, 3292, 3341], [3291, 3293], [3207, 3292, 3294], [3293, 3295], [3294, 3296, 3342], [3295, 3297], [3208, 3296, 3298], [3297, 3299], [3298, 3300, 3343], [3299, 3301], [3209, 3300, 3302], [3301, 3303], [3302, 3304, 3344], [3303, 3305], [3210, 3304, 3306], [3305, 3307], [3306, 3308, 3345], [3307, 3309], [3211, 3308, 3310], [3309, 3311], [3310, 3312, 3346], [3311, 3313], [3212, 3312, 3314], [3313, 3315], [3314, 3316, 3347], [3315, 3317], [3213, 3316, 3318], [3317, 3319], [3318, 3320, 3348], [3319, 3321], [3214, 3320], [3215, 3349], [3219, 3353], [3223, 3357], [3227, 3361], [3231, 3365], [3235, 3369], [3239, 3373], [3243, 3377], [3247, 3381], [3251, 3385], [3255, 3389], [3259, 3393], [3263, 3397], [3267, 3401], [3271, 3405], [3275, 3409], [3279, 3413], [3283, 3417], [3287, 3421], [3291, 3425], [3295, 3429], [3299, 3433], [3303, 3437], [3307, 3441], [3311, 3445], [3315, 3449], [3319, 3453], [3322, 3350], [3349, 3351], [3350, 3352, 3456], [3351, 3353], [3323, 3352, 3354], [3353, 3355], [3354, 3356, 3457], [3355, 3357], [3324, 3356, 3358], [3357, 3359], [3358, 3360, 3458], [3359, 3361], [3325, 3360, 3362], [3361, 3363], [3362, 3364, 3459], [3363, 3365], [3326, 3364, 3366], [3365, 3367], [3366, 3368, 3460], [3367, 3369], [3327, 3368, 3370], [3369, 3371], [3370, 3372, 3461], [3371, 3373], [3328, 3372, 3374], [3373, 3375], [3374, 3376, 3462], [3375, 3377], [3329, 3376, 3378], [3377, 3379], [3378, 3380, 3463], [3379, 3381], [3330, 3380, 3382], [3381, 3383], [3382, 3384, 3464], [3383, 3385], [3331, 3384, 3386], [3385, 3387], [3386, 3388, 3465], [3387, 3389], [3332, 3388, 3390], [3389, 3391], [3390, 3392, 3466], [3391, 3393], [3333, 3392, 3394], [3393, 3395], [3394, 3396, 3467], [3395, 3397], [3334, 3396, 3398], [3397, 3399], [3398, 3400, 3468], [3399, 3401], [3335, 3400, 3402], [3401, 3403], [3402, 3404, 3469], [3403, 3405], [3336, 3404, 3406], [3405, 3407], [3406, 3408, 3470], [3407, 3409], [3337, 3408, 3410], [3409, 3411], [3410, 3412, 3471], [3411, 3413], [3338, 3412, 3414], [3413, 3415], [3414, 3416, 3472], [3415, 3417], [3339, 3416, 3418], [3417, 3419], [3418, 3420, 3473], [3419, 3421], [3340, 3420, 3422], [3421, 3423], [3422, 3424, 3474], [3423, 3425], [3341, 3424, 3426], [3425, 3427], [3426, 3428, 3475], [3427, 3429], [3342, 3428, 3430], [3429, 3431], [3430, 3432, 3476], [3431, 3433], [3343, 3432, 3434], [3433, 3435], [3434, 3436, 3477], [3435, 3437], [3344, 3436, 3438], [3437, 3439], [3438, 3440, 3478], [3439, 3441], [3345, 3440, 3442], [3441, 3443], [3442, 3444, 3479], [3443, 3445], [3346, 3444, 3446], [3445, 3447], [3446, 3448, 3480], [3447, 3449], [3347, 3448, 3450], [3449, 3451], [3450, 3452, 3481], [3451, 3453], [3348, 3452, 3454], [3453, 3455], [3454, 3482], [3351, 3485], [3355, 3489], [3359, 3493], [3363, 3497], [3367, 3501], [3371, 3505], [3375, 3509], [3379, 3513], [3383, 3517], [3387, 3521], [3391, 3525], [3395, 3529], [3399, 3533], [3403, 3537], [3407, 3541], [3411, 3545], [3415, 3549], [3419, 3553], [3423, 3557], [3427, 3561], [3431, 3565], [3435, 3569], [3439, 3573], [3443, 3577], [3447, 3581], [3451, 3585], [3455, 3589], [3484, 3590], [3483, 3485], [3456, 3484, 3486], [3485, 3487], [3486, 3488, 3591], [3487, 3489], [3457, 3488, 3490], [3489, 3491], [3490, 3492, 3592], [3491, 3493], [3458, 3492, 3494], [3493, 3495], [3494, 3496, 3593], [3495, 3497], [3459, 3496, 3498], [3497, 3499], [3498, 3500, 3594], [3499, 3501], [3460, 3500, 3502], [3501, 3503], [3502, 3504, 3595], [3503, 3505], [3461, 3504, 3506], [3505, 3507], [3506, 3508, 3596], [3507, 3509], [3462, 3508, 3510], [3509, 3511], [3510, 3512, 3597], [3511, 3513], [3463, 3512, 3514], [3513, 3515], [3514, 3516, 3598], [3515, 3517], [3464, 3516, 3518], [3517, 3519], [3518, 3520, 3599], [3519, 3521], [3465, 3520, 3522], [3521, 3523], [3522, 3524, 3600], [3523, 3525], [3466, 3524, 3526], [3525, 3527], [3526, 3528, 3601], [3527, 3529], [3467, 3528, 3530], [3529, 3531], [3530, 3532, 3602], [3531, 3533], [3468, 3532, 3534], [3533, 3535], [3534, 3536, 3603], [3535, 3537], [3469, 3536, 3538], [3537, 3539], [3538, 3540, 3604], [3539, 3541], [3470, 3540, 3542], [3541, 3543], [3542, 3544, 3605], [3543, 3545], [3471, 3544, 3546], [3545, 3547], [3546, 3548, 3606], [3547, 3549], [3472, 3548, 3550], [3549, 3551], [3550, 3552, 3607], [3551, 3553], [3473, 3552, 3554], [3553, 3555], [3554, 3556, 3608], [3555, 3557], [3474, 3556, 3558], [3557, 3559], [3558, 3560, 3609], [3559, 3561], [3475, 3560, 3562], [3561, 3563], [3562, 3564, 3610], [3563, 3565], [3476, 3564, 3566], [3565, 3567], [3566, 3568, 3611], [3567, 3569], [3477, 3568, 3570], [3569, 3571], [3570, 3572, 3612], [3571, 3573], [3478, 3572, 3574], [3573, 3575], [3574, 3576, 3613], [3575, 3577], [3479, 3576, 3578], [3577, 3579], [3578, 3580, 3614], [3579, 3581], [3480, 3580, 3582], [3581, 3583], [3582, 3584, 3615], [3583, 3585], [3481, 3584, 3586], [3585, 3587], [3586, 3588, 3616], [3587, 3589], [3482, 3588], [3483, 3617], [3487, 3621], [3491, 3625], [3495, 3629], [3499, 3633], [3503, 3637], [3507, 3641], [3511, 3645], [3515, 3649], [3519, 3653], [3523, 3657], [3527, 3661], [3531, 3665], [3535, 3669], [3539, 3673], [3543, 3677], [3547, 3681], [3551, 3685], [3555, 3689], [3559, 3693], [3563, 3697], [3567, 3701], [3571, 3705], [3575, 3709], [3579, 3713], [3583, 3717], [3587, 3721], [3590, 3618], [3617, 3619], [3618, 3620, 3724], [3619, 3621], [3591, 3620, 3622], [3621, 3623], [3622, 3624, 3725], [3623, 3625], [3592, 3624, 3626], [3625, 3627], [3626, 3628, 3726], [3627, 3629], [3593, 3628, 3630], [3629, 3631], [3630, 3632, 3727], [3631, 3633], [3594, 3632, 3634], [3633, 3635], [3634, 3636, 3728], [3635, 3637], [3595, 3636, 3638], [3637, 3639], [3638, 3640, 3729], [3639, 3641], [3596, 3640, 3642], [3641, 3643], [3642, 3644, 3730], [3643, 3645], [3597, 3644, 3646], [3645, 3647], [3646, 3648, 3731], [3647, 3649], [3598, 3648, 3650], [3649, 3651], [3650, 3652, 3732], [3651, 3653], [3599, 3652, 3654], [3653, 3655], [3654, 3656, 3733], [3655, 3657], [3600, 3656, 3658], [3657, 3659], [3658, 3660, 3734], [3659, 3661], [3601, 3660, 3662], [3661, 3663], [3662, 3664, 3735], [3663, 3665], [3602, 3664, 3666], [3665, 3667], [3666, 3668, 3736], [3667, 3669], [3603, 3668, 3670], [3669, 3671], [3670, 3672, 3737], [3671, 3673], [3604, 3672, 3674], [3673, 3675], [3674, 3676, 3738], [3675, 3677], [3605, 3676, 3678], [3677, 3679], [3678, 3680, 3739], [3679, 3681], [3606, 3680, 3682], [3681, 3683], [3682, 3684, 3740], [3683, 3685], [3607, 3684, 3686], [3685, 3687], [3686, 3688, 3741], [3687, 3689], [3608, 3688, 3690], [3689, 3691], [3690, 3692, 3742], [3691, 3693], [3609, 3692, 3694], [3693, 3695], [3694, 3696, 3743], [3695, 3697], [3610, 3696, 3698], [3697, 3699], [3698, 3700, 3744], [3699, 3701], [3611, 3700, 3702], [3701, 3703], [3702, 3704, 3745], [3703, 3705], [3612, 3704, 3706], [3705, 3707], [3706, 3708, 3746], [3707, 3709], [3613, 3708, 3710], [3709, 3711], [3710, 3712, 3747], [3711, 3713], [3614, 3712, 3714], [3713, 3715], [3714, 3716, 3748], [3715, 3717], [3615, 3716, 3718], [3717, 3719], [3718, 3720, 3749], [3719, 3721], [3616, 3720, 3722], [3721, 3723], [3722, 3750], [3619, 3753], [3623, 3757], [3627, 3761], [3631, 3765], [3635, 3769], [3639, 3773], [3643, 3777], [3647, 3781], [3651, 3785], [3655, 3789], [3659, 3793], [3663, 3797], [3667, 3801], [3671, 3805], [3675, 3809], [3679, 3813], [3683, 3817], [3687, 3821], [3691, 3825], [3695, 3829], [3699, 3833], [3703, 3837], [3707, 3841], [3711, 3845], [3715, 3849], [3719, 3853], [3723, 3857], [3752, 3858], [3751, 3753], [3724, 3752, 3754], [3753, 3755], [3754, 3756, 3859], [3755, 3757], [3725, 3756, 3758], [3757, 3759], [3758, 3760, 3860], [3759, 3761], [3726, 3760, 3762], [3761, 3763], [3762, 3764, 3861], [3763, 3765], [3727, 3764, 3766], [3765, 3767], [3766, 3768, 3862], [3767, 3769], [3728, 3768, 3770], [3769, 3771], [3770, 3772, 3863], [3771, 3773], [3729, 3772, 3774], [3773, 3775], [3774, 3776, 3864], [3775, 3777], [3730, 3776, 3778], [3777, 3779], [3778, 3780, 3865], [3779, 3781], [3731, 3780, 3782], [3781, 3783], [3782, 3784, 3866], [3783, 3785], [3732, 3784, 3786], [3785, 3787], [3786, 3788, 3867], [3787, 3789], [3733, 3788, 3790], [3789, 3791], [3790, 3792, 3868], [3791, 3793], [3734, 3792, 3794], [3793, 3795], [3794, 3796, 3869], [3795, 3797], [3735, 3796, 3798], [3797, 3799], [3798, 3800, 3870], [3799, 3801], [3736, 3800, 3802], [3801, 3803], [3802, 3804, 3871], [3803, 3805], [3737, 3804, 3806], [3805, 3807], [3806, 3808, 3872], [3807, 3809], [3738, 3808, 3810], [3809, 3811], [3810, 3812, 3873], [3811, 3813], [3739, 3812, 3814], [3813, 3815], [3814, 3816, 3874], [3815, 3817], [3740, 3816, 3818], [3817, 3819], [3818, 3820, 3875], [3819, 3821], [3741, 3820, 3822], [3821, 3823], [3822, 3824, 3876], [3823, 3825], [3742, 3824, 3826], [3825, 3827], [3826, 3828, 3877], [3827, 3829], [3743, 3828, 3830], [3829, 3831], [3830, 3832, 3878], [3831, 3833], [3744, 3832, 3834], [3833, 3835], [3834, 3836, 3879], [3835, 3837], [3745, 3836, 3838], [3837, 3839], [3838, 3840, 3880], [3839, 3841], [3746, 3840, 3842], [3841, 3843], [3842, 3844, 3881], [3843, 3845], [3747, 3844, 3846], [3845, 3847], [3846, 3848, 3882], [3847, 3849], [3748, 3848, 3850], [3849, 3851], [3850, 3852, 3883], [3851, 3853], [3749, 3852, 3854], [3853, 3855], [3854, 3856, 3884], [3855, 3857], [3750, 3856], [3751, 3885], [3755, 3889], [3759, 3893], [3763, 3897], [3767, 3901], [3771, 3905], [3775, 3909], [3779, 3913], [3783, 3917], [3787, 3921], [3791, 3925], [3795, 3929], [3799, 3933], [3803, 3937], [3807, 3941], [3811, 3945], [3815, 3949], [3819, 3953], [3823, 3957], [3827, 3961], [3831, 3965], [3835, 3969], [3839, 3973], [3843, 3977], [3847, 3981], [3851, 3985], [3855, 3989], [3858, 3886], [3885, 3887], [3886, 3888, 3992], [3887, 3889], [3859, 3888, 3890], [3889, 3891], [3890, 3892, 3993], [3891, 3893], [3860, 3892, 3894], [3893, 3895], [3894, 3896, 3994], [3895, 3897], [3861, 3896, 3898], [3897, 3899], [3898, 3900, 3995], [3899, 3901], [3862, 3900, 3902], [3901, 3903], [3902, 3904, 3996], [3903, 3905], [3863, 3904, 3906], [3905, 3907], [3906, 3908, 3997], [3907, 3909], [3864, 3908, 3910], [3909, 3911], [3910, 3912, 3998], [3911, 3913], [3865, 3912, 3914], [3913, 3915], [3914, 3916, 3999], [3915, 3917], [3866, 3916, 3918], [3917, 3919], [3918, 3920, 4000], [3919, 3921], [3867, 3920, 3922], [3921, 3923], [3922, 3924, 4001], [3923, 3925], [3868, 3924, 3926], [3925, 3927], [3926, 3928, 4002], [3927, 3929], [3869, 3928, 3930], [3929, 3931], [3930, 3932, 4003], [3931, 3933], [3870, 3932, 3934], [3933, 3935], [3934, 3936, 4004], [3935, 3937], [3871, 3936, 3938], [3937, 3939], [3938, 3940, 4005], [3939, 3941], [3872, 3940, 3942], [3941, 3943], [3942, 3944, 4006], [3943, 3945], [3873, 3944, 3946], [3945, 3947], [3946, 3948, 4007], [3947, 3949], [3874, 3948, 3950], [3949, 3951], [3950, 3952, 4008], [3951, 3953], [3875, 3952, 3954], [3953, 3955], [3954, 3956, 4009], [3955, 3957], [3876, 3956, 3958], [3957, 3959], [3958, 3960, 4010], [3959, 3961], [3877, 3960, 3962], [3961, 3963], [3962, 3964, 4011], [3963, 3965], [3878, 3964, 3966], [3965, 3967], [3966, 3968, 4012], [3967, 3969], [3879, 3968, 3970], [3969, 3971], [3970, 3972, 4013], [3971, 3973], [3880, 3972, 3974], [3973, 3975], [3974, 3976, 4014], [3975, 3977], [3881, 3976, 3978], [3977, 3979], [3978, 3980, 4015], [3979, 3981], [3882, 3980, 3982], [3981, 3983], [3982, 3984, 4016], [3983, 3985], [3883, 3984, 3986], [3985, 3987], [3986, 3988, 4017], [3987, 3989], [3884, 3988, 3990], [3989, 3991], [3990, 4018], [3887, 4021], [3891, 4025], [3895, 4029], [3899, 4033], [3903, 4037], [3907, 4041], [3911, 4045], [3915, 4049], [3919, 4053], [3923, 4057], [3927, 4061], [3931, 4065], [3935, 4069], [3939, 4073], [3943, 4077], [3947, 4081], [3951, 4085], [3955, 4089], [3959, 4093], [3963, 4097], [3967, 4101], [3971, 4105], [3975, 4109], [3979, 4113], [3983, 4117], [3987, 4121], [3991, 4125], [4020, 4126], [4019, 4021], [3992, 4020, 4022], [4021, 4023], [4022, 4024, 4127], [4023, 4025], [3993, 4024, 4026], [4025, 4027], [4026, 4028, 4128], [4027, 4029], [3994, 4028, 4030], [4029, 4031], [4030, 4032, 4129], [4031, 4033], [3995, 4032, 4034], [4033, 4035], [4034, 4036, 4130], [4035, 4037], [3996, 4036, 4038], [4037, 4039], [4038, 4040, 4131], [4039, 4041], [3997, 4040, 4042], [4041, 4043], [4042, 4044, 4132], [4043, 4045], [3998, 4044, 4046], [4045, 4047], [4046, 4048, 4133], [4047, 4049], [3999, 4048, 4050], [4049, 4051], [4050, 4052, 4134], [4051, 4053], [4000, 4052, 4054], [4053, 4055], [4054, 4056, 4135], [4055, 4057], [4001, 4056, 4058], [4057, 4059], [4058, 4060, 4136], [4059, 4061], [4002, 4060, 4062], [4061, 4063], [4062, 4064, 4137], [4063, 4065], [4003, 4064, 4066], [4065, 4067], [4066, 4068, 4138], [4067, 4069], [4004, 4068, 4070], [4069, 4071], [4070, 4072, 4139], [4071, 4073], [4005, 4072, 4074], [4073, 4075], [4074, 4076, 4140], [4075, 4077], [4006, 4076, 4078], [4077, 4079], [4078, 4080, 4141], [4079, 4081], [4007, 4080, 4082], [4081, 4083], [4082, 4084, 4142], [4083, 4085], [4008, 4084, 4086], [4085, 4087], [4086, 4088, 4143], [4087, 4089], [4009, 4088, 4090], [4089, 4091], [4090, 4092, 4144], [4091, 4093], [4010, 4092, 4094], [4093, 4095], [4094, 4096, 4145], [4095, 4097], [4011, 4096, 4098], [4097, 4099], [4098, 4100, 4146], [4099, 4101], [4012, 4100, 4102], [4101, 4103], [4102, 4104, 4147], [4103, 4105], [4013, 4104, 4106], [4105, 4107], [4106, 4108, 4148], [4107, 4109], [4014, 4108, 4110], [4109, 4111], [4110, 4112, 4149], [4111, 4113], [4015, 4112, 4114], [4113, 4115], [4114, 4116, 4150], [4115, 4117], [4016, 4116, 4118], [4117, 4119], [4118, 4120, 4151], [4119, 4121], [4017, 4120, 4122], [4121, 4123], [4122, 4124, 4152], [4123, 4125], [4018, 4124], [4019, 4153], [4023, 4157], [4027, 4161], [4031, 4165], [4035, 4169], [4039, 4173], [4043, 4177], [4047, 4181], [4051, 4185], [4055, 4189], [4059, 4193], [4063, 4197], [4067, 4201], [4071, 4205], [4075, 4209], [4079, 4213], [4083, 4217], [4087, 4221], [4091, 4225], [4095, 4229], [4099, 4233], [4103, 4237], [4107, 4241], [4111, 4245], [4115, 4249], [4119, 4253], [4123, 4257], [4126, 4154], [4153, 4155], [4154, 4156, 4260], [4155, 4157], [4127, 4156, 4158], [4157, 4159], [4158, 4160, 4261], [4159, 4161], [4128, 4160, 4162], [4161, 4163], [4162, 4164, 4262], [4163, 4165], [4129, 4164, 4166], [4165, 4167], [4166, 4168, 4263], [4167, 4169], [4130, 4168, 4170], [4169, 4171], [4170, 4172, 4264], [4171, 4173], [4131, 4172, 4174], [4173, 4175], [4174, 4176, 4265], [4175, 4177], [4132, 4176, 4178], [4177, 4179], [4178, 4180, 4266], [4179, 4181], [4133, 4180, 4182], [4181, 4183], [4182, 4184, 4267], [4183, 4185], [4134, 4184, 4186], [4185, 4187], [4186, 4188, 4268], [4187, 4189], [4135, 4188, 4190], [4189, 4191], [4190, 4192, 4269], [4191, 4193], [4136, 4192, 4194], [4193, 4195], [4194, 4196, 4270], [4195, 4197], [4137, 4196, 4198], [4197, 4199], [4198, 4200, 4271], [4199, 4201], [4138, 4200, 4202], [4201, 4203], [4202, 4204, 4272], [4203, 4205], [4139, 4204, 4206], [4205, 4207], [4206, 4208, 4273], [4207, 4209], [4140, 4208, 4210], [4209, 4211], [4210, 4212, 4274], [4211, 4213], [4141, 4212, 4214], [4213, 4215], [4214, 4216, 4275], [4215, 4217], [4142, 4216, 4218], [4217, 4219], [4218, 4220, 4276], [4219, 4221], [4143, 4220, 4222], [4221, 4223], [4222, 4224, 4277], [4223, 4225], [4144, 4224, 4226], [4225, 4227], [4226, 4228, 4278], [4227, 4229], [4145, 4228, 4230], [4229, 4231], [4230, 4232, 4279], [4231, 4233], [4146, 4232, 4234], [4233, 4235], [4234, 4236, 4280], [4235, 4237], [4147, 4236, 4238], [4237, 4239], [4238, 4240, 4281], [4239, 4241], [4148, 4240, 4242], [4241, 4243], [4242, 4244, 4282], [4243, 4245], [4149, 4244, 4246], [4245, 4247], [4246, 4248, 4283], [4247, 4249], [4150, 4248, 4250], [4249, 4251], [4250, 4252, 4284], [4251, 4253], [4151, 4252, 4254], [4253, 4255], [4254, 4256, 4285], [4255, 4257], [4152, 4256, 4258], [4257, 4259], [4258, 4286], [4155, 4289], [4159, 4293], [4163, 4297], [4167, 4301], [4171, 4305], [4175, 4309], [4179, 4313], [4183, 4317], [4187, 4321], [4191, 4325], [4195, 4329], [4199, 4333], [4203, 4337], [4207, 4341], [4211, 4345], [4215, 4349], [4219, 4353], [4223, 4357], [4227, 4361], [4231, 4365], [4235, 4369], [4239, 4373], [4243, 4377], [4247, 4381], [4251, 4385], [4255, 4389], [4259, 4393], [4288, 4394], [4287, 4289], [4260, 4288, 4290], [4289, 4291], [4290, 4292, 4395], [4291, 4293], [4261, 4292, 4294], [4293, 4295], [4294, 4296, 4396], [4295, 4297], [4262, 4296, 4298], [4297, 4299], [4298, 4300, 4397], [4299, 4301], [4263, 4300, 4302], [4301, 4303], [4302, 4304, 4398], [4303, 4305], [4264, 4304, 4306], [4305, 4307], [4306, 4308, 4399], [4307, 4309], [4265, 4308, 4310], [4309, 4311], [4310, 4312, 4400], [4311, 4313], [4266, 4312, 4314], [4313, 4315], [4314, 4316, 4401], [4315, 4317], [4267, 4316, 4318], [4317, 4319], [4318, 4320, 4402], [4319, 4321], [4268, 4320, 4322], [4321, 4323], [4322, 4324, 4403], [4323, 4325], [4269, 4324, 4326], [4325, 4327], [4326, 4328, 4404], [4327, 4329], [4270, 4328, 4330], [4329, 4331], [4330, 4332, 4405], [4331, 4333], [4271, 4332, 4334], [4333, 4335], [4334, 4336, 4406], [4335, 4337], [4272, 4336, 4338], [4337, 4339], [4338, 4340, 4407], [4339, 4341], [4273, 4340, 4342], [4341, 4343], [4342, 4344, 4408], [4343, 4345], [4274, 4344, 4346], [4345, 4347], [4346, 4348, 4409], [4347, 4349], [4275, 4348, 4350], [4349, 4351], [4350, 4352, 4410], [4351, 4353], [4276, 4352, 4354], [4353, 4355], [4354, 4356, 4411], [4355, 4357], [4277, 4356, 4358], [4357, 4359], [4358, 4360, 4412], [4359, 4361], [4278, 4360, 4362], [4361, 4363], [4362, 4364, 4413], [4363, 4365], [4279, 4364, 4366], [4365, 4367], [4366, 4368, 4414], [4367, 4369], [4280, 4368, 4370], [4369, 4371], [4370, 4372, 4415], [4371, 4373], [4281, 4372, 4374], [4373, 4375], [4374, 4376, 4416], [4375, 4377], [4282, 4376, 4378], [4377, 4379], [4378, 4380, 4417], [4379, 4381], [4283, 4380, 4382], [4381, 4383], [4382, 4384, 4418], [4383, 4385], [4284, 4384, 4386], [4385, 4387], [4386, 4388, 4419], [4387, 4389], [4285, 4388, 4390], [4389, 4391], [4390, 4392, 4420], [4391, 4393], [4286, 4392], [4287, 4421], [4291, 4425], [4295, 4429], [4299, 4433], [4303, 4437], [4307, 4441], [4311, 4445], [4315, 4449], [4319, 4453], [4323, 4457], [4327, 4461], [4331, 4465], [4335, 4469], [4339, 4473], [4343, 4477], [4347, 4481], [4351, 4485], [4355, 4489], [4359, 4493], [4363, 4497], [4367, 4501], [4371, 4505], [4375, 4509], [4379, 4513], [4383, 4517], [4387, 4521], [4391, 4525], [4394, 4422], [4421, 4423], [4422, 4424, 4528], [4423, 4425], [4395, 4424, 4426], [4425, 4427], [4426, 4428, 4529], [4427, 4429], [4396, 4428, 4430], [4429, 4431], [4430, 4432, 4530], [4431, 4433], [4397, 4432, 4434], [4433, 4435], [4434, 4436, 4531], [4435, 4437], [4398, 4436, 4438], [4437, 4439], [4438, 4440, 4532], [4439, 4441], [4399, 4440, 4442], [4441, 4443], [4442, 4444, 4533], [4443, 4445], [4400, 4444, 4446], [4445, 4447], [4446, 4448, 4534], [4447, 4449], [4401, 4448, 4450], [4449, 4451], [4450, 4452, 4535], [4451, 4453], [4402, 4452, 4454], [4453, 4455], [4454, 4456, 4536], [4455, 4457], [4403, 4456, 4458], [4457, 4459], [4458, 4460, 4537], [4459, 4461], [4404, 4460, 4462], [4461, 4463], [4462, 4464, 4538], [4463, 4465], [4405, 4464, 4466], [4465, 4467], [4466, 4468, 4539], [4467, 4469], [4406, 4468, 4470], [4469, 4471], [4470, 4472, 4540], [4471, 4473], [4407, 4472, 4474], [4473, 4475], [4474, 4476, 4541], [4475, 4477], [4408, 4476, 4478], [4477, 4479], [4478, 4480, 4542], [4479, 4481], [4409, 4480, 4482], [4481, 4483], [4482, 4484, 4543], [4483, 4485], [4410, 4484, 4486], [4485, 4487], [4486, 4488, 4544], [4487, 4489], [4411, 4488, 4490], [4489, 4491], [4490, 4492, 4545], [4491, 4493], [4412, 4492, 4494], [4493, 4495], [4494, 4496, 4546], [4495, 4497], [4413, 4496, 4498], [4497, 4499], [4498, 4500, 4547], [4499, 4501], [4414, 4500, 4502], [4501, 4503], [4502, 4504, 4548], [4503, 4505], [4415, 4504, 4506], [4505, 4507], [4506, 4508, 4549], [4507, 4509], [4416, 4508, 4510], [4509, 4511], [4510, 4512, 4550], [4511, 4513], [4417, 4512, 4514], [4513, 4515], [4514, 4516, 4551], [4515, 4517], [4418, 4516, 4518], [4517, 4519], [4518, 4520, 4552], [4519, 4521], [4419, 4520, 4522], [4521, 4523], [4522, 4524, 4553], [4523, 4525], [4420, 4524, 4526], [4525, 4527], [4526, 4554], [4423, 4557], [4427, 4561], [4431, 4565], [4435, 4569], [4439, 4573], [4443, 4577], [4447, 4581], [4451, 4585], [4455, 4589], [4459, 4593], [4463, 4597], [4467, 4601], [4471, 4605], [4475, 4609], [4479, 4613], [4483, 4617], [4487, 4621], [4491, 4625], [4495, 4629], [4499, 4633], [4503, 4637], [4507, 4641], [4511, 4645], [4515, 4649], [4519, 4653], [4523, 4657], [4527, 4661], [4556, 4662], [4555, 4557], [4528, 4556, 4558], [4557, 4559], [4558, 4560, 4663], [4559, 4561], [4529, 4560, 4562], [4561, 4563], [4562, 4564, 4664], [4563, 4565], [4530, 4564, 4566], [4565, 4567], [4566, 4568, 4665], [4567, 4569], [4531, 4568, 4570], [4569, 4571], [4570, 4572, 4666], [4571, 4573], [4532, 4572, 4574], [4573, 4575], [4574, 4576, 4667], [4575, 4577], [4533, 4576, 4578], [4577, 4579], [4578, 4580, 4668], [4579, 4581], [4534, 4580, 4582], [4581, 4583], [4582, 4584, 4669], [4583, 4585], [4535, 4584, 4586], [4585, 4587], [4586, 4588, 4670], [4587, 4589], [4536, 4588, 4590], [4589, 4591], [4590, 4592, 4671], [4591, 4593], [4537, 4592, 4594], [4593, 4595], [4594, 4596, 4672], [4595, 4597], [4538, 4596, 4598], [4597, 4599], [4598, 4600, 4673], [4599, 4601], [4539, 4600, 4602], [4601, 4603], [4602, 4604, 4674], [4603, 4605], [4540, 4604, 4606], [4605, 4607], [4606, 4608, 4675], [4607, 4609], [4541, 4608, 4610], [4609, 4611], [4610, 4612, 4676], [4611, 4613], [4542, 4612, 4614], [4613, 4615], [4614, 4616, 4677], [4615, 4617], [4543, 4616, 4618], [4617, 4619], [4618, 4620, 4678], [4619, 4621], [4544, 4620, 4622], [4621, 4623], [4622, 4624, 4679], [4623, 4625], [4545, 4624, 4626], [4625, 4627], [4626, 4628, 4680], [4627, 4629], [4546, 4628, 4630], [4629, 4631], [4630, 4632, 4681], [4631, 4633], [4547, 4632, 4634], [4633, 4635], [4634, 4636, 4682], [4635, 4637], [4548, 4636, 4638], [4637, 4639], [4638, 4640, 4683], [4639, 4641], [4549, 4640, 4642], [4641, 4643], [4642, 4644, 4684], [4643, 4645], [4550, 4644, 4646], [4645, 4647], [4646, 4648, 4685], [4647, 4649], [4551, 4648, 4650], [4649, 4651], [4650, 4652, 4686], [4651, 4653], [4552, 4652, 4654], [4653, 4655], [4654, 4656, 4687], [4655, 4657], [4553, 4656, 4658], [4657, 4659], [4658, 4660, 4688], [4659, 4661], [4554, 4660], [4555, 4689], [4559, 4693], [4563, 4697], [4567, 4701], [4571, 4705], [4575, 4709], [4579, 4713], [4583, 4717], [4587, 4721], [4591, 4725], [4595, 4729], [4599, 4733], [4603, 4737], [4607, 4741], [4611, 4745], [4615, 4749], [4619, 4753], [4623, 4757], [4627, 4761], [4631, 4765], [4635, 4769], [4639, 4773], [4643, 4777], [4647, 4781], [4651, 4785], [4655, 4789], [4659, 4793], [4662, 4690], [4689, 4691], [4690, 4692, 4796], [4691, 4693], [4663, 4692, 4694], [4693, 4695], [4694, 4696, 4797], [4695, 4697], [4664, 4696, 4698], [4697, 4699], [4698, 4700, 4798], [4699, 4701], [4665, 4700, 4702], [4701, 4703], [4702, 4704, 4799], [4703, 4705], [4666, 4704, 4706], [4705, 4707], [4706, 4708, 4800], [4707, 4709], [4667, 4708, 4710], [4709, 4711], [4710, 4712, 4801], [4711, 4713], [4668, 4712, 4714], [4713, 4715], [4714, 4716, 4802], [4715, 4717], [4669, 4716, 4718], [4717, 4719], [4718, 4720, 4803], [4719, 4721], [4670, 4720, 4722], [4721, 4723], [4722, 4724, 4804], [4723, 4725], [4671, 4724, 4726], [4725, 4727], [4726, 4728, 4805], [4727, 4729], [4672, 4728, 4730], [4729, 4731], [4730, 4732, 4806], [4731, 4733], [4673, 4732, 4734], [4733, 4735], [4734, 4736, 4807], [4735, 4737], [4674, 4736, 4738], [4737, 4739], [4738, 4740, 4808], [4739, 4741], [4675, 4740, 4742], [4741, 4743], [4742, 4744, 4809], [4743, 4745], [4676, 4744, 4746], [4745, 4747], [4746, 4748, 4810], [4747, 4749], [4677, 4748, 4750], [4749, 4751], [4750, 4752, 4811], [4751, 4753], [4678, 4752, 4754], [4753, 4755], [4754, 4756, 4812], [4755, 4757], [4679, 4756, 4758], [4757, 4759], [4758, 4760, 4813], [4759, 4761], [4680, 4760, 4762], [4761, 4763], [4762, 4764, 4814], [4763, 4765], [4681, 4764, 4766], [4765, 4767], [4766, 4768, 4815], [4767, 4769], [4682, 4768, 4770], [4769, 4771], [4770, 4772, 4816], [4771, 4773], [4683, 4772, 4774], [4773, 4775], [4774, 4776, 4817], [4775, 4777], [4684, 4776, 4778], [4777, 4779], [4778, 4780, 4818], [4779, 4781], [4685, 4780, 4782], [4781, 4783], [4782, 4784, 4819], [4783, 4785], [4686, 4784, 4786], [4785, 4787], [4786, 4788, 4820], [4787, 4789], [4687, 4788, 4790], [4789, 4791], [4790, 4792, 4821], [4791, 4793], [4688, 4792, 4794], [4793, 4795], [4794, 4822], [4691, 4825], [4695, 4829], [4699, 4833], [4703, 4837], [4707, 4841], [4711, 4845], [4715, 4849], [4719, 4853], [4723, 4857], [4727, 4861], [4731, 4865], [4735, 4869], [4739, 4873], [4743, 4877], [4747, 4881], [4751, 4885], [4755, 4889], [4759, 4893], [4763, 4897], [4767, 4901], [4771, 4905], [4775, 4909], [4779, 4913], [4783, 4917], [4787, 4921], [4791, 4925], [4795, 4929], [4824, 4930], [4823, 4825], [4796, 4824, 4826], [4825, 4827], [4826, 4828, 4931], [4827, 4829], [4797, 4828, 4830], [4829, 4831], [4830, 4832, 4932], [4831, 4833], [4798, 4832, 4834], [4833, 4835], [4834, 4836, 4933], [4835, 4837], [4799, 4836, 4838], [4837, 4839], [4838, 4840, 4934], [4839, 4841], [4800, 4840, 4842], [4841, 4843], [4842, 4844, 4935], [4843, 4845], [4801, 4844, 4846], [4845, 4847], [4846, 4848, 4936], [4847, 4849], [4802, 4848, 4850], [4849, 4851], [4850, 4852, 4937], [4851, 4853], [4803, 4852, 4854], [4853, 4855], [4854, 4856, 4938], [4855, 4857], [4804, 4856, 4858], [4857, 4859], [4858, 4860, 4939], [4859, 4861], [4805, 4860, 4862], [4861, 4863], [4862, 4864, 4940], [4863, 4865], [4806, 4864, 4866], [4865, 4867], [4866, 4868, 4941], [4867, 4869], [4807, 4868, 4870], [4869, 4871], [4870, 4872, 4942], [4871, 4873], [4808, 4872, 4874], [4873, 4875], [4874, 4876, 4943], [4875, 4877], [4809, 4876, 4878], [4877, 4879], [4878, 4880, 4944], [4879, 4881], [4810, 4880, 4882], [4881, 4883], [4882, 4884, 4945], [4883, 4885], [4811, 4884, 4886], [4885, 4887], [4886, 4888, 4946], [4887, 4889], [4812, 4888, 4890], [4889, 4891], [4890, 4892, 4947], [4891, 4893], [4813, 4892, 4894], [4893, 4895], [4894, 4896, 4948], [4895, 4897], [4814, 4896, 4898], [4897, 4899], [4898, 4900, 4949], [4899, 4901], [4815, 4900, 4902], [4901, 4903], [4902, 4904, 4950], [4903, 4905], [4816, 4904, 4906], [4905, 4907], [4906, 4908, 4951], [4907, 4909], [4817, 4908, 4910], [4909, 4911], [4910, 4912, 4952], [4911, 4913], [4818, 4912, 4914], [4913, 4915], [4914, 4916, 4953], [4915, 4917], [4819, 4916, 4918], [4917, 4919], [4918, 4920, 4954], [4919, 4921], [4820, 4920, 4922], [4921, 4923], [4922, 4924, 4955], [4923, 4925], [4821, 4924, 4926], [4925, 4927], [4926, 4928, 4956], [4927, 4929], [4822, 4928], [4823, 4957], [4827, 4961], [4831, 4965], [4835, 4969], [4839, 4973], [4843, 4977], [4847, 4981], [4851, 4985], [4855, 4989], [4859, 4993], [4863, 4997], [4867, 5001], [4871, 5005], [4875, 5009], [4879, 5013], [4883, 5017], [4887, 5021], [4891, 5025], [4895, 5029], [4899, 5033], [4903, 5037], [4907, 5041], [4911, 5045], [4915, 5049], [4919, 5053], [4923, 5057], [4927, 5061], [4930, 4958], [4957, 4959], [4958, 4960, 5064], [4959, 4961], [4931, 4960, 4962], [4961, 4963], [4962, 4964, 5065], [4963, 4965], [4932, 4964, 4966], [4965, 4967], [4966, 4968, 5066], [4967, 4969], [4933, 4968, 4970], [4969, 4971], [4970, 4972, 5067], [4971, 4973], [4934, 4972, 4974], [4973, 4975], [4974, 4976, 5068], [4975, 4977], [4935, 4976, 4978], [4977, 4979], [4978, 4980, 5069], [4979, 4981], [4936, 4980, 4982], [4981, 4983], [4982, 4984, 5070], [4983, 4985], [4937, 4984, 4986], [4985, 4987], [4986, 4988, 5071], [4987, 4989], [4938, 4988, 4990], [4989, 4991], [4990, 4992, 5072], [4991, 4993], [4939, 4992, 4994], [4993, 4995], [4994, 4996, 5073], [4995, 4997], [4940, 4996, 4998], [4997, 4999], [4998, 5000, 5074], [4999, 5001], [4941, 5000, 5002], [5001, 5003], [5002, 5004, 5075], [5003, 5005], [4942, 5004, 5006], [5005, 5007], [5006, 5008, 5076], [5007, 5009], [4943, 5008, 5010], [5009, 5011], [5010, 5012, 5077], [5011, 5013], [4944, 5012, 5014], [5013, 5015], [5014, 5016, 5078], [5015, 5017], [4945, 5016, 5018], [5017, 5019], [5018, 5020, 5079], [5019, 5021], [4946, 5020, 5022], [5021, 5023], [5022, 5024, 5080], [5023, 5025], [4947, 5024, 5026], [5025, 5027], [5026, 5028, 5081], [5027, 5029], [4948, 5028, 5030], [5029, 5031], [5030, 5032, 5082], [5031, 5033], [4949, 5032, 5034], [5033, 5035], [5034, 5036, 5083], [5035, 5037], [4950, 5036, 5038], [5037, 5039], [5038, 5040, 5084], [5039, 5041], [4951, 5040, 5042], [5041, 5043], [5042, 5044, 5085], [5043, 5045], [4952, 5044, 5046], [5045, 5047], [5046, 5048, 5086], [5047, 5049], [4953, 5048, 5050], [5049, 5051], [5050, 5052, 5087], [5051, 5053], [4954, 5052, 5054], [5053, 5055], [5054, 5056, 5088], [5055, 5057], [4955, 5056, 5058], [5057, 5059], [5058, 5060, 5089], [5059, 5061], [4956, 5060, 5062], [5061, 5063], [5062, 5090], [4959, 5093], [4963, 5097], [4967, 5101], [4971, 5105], [4975, 5109], [4979, 5113], [4983, 5117], [4987, 5121], [4991, 5125], [4995, 5129], [4999, 5133], [5003, 5137], [5007, 5141], [5011, 5145], [5015, 5149], [5019, 5153], [5023, 5157], [5027, 5161], [5031, 5165], [5035, 5169], [5039, 5173], [5043, 5177], [5047, 5181], [5051, 5185], [5055, 5189], [5059, 5193], [5063, 5197], [5092, 5198], [5091, 5093], [5064, 5092, 5094], [5093, 5095], [5094, 5096, 5199], [5095, 5097], [5065, 5096, 5098], [5097, 5099], [5098, 5100, 5200], [5099, 5101], [5066, 5100, 5102], [5101, 5103], [5102, 5104, 5201], [5103, 5105], [5067, 5104, 5106], [5105, 5107], [5106, 5108, 5202], [5107, 5109], [5068, 5108, 5110], [5109, 5111], [5110, 5112, 5203], [5111, 5113], [5069, 5112, 5114], [5113, 5115], [5114, 5116, 5204], [5115, 5117], [5070, 5116, 5118], [5117, 5119], [5118, 5120, 5205], [5119, 5121], [5071, 5120, 5122], [5121, 5123], [5122, 5124, 5206], [5123, 5125], [5072, 5124, 5126], [5125, 5127], [5126, 5128, 5207], [5127, 5129], [5073, 5128, 5130], [5129, 5131], [5130, 5132, 5208], [5131, 5133], [5074, 5132, 5134], [5133, 5135], [5134, 5136, 5209], [5135, 5137], [5075, 5136, 5138], [5137, 5139], [5138, 5140, 5210], [5139, 5141], [5076, 5140, 5142], [5141, 5143], [5142, 5144, 5211], [5143, 5145], [5077, 5144, 5146], [5145, 5147], [5146, 5148, 5212], [5147, 5149], [5078, 5148, 5150], [5149, 5151], [5150, 5152, 5213], [5151, 5153], [5079, 5152, 5154], [5153, 5155], [5154, 5156, 5214], [5155, 5157], [5080, 5156, 5158], [5157, 5159], [5158, 5160, 5215], [5159, 5161], [5081, 5160, 5162], [5161, 5163], [5162, 5164, 5216], [5163, 5165], [5082, 5164, 5166], [5165, 5167], [5166, 5168, 5217], [5167, 5169], [5083, 5168, 5170], [5169, 5171], [5170, 5172, 5218], [5171, 5173], [5084, 5172, 5174], [5173, 5175], [5174, 5176, 5219], [5175, 5177], [5085, 5176, 5178], [5177, 5179], [5178, 5180, 5220], [5179, 5181], [5086, 5180, 5182], [5181, 5183], [5182, 5184, 5221], [5183, 5185], [5087, 5184, 5186], [5185, 5187], [5186, 5188, 5222], [5187, 5189], [5088, 5188, 5190], [5189, 5191], [5190, 5192, 5223], [5191, 5193], [5089, 5192, 5194], [5193, 5195], [5194, 5196, 5224], [5195, 5197], [5090, 5196], [5091, 5225], [5095, 5229], [5099, 5233], [5103, 5237], [5107, 5241], [5111, 5245], [5115, 5249], [5119, 5253], [5123, 5257], [5127, 5261], [5131, 5265], [5135, 5269], [5139, 5273], [5143, 5277], [5147, 5281], [5151, 5285], [5155, 5289], [5159, 5293], [5163, 5297], [5167, 5301], [5171, 5305], [5175, 5309], [5179, 5313], [5183, 5317], [5187, 5321], [5191, 5325], [5195, 5329], [5198, 5226], [5225, 5227], [5226, 5228, 5332], [5227, 5229], [5199, 5228, 5230], [5229, 5231], [5230, 5232, 5333], [5231, 5233], [5200, 5232, 5234], [5233, 5235], [5234, 5236, 5334], [5235, 5237], [5201, 5236, 5238], [5237, 5239], [5238, 5240, 5335], [5239, 5241], [5202, 5240, 5242], [5241, 5243], [5242, 5244, 5336], [5243, 5245], [5203, 5244, 5246], [5245, 5247], [5246, 5248, 5337], [5247, 5249], [5204, 5248, 5250], [5249, 5251], [5250, 5252, 5338], [5251, 5253], [5205, 5252, 5254], [5253, 5255], [5254, 5256, 5339], [5255, 5257], [5206, 5256, 5258], [5257, 5259], [5258, 5260, 5340], [5259, 5261], [5207, 5260, 5262], [5261, 5263], [5262, 5264, 5341], [5263, 5265], [5208, 5264, 5266], [5265, 5267], [5266, 5268, 5342], [5267, 5269], [5209, 5268, 5270], [5269, 5271], [5270, 5272, 5343], [5271, 5273], [5210, 5272, 5274], [5273, 5275], [5274, 5276, 5344], [5275, 5277], [5211, 5276, 5278], [5277, 5279], [5278, 5280, 5345], [5279, 5281], [5212, 5280, 5282], [5281, 5283], [5282, 5284, 5346], [5283, 5285], [5213, 5284, 5286], [5285, 5287], [5286, 5288, 5347], [5287, 5289], [5214, 5288, 5290], [5289, 5291], [5290, 5292, 5348], [5291, 5293], [5215, 5292, 5294], [5293, 5295], [5294, 5296, 5349], [5295, 5297], [5216, 5296, 5298], [5297, 5299], [5298, 5300, 5350], [5299, 5301], [5217, 5300, 5302], [5301, 5303], [5302, 5304, 5351], [5303, 5305], [5218, 5304, 5306], [5305, 5307], [5306, 5308, 5352], [5307, 5309], [5219, 5308, 5310], [5309, 5311], [5310, 5312, 5353], [5311, 5313], [5220, 5312, 5314], [5313, 5315], [5314, 5316, 5354], [5315, 5317], [5221, 5316, 5318], [5317, 5319], [5318, 5320, 5355], [5319, 5321], [5222, 5320, 5322], [5321, 5323], [5322, 5324, 5356], [5323, 5325], [5223, 5324, 5326], [5325, 5327], [5326, 5328, 5357], [5327, 5329], [5224, 5328, 5330], [5329, 5331], [5330, 5358], [5227, 5361], [5231, 5365], [5235, 5369], [5239, 5373], [5243, 5377], [5247, 5381], [5251, 5385], [5255, 5389], [5259, 5393], [5263, 5397], [5267, 5401], [5271, 5405], [5275, 5409], [5279, 5413], [5283, 5417], [5287, 5421], [5291, 5425], [5295, 5429], [5299, 5433], [5303, 5437], [5307, 5441], [5311, 5445], [5315, 5449], [5319, 5453], [5323, 5457], [5327, 5461], [5331, 5465], [5360, 5466], [5359, 5361], [5332, 5360, 5362], [5361, 5363], [5362, 5364, 5467], [5363, 5365], [5333, 5364, 5366], [5365, 5367], [5366, 5368, 5468], [5367, 5369], [5334, 5368, 5370], [5369, 5371], [5370, 5372, 5469], [5371, 5373], [5335, 5372, 5374], [5373, 5375], [5374, 5376, 5470], [5375, 5377], [5336, 5376, 5378], [5377, 5379], [5378, 5380, 5471], [5379, 5381], [5337, 5380, 5382], [5381, 5383], [5382, 5384, 5472], [5383, 5385], [5338, 5384, 5386], [5385, 5387], [5386, 5388, 5473], [5387, 5389], [5339, 5388, 5390], [5389, 5391], [5390, 5392, 5474], [5391, 5393], [5340, 5392, 5394], [5393, 5395], [5394, 5396, 5475], [5395, 5397], [5341, 5396, 5398], [5397, 5399], [5398, 5400, 5476], [5399, 5401], [5342, 5400, 5402], [5401, 5403], [5402, 5404, 5477], [5403, 5405], [5343, 5404, 5406], [5405, 5407], [5406, 5408, 5478], [5407, 5409], [5344, 5408, 5410], [5409, 5411], [5410, 5412, 5479], [5411, 5413], [5345, 5412, 5414], [5413, 5415], [5414, 5416, 5480], [5415, 5417], [5346, 5416, 5418], [5417, 5419], [5418, 5420, 5481], [5419, 5421], [5347, 5420, 5422], [5421, 5423], [5422, 5424, 5482], [5423, 5425], [5348, 5424, 5426], [5425, 5427], [5426, 5428, 5483], [5427, 5429], [5349, 5428, 5430], [5429, 5431], [5430, 5432, 5484], [5431, 5433], [5350, 5432, 5434], [5433, 5435], [5434, 5436, 5485], [5435, 5437], [5351, 5436, 5438], [5437, 5439], [5438, 5440, 5486], [5439, 5441], [5352, 5440, 5442], [5441, 5443], [5442, 5444, 5487], [5443, 5445], [5353, 5444, 5446], [5445, 5447], [5446, 5448, 5488], [5447, 5449], [5354, 5448, 5450], [5449, 5451], [5450, 5452, 5489], [5451, 5453], [5355, 5452, 5454], [5453, 5455], [5454, 5456, 5490], [5455, 5457], [5356, 5456, 5458], [5457, 5459], [5458, 5460, 5491], [5459, 5461], [5357, 5460, 5462], [5461, 5463], [5462, 5464, 5492], [5463, 5465], [5358, 5464], [5359, 5493], [5363, 5497], [5367, 5501], [5371, 5505], [5375, 5509], [5379, 5513], [5383, 5517], [5387, 5521], [5391, 5525], [5395, 5529], [5399, 5533], [5403, 5537], [5407, 5541], [5411, 5545], [5415, 5549], [5419, 5553], [5423, 5557], [5427, 5561], [5431, 5565], [5435, 5569], [5439, 5573], [5443, 5577], [5447, 5581], [5451, 5585], [5455, 5589], [5459, 5593], [5463, 5597], [5466, 5494], [5493, 5495], [5494, 5496, 5600], [5495, 5497], [5467, 5496, 5498], [5497, 5499], [5498, 5500, 5601], [5499, 5501], [5468, 5500, 5502], [5501, 5503], [5502, 5504, 5602], [5503, 5505], [5469, 5504, 5506], [5505, 5507], [5506, 5508, 5603], [5507, 5509], [5470, 5508, 5510], [5509, 5511], [5510, 5512, 5604], [5511, 5513], [5471, 5512, 5514], [5513, 5515], [5514, 5516, 5605], [5515, 5517], [5472, 5516, 5518], [5517, 5519], [5518, 5520, 5606], [5519, 5521], [5473, 5520, 5522], [5521, 5523], [5522, 5524, 5607], [5523, 5525], [5474, 5524, 5526], [5525, 5527], [5526, 5528, 5608], [5527, 5529], [5475, 5528, 5530], [5529, 5531], [5530, 5532, 5609], [5531, 5533], [5476, 5532, 5534], [5533, 5535], [5534, 5536, 5610], [5535, 5537], [5477, 5536, 5538], [5537, 5539], [5538, 5540, 5611], [5539, 5541], [5478, 5540, 5542], [5541, 5543], [5542, 5544, 5612], [5543, 5545], [5479, 5544, 5546], [5545, 5547], [5546, 5548, 5613], [5547, 5549], [5480, 5548, 5550], [5549, 5551], [5550, 5552, 5614], [5551, 5553], [5481, 5552, 5554], [5553, 5555], [5554, 5556, 5615], [5555, 5557], [5482, 5556, 5558], [5557, 5559], [5558, 5560, 5616], [5559, 5561], [5483, 5560, 5562], [5561, 5563], [5562, 5564, 5617], [5563, 5565], [5484, 5564, 5566], [5565, 5567], [5566, 5568, 5618], [5567, 5569], [5485, 5568, 5570], [5569, 5571], [5570, 5572, 5619], [5571, 5573], [5486, 5572, 5574], [5573, 5575], [5574, 5576, 5620], [5575, 5577], [5487, 5576, 5578], [5577, 5579], [5578, 5580, 5621], [5579, 5581], [5488, 5580, 5582], [5581, 5583], [5582, 5584, 5622], [5583, 5585], [5489, 5584, 5586], [5585, 5587], [5586, 5588, 5623], [5587, 5589], [5490, 5588, 5590], [5589, 5591], [5590, 5592, 5624], [5591, 5593], [5491, 5592, 5594], [5593, 5595], [5594, 5596, 5625], [5595, 5597], [5492, 5596, 5598], [5597, 5599], [5598, 5626], [5495, 5629], [5499, 5633], [5503, 5637], [5507, 5641], [5511, 5645], [5515, 5649], [5519, 5653], [5523, 5657], [5527, 5661], [5531, 5665], [5535, 5669], [5539, 5673], [5543, 5677], [5547, 5681], [5551, 5685], [5555, 5689], [5559, 5693], [5563, 5697], [5567, 5701], [5571, 5705], [5575, 5709], [5579, 5713], [5583, 5717], [5587, 5721], [5591, 5725], [5595, 5729], [5599, 5733], [5628, 5734], [5627, 5629], [5600, 5628, 5630], [5629, 5631], [5630, 5632, 5735], [5631, 5633], [5601, 5632, 5634], [5633, 5635], [5634, 5636, 5736], [5635, 5637], [5602, 5636, 5638], [5637, 5639], [5638, 5640, 5737], [5639, 5641], [5603, 5640, 5642], [5641, 5643], [5642, 5644, 5738], [5643, 5645], [5604, 5644, 5646], [5645, 5647], [5646, 5648, 5739], [5647, 5649], [5605, 5648, 5650], [5649, 5651], [5650, 5652, 5740], [5651, 5653], [5606, 5652, 5654], [5653, 5655], [5654, 5656, 5741], [5655, 5657], [5607, 5656, 5658], [5657, 5659], [5658, 5660, 5742], [5659, 5661], [5608, 5660, 5662], [5661, 5663], [5662, 5664, 5743], [5663, 5665], [5609, 5664, 5666], [5665, 5667], [5666, 5668, 5744], [5667, 5669], [5610, 5668, 5670], [5669, 5671], [5670, 5672, 5745], [5671, 5673], [5611, 5672, 5674], [5673, 5675], [5674, 5676, 5746], [5675, 5677], [5612, 5676, 5678], [5677, 5679], [5678, 5680, 5747], [5679, 5681], [5613, 5680, 5682], [5681, 5683], [5682, 5684, 5748], [5683, 5685], [5614, 5684, 5686], [5685, 5687], [5686, 5688, 5749], [5687, 5689], [5615, 5688, 5690], [5689, 5691], [5690, 5692, 5750], [5691, 5693], [5616, 5692, 5694], [5693, 5695], [5694, 5696, 5751], [5695, 5697], [5617, 5696, 5698], [5697, 5699], [5698, 5700, 5752], [5699, 5701], [5618, 5700, 5702], [5701, 5703], [5702, 5704, 5753], [5703, 5705], [5619, 5704, 5706], [5705, 5707], [5706, 5708, 5754], [5707, 5709], [5620, 5708, 5710], [5709, 5711], [5710, 5712, 5755], [5711, 5713], [5621, 5712, 5714], [5713, 5715], [5714, 5716, 5756], [5715, 5717], [5622, 5716, 5718], [5717, 5719], [5718, 5720, 5757], [5719, 5721], [5623, 5720, 5722], [5721, 5723], [5722, 5724, 5758], [5723, 5725], [5624, 5724, 5726], [5725, 5727], [5726, 5728, 5759], [5727, 5729], [5625, 5728, 5730], [5729, 5731], [5730, 5732, 5760], [5731, 5733], [5626, 5732], [5627, 5761], [5631, 5765], [5635, 5769], [5639, 5773], [5643, 5777], [5647, 5781], [5651, 5785], [5655, 5789], [5659, 5793], [5663, 5797], [5667, 5801], [5671, 5805], [5675, 5809], [5679, 5813], [5683, 5817], [5687, 5821], [5691, 5825], [5695, 5829], [5699, 5833], [5703, 5837], [5707, 5841], [5711, 5845], [5715, 5849], [5719, 5853], [5723, 5857], [5727, 5861], [5731, 5865], [5734, 5762], [5761, 5763], [5762, 5764, 5868], [5763, 5765], [5735, 5764, 5766], [5765, 5767], [5766, 5768, 5869], [5767, 5769], [5736, 5768, 5770], [5769, 5771], [5770, 5772, 5870], [5771, 5773], [5737, 5772, 5774], [5773, 5775], [5774, 5776, 5871], [5775, 5777], [5738, 5776, 5778], [5777, 5779], [5778, 5780, 5872], [5779, 5781], [5739, 5780, 5782], [5781, 5783], [5782, 5784, 5873], [5783, 5785], [5740, 5784, 5786], [5785, 5787], [5786, 5788, 5874], [5787, 5789], [5741, 5788, 5790], [5789, 5791], [5790, 5792, 5875], [5791, 5793], [5742, 5792, 5794], [5793, 5795], [5794, 5796, 5876], [5795, 5797], [5743, 5796, 5798], [5797, 5799], [5798, 5800, 5877], [5799, 5801], [5744, 5800, 5802], [5801, 5803], [5802, 5804, 5878], [5803, 5805], [5745, 5804, 5806], [5805, 5807], [5806, 5808, 5879], [5807, 5809], [5746, 5808, 5810], [5809, 5811], [5810, 5812, 5880], [5811, 5813], [5747, 5812, 5814], [5813, 5815], [5814, 5816, 5881], [5815, 5817], [5748, 5816, 5818], [5817, 5819], [5818, 5820, 5882], [5819, 5821], [5749, 5820, 5822], [5821, 5823], [5822, 5824, 5883], [5823, 5825], [5750, 5824, 5826], [5825, 5827], [5826, 5828, 5884], [5827, 5829], [5751, 5828, 5830], [5829, 5831], [5830, 5832, 5885], [5831, 5833], [5752, 5832, 5834], [5833, 5835], [5834, 5836, 5886], [5835, 5837], [5753, 5836, 5838], [5837, 5839], [5838, 5840, 5887], [5839, 5841], [5754, 5840, 5842], [5841, 5843], [5842, 5844, 5888], [5843, 5845], [5755, 5844, 5846], [5845, 5847], [5846, 5848, 5889], [5847, 5849], [5756, 5848, 5850], [5849, 5851], [5850, 5852, 5890], [5851, 5853], [5757, 5852, 5854], [5853, 5855], [5854, 5856, 5891], [5855, 5857], [5758, 5856, 5858], [5857, 5859], [5858, 5860, 5892], [5859, 5861], [5759, 5860, 5862], [5861, 5863], [5862, 5864, 5893], [5863, 5865], [5760, 5864, 5866], [5865, 5867], [5866, 5894], [5763, 5897], [5767, 5901], [5771, 5905], [5775, 5909], [5779, 5913], [5783, 5917], [5787, 5921], [5791, 5925], [5795, 5929], [5799, 5933], [5803, 5937], [5807, 5941], [5811, 5945], [5815, 5949], [5819, 5953], [5823, 5957], [5827, 5961], [5831, 5965], [5835, 5969], [5839, 5973], [5843, 5977], [5847, 5981], [5851, 5985], [5855, 5989], [5859, 5993], [5863, 5997], [5867, 6001], [5896, 6002], [5895, 5897], [5868, 5896, 5898], [5897, 5899], [5898, 5900, 6003], [5899, 5901], [5869, 5900, 5902], [5901, 5903], [5902, 5904, 6004], [5903, 5905], [5870, 5904, 5906], [5905, 5907], [5906, 5908, 6005], [5907, 5909], [5871, 5908, 5910], [5909, 5911], [5910, 5912, 6006], [5911, 5913], [5872, 5912, 5914], [5913, 5915], [5914, 5916, 6007], [5915, 5917], [5873, 5916, 5918], [5917, 5919], [5918, 5920, 6008], [5919, 5921], [5874, 5920, 5922], [5921, 5923], [5922, 5924, 6009], [5923, 5925], [5875, 5924, 5926], [5925, 5927], [5926, 5928, 6010], [5927, 5929], [5876, 5928, 5930], [5929, 5931], [5930, 5932, 6011], [5931, 5933], [5877, 5932, 5934], [5933, 5935], [5934, 5936, 6012], [5935, 5937], [5878, 5936, 5938], [5937, 5939], [5938, 5940, 6013], [5939, 5941], [5879, 5940, 5942], [5941, 5943], [5942, 5944, 6014], [5943, 5945], [5880, 5944, 5946], [5945, 5947], [5946, 5948, 6015], [5947, 5949], [5881, 5948, 5950], [5949, 5951], [5950, 5952, 6016], [5951, 5953], [5882, 5952, 5954], [5953, 5955], [5954, 5956, 6017], [5955, 5957], [5883, 5956, 5958], [5957, 5959], [5958, 5960, 6018], [5959, 5961], [5884, 5960, 5962], [5961, 5963], [5962, 5964, 6019], [5963, 5965], [5885, 5964, 5966], [5965, 5967], [5966, 5968, 6020], [5967, 5969], [5886, 5968, 5970], [5969, 5971], [5970, 5972, 6021], [5971, 5973], [5887, 5972, 5974], [5973, 5975], [5974, 5976, 6022], [5975, 5977], [5888, 5976, 5978], [5977, 5979], [5978, 5980, 6023], [5979, 5981], [5889, 5980, 5982], [5981, 5983], [5982, 5984, 6024], [5983, 5985], [5890, 5984, 5986], [5985, 5987], [5986, 5988, 6025], [5987, 5989], [5891, 5988, 5990], [5989, 5991], [5990, 5992, 6026], [5991, 5993], [5892, 5992, 5994], [5993, 5995], [5994, 5996, 6027], [5995, 5997], [5893, 5996, 5998], [5997, 5999], [5998, 6000, 6028], [5999, 6001], [5894, 6000], [5895, 6029], [5899, 6033], [5903, 6037], [5907, 6041], [5911, 6045], [5915, 6049], [5919, 6053], [5923, 6057], [5927, 6061], [5931, 6065], [5935, 6069], [5939, 6073], [5943, 6077], [5947, 6081], [5951, 6085], [5955, 6089], [5959, 6093], [5963, 6097], [5967, 6101], [5971, 6105], [5975, 6109], [5979, 6113], [5983, 6117], [5987, 6121], [5991, 6125], [5995, 6129], [5999, 6133], [6002, 6030], [6029, 6031], [6030, 6032, 6136], [6031, 6033], [6003, 6032, 6034], [6033, 6035], [6034, 6036, 6137], [6035, 6037], [6004, 6036, 6038], [6037, 6039], [6038, 6040, 6138], [6039, 6041], [6005, 6040, 6042], [6041, 6043], [6042, 6044, 6139], [6043, 6045], [6006, 6044, 6046], [6045, 6047], [6046, 6048, 6140], [6047, 6049], [6007, 6048, 6050], [6049, 6051], [6050, 6052, 6141], [6051, 6053], [6008, 6052, 6054], [6053, 6055], [6054, 6056, 6142], [6055, 6057], [6009, 6056, 6058], [6057, 6059], [6058, 6060, 6143], [6059, 6061], [6010, 6060, 6062], [6061, 6063], [6062, 6064, 6144], [6063, 6065], [6011, 6064, 6066], [6065, 6067], [6066, 6068, 6145], [6067, 6069], [6012, 6068, 6070], [6069, 6071], [6070, 6072, 6146], [6071, 6073], [6013, 6072, 6074], [6073, 6075], [6074, 6076, 6147], [6075, 6077], [6014, 6076, 6078], [6077, 6079], [6078, 6080, 6148], [6079, 6081], [6015, 6080, 6082], [6081, 6083], [6082, 6084, 6149], [6083, 6085], [6016, 6084, 6086], [6085, 6087], [6086, 6088, 6150], [6087, 6089], [6017, 6088, 6090], [6089, 6091], [6090, 6092, 6151], [6091, 6093], [6018, 6092, 6094], [6093, 6095], [6094, 6096, 6152], [6095, 6097], [6019, 6096, 6098], [6097, 6099], [6098, 6100, 6153], [6099, 6101], [6020, 6100, 6102], [6101, 6103], [6102, 6104, 6154], [6103, 6105], [6021, 6104, 6106], [6105, 6107], [6106, 6108, 6155], [6107, 6109], [6022, 6108, 6110], [6109, 6111], [6110, 6112, 6156], [6111, 6113], [6023, 6112, 6114], [6113, 6115], [6114, 6116, 6157], [6115, 6117], [6024, 6116, 6118], [6117, 6119], [6118, 6120, 6158], [6119, 6121], [6025, 6120, 6122], [6121, 6123], [6122, 6124, 6159], [6123, 6125], [6026, 6124, 6126], [6125, 6127], [6126, 6128, 6160], [6127, 6129], [6027, 6128, 6130], [6129, 6131], [6130, 6132, 6161], [6131, 6133], [6028, 6132, 6134], [6133, 6135], [6134, 6162], [6031, 6165], [6035, 6169], [6039, 6173], [6043, 6177], [6047, 6181], [6051, 6185], [6055, 6189], [6059, 6193], [6063, 6197], [6067, 6201], [6071, 6205], [6075, 6209], [6079, 6213], [6083, 6217], [6087, 6221], [6091, 6225], [6095, 6229], [6099, 6233], [6103, 6237], [6107, 6241], [6111, 6245], [6115, 6249], [6119, 6253], [6123, 6257], [6127, 6261], [6131, 6265], [6135, 6269], [6164, 6270], [6163, 6165], [6136, 6164, 6166], [6165, 6167], [6166, 6168, 6271], [6167, 6169], [6137, 6168, 6170], [6169, 6171], [6170, 6172, 6272], [6171, 6173], [6138, 6172, 6174], [6173, 6175], [6174, 6176, 6273], [6175, 6177], [6139, 6176, 6178], [6177, 6179], [6178, 6180, 6274], [6179, 6181], [6140, 6180, 6182], [6181, 6183], [6182, 6184, 6275], [6183, 6185], [6141, 6184, 6186], [6185, 6187], [6186, 6188, 6276], [6187, 6189], [6142, 6188, 6190], [6189, 6191], [6190, 6192, 6277], [6191, 6193], [6143, 6192, 6194], [6193, 6195], [6194, 6196, 6278], [6195, 6197], [6144, 6196, 6198], [6197, 6199], [6198, 6200, 6279], [6199, 6201], [6145, 6200, 6202], [6201, 6203], [6202, 6204, 6280], [6203, 6205], [6146, 6204, 6206], [6205, 6207], [6206, 6208, 6281], [6207, 6209], [6147, 6208, 6210], [6209, 6211], [6210, 6212, 6282], [6211, 6213], [6148, 6212, 6214], [6213, 6215], [6214, 6216, 6283], [6215, 6217], [6149, 6216, 6218], [6217, 6219], [6218, 6220, 6284], [6219, 6221], [6150, 6220, 6222], [6221, 6223], [6222, 6224, 6285], [6223, 6225], [6151, 6224, 6226], [6225, 6227], [6226, 6228, 6286], [6227, 6229], [6152, 6228, 6230], [6229, 6231], [6230, 6232, 6287], [6231, 6233], [6153, 6232, 6234], [6233, 6235], [6234, 6236, 6288], [6235, 6237], [6154, 6236, 6238], [6237, 6239], [6238, 6240, 6289], [6239, 6241], [6155, 6240, 6242], [6241, 6243], [6242, 6244, 6290], [6243, 6245], [6156, 6244, 6246], [6245, 6247], [6246, 6248, 6291], [6247, 6249], [6157, 6248, 6250], [6249, 6251], [6250, 6252, 6292], [6251, 6253], [6158, 6252, 6254], [6253, 6255], [6254, 6256, 6293], [6255, 6257], [6159, 6256, 6258], [6257, 6259], [6258, 6260, 6294], [6259, 6261], [6160, 6260, 6262], [6261, 6263], [6262, 6264, 6295], [6263, 6265], [6161, 6264, 6266], [6265, 6267], [6266, 6268, 6296], [6267, 6269], [6162, 6268], [6163, 6297], [6167, 6301], [6171, 6305], [6175, 6309], [6179, 6313], [6183, 6317], [6187, 6321], [6191, 6325], [6195, 6329], [6199, 6333], [6203, 6337], [6207, 6341], [6211, 6345], [6215, 6349], [6219, 6353], [6223, 6357], [6227, 6361], [6231, 6365], [6235, 6369], [6239, 6373], [6243, 6377], [6247, 6381], [6251, 6385], [6255, 6389], [6259, 6393], [6263, 6397], [6267, 6401], [6270, 6298], [6297, 6299], [6298, 6300, 6404], [6299, 6301], [6271, 6300, 6302], [6301, 6303], [6302, 6304, 6405], [6303, 6305], [6272, 6304, 6306], [6305, 6307], [6306, 6308, 6406], [6307, 6309], [6273, 6308, 6310], [6309, 6311], [6310, 6312, 6407], [6311, 6313], [6274, 6312, 6314], [6313, 6315], [6314, 6316, 6408], [6315, 6317], [6275, 6316, 6318], [6317, 6319], [6318, 6320, 6409], [6319, 6321], [6276, 6320, 6322], [6321, 6323], [6322, 6324, 6410], [6323, 6325], [6277, 6324, 6326], [6325, 6327], [6326, 6328, 6411], [6327, 6329], [6278, 6328, 6330], [6329, 6331], [6330, 6332, 6412], [6331, 6333], [6279, 6332, 6334], [6333, 6335], [6334, 6336, 6413], [6335, 6337], [6280, 6336, 6338], [6337, 6339], [6338, 6340, 6414], [6339, 6341], [6281, 6340, 6342], [6341, 6343], [6342, 6344, 6415], [6343, 6345], [6282, 6344, 6346], [6345, 6347], [6346, 6348, 6416], [6347, 6349], [6283, 6348, 6350], [6349, 6351], [6350, 6352, 6417], [6351, 6353], [6284, 6352, 6354], [6353, 6355], [6354, 6356, 6418], [6355, 6357], [6285, 6356, 6358], [6357, 6359], [6358, 6360, 6419], [6359, 6361], [6286, 6360, 6362], [6361, 6363], [6362, 6364, 6420], [6363, 6365], [6287, 6364, 6366], [6365, 6367], [6366, 6368, 6421], [6367, 6369], [6288, 6368, 6370], [6369, 6371], [6370, 6372, 6422], [6371, 6373], [6289, 6372, 6374], [6373, 6375], [6374, 6376, 6423], [6375, 6377], [6290, 6376, 6378], [6377, 6379], [6378, 6380, 6424], [6379, 6381], [6291, 6380, 6382], [6381, 6383], [6382, 6384, 6425], [6383, 6385], [6292, 6384, 6386], [6385, 6387], [6386, 6388, 6426], [6387, 6389], [6293, 6388, 6390], [6389, 6391], [6390, 6392, 6427], [6391, 6393], [6294, 6392, 6394], [6393, 6395], [6394, 6396, 6428], [6395, 6397], [6295, 6396, 6398], [6397, 6399], [6398, 6400, 6429], [6399, 6401], [6296, 6400, 6402], [6401, 6403], [6402, 6430], [6299, 6433], [6303, 6437], [6307, 6441], [6311, 6445], [6315, 6449], [6319, 6453], [6323, 6457], [6327, 6461], [6331, 6465], [6335, 6469], [6339, 6473], [6343, 6477], [6347, 6481], [6351, 6485], [6355, 6489], [6359, 6493], [6363, 6497], [6367, 6501], [6371, 6505], [6375, 6509], [6379, 6513], [6383, 6517], [6387, 6521], [6391, 6525], [6395, 6529], [6399, 6533], [6403, 6537], [6432, 6538], [6431, 6433], [6404, 6432, 6434], [6433, 6435], [6434, 6436, 6539], [6435, 6437], [6405, 6436, 6438], [6437, 6439], [6438, 6440, 6540], [6439, 6441], [6406, 6440, 6442], [6441, 6443], [6442, 6444, 6541], [6443, 6445], [6407, 6444, 6446], [6445, 6447], [6446, 6448, 6542], [6447, 6449], [6408, 6448, 6450], [6449, 6451], [6450, 6452, 6543], [6451, 6453], [6409, 6452, 6454], [6453, 6455], [6454, 6456, 6544], [6455, 6457], [6410, 6456, 6458], [6457, 6459], [6458, 6460, 6545], [6459, 6461], [6411, 6460, 6462], [6461, 6463], [6462, 6464, 6546], [6463, 6465], [6412, 6464, 6466], [6465, 6467], [6466, 6468, 6547], [6467, 6469], [6413, 6468, 6470], [6469, 6471], [6470, 6472, 6548], [6471, 6473], [6414, 6472, 6474], [6473, 6475], [6474, 6476, 6549], [6475, 6477], [6415, 6476, 6478], [6477, 6479], [6478, 6480, 6550], [6479, 6481], [6416, 6480, 6482], [6481, 6483], [6482, 6484, 6551], [6483, 6485], [6417, 6484, 6486], [6485, 6487], [6486, 6488, 6552], [6487, 6489], [6418, 6488, 6490], [6489, 6491], [6490, 6492, 6553], [6491, 6493], [6419, 6492, 6494], [6493, 6495], [6494, 6496, 6554], [6495, 6497], [6420, 6496, 6498], [6497, 6499], [6498, 6500, 6555], [6499, 6501], [6421, 6500, 6502], [6501, 6503], [6502, 6504, 6556], [6503, 6505], [6422, 6504, 6506], [6505, 6507], [6506, 6508, 6557], [6507, 6509], [6423, 6508, 6510], [6509, 6511], [6510, 6512, 6558], [6511, 6513], [6424, 6512, 6514], [6513, 6515], [6514, 6516, 6559], [6515, 6517], [6425, 6516, 6518], [6517, 6519], [6518, 6520, 6560], [6519, 6521], [6426, 6520, 6522], [6521, 6523], [6522, 6524, 6561], [6523, 6525], [6427, 6524, 6526], [6525, 6527], [6526, 6528, 6562], [6527, 6529], [6428, 6528, 6530], [6529, 6531], [6530, 6532, 6563], [6531, 6533], [6429, 6532, 6534], [6533, 6535], [6534, 6536, 6564], [6535, 6537], [6430, 6536], [6431, 6565], [6435, 6569], [6439, 6573], [6443, 6577], [6447, 6581], [6451, 6585], [6455, 6589], [6459, 6593], [6463, 6597], [6467, 6601], [6471, 6605], [6475, 6609], [6479, 6613], [6483, 6617], [6487, 6621], [6491, 6625], [6495, 6629], [6499, 6633], [6503, 6637], [6507, 6641], [6511, 6645], [6515, 6649], [6519, 6653], [6523, 6657], [6527, 6661], [6531, 6665], [6535, 6669], [6538, 6566], [6565, 6567], [6566, 6568, 6672], [6567, 6569], [6539, 6568, 6570], [6569, 6571], [6570, 6572, 6673], [6571, 6573], [6540, 6572, 6574], [6573, 6575], [6574, 6576, 6674], [6575, 6577], [6541, 6576, 6578], [6577, 6579], [6578, 6580, 6675], [6579, 6581], [6542, 6580, 6582], [6581, 6583], [6582, 6584, 6676], [6583, 6585], [6543, 6584, 6586], [6585, 6587], [6586, 6588, 6677], [6587, 6589], [6544, 6588, 6590], [6589, 6591], [6590, 6592, 6678], [6591, 6593], [6545, 6592, 6594], [6593, 6595], [6594, 6596, 6679], [6595, 6597], [6546, 6596, 6598], [6597, 6599], [6598, 6600, 6680], [6599, 6601], [6547, 6600, 6602], [6601, 6603], [6602, 6604, 6681], [6603, 6605], [6548, 6604, 6606], [6605, 6607], [6606, 6608, 6682], [6607, 6609], [6549, 6608, 6610], [6609, 6611], [6610, 6612, 6683], [6611, 6613], [6550, 6612, 6614], [6613, 6615], [6614, 6616, 6684], [6615, 6617], [6551, 6616, 6618], [6617, 6619], [6618, 6620, 6685], [6619, 6621], [6552, 6620, 6622], [6621, 6623], [6622, 6624, 6686], [6623, 6625], [6553, 6624, 6626], [6625, 6627], [6626, 6628, 6687], [6627, 6629], [6554, 6628, 6630], [6629, 6631], [6630, 6632, 6688], [6631, 6633], [6555, 6632, 6634], [6633, 6635], [6634, 6636, 6689], [6635, 6637], [6556, 6636, 6638], [6637, 6639], [6638, 6640, 6690], [6639, 6641], [6557, 6640, 6642], [6641, 6643], [6642, 6644, 6691], [6643, 6645], [6558, 6644, 6646], [6645, 6647], [6646, 6648, 6692], [6647, 6649], [6559, 6648, 6650], [6649, 6651], [6650, 6652, 6693], [6651, 6653], [6560, 6652, 6654], [6653, 6655], [6654, 6656, 6694], [6655, 6657], [6561, 6656, 6658], [6657, 6659], [6658, 6660, 6695], [6659, 6661], [6562, 6660, 6662], [6661, 6663], [6662, 6664, 6696], [6663, 6665], [6563, 6664, 6666], [6665, 6667], [6666, 6668, 6697], [6667, 6669], [6564, 6668, 6670], [6669, 6671], [6670, 6698], [6567, 6701], [6571, 6705], [6575, 6709], [6579, 6713], [6583, 6717], [6587, 6721], [6591, 6725], [6595, 6729], [6599, 6733], [6603, 6737], [6607, 6741], [6611, 6745], [6615, 6749], [6619, 6753], [6623, 6757], [6627, 6761], [6631, 6765], [6635, 6769], [6639, 6773], [6643, 6777], [6647, 6781], [6651, 6785], [6655, 6789], [6659, 6793], [6663, 6797], [6667, 6801], [6671, 6805], [6700, 6806], [6699, 6701], [6672, 6700, 6702], [6701, 6703], [6702, 6704, 6807], [6703, 6705], [6673, 6704, 6706], [6705, 6707], [6706, 6708, 6808], [6707, 6709], [6674, 6708, 6710], [6709, 6711], [6710, 6712, 6809], [6711, 6713], [6675, 6712, 6714], [6713, 6715], [6714, 6716, 6810], [6715, 6717], [6676, 6716, 6718], [6717, 6719], [6718, 6720, 6811], [6719, 6721], [6677, 6720, 6722], [6721, 6723], [6722, 6724, 6812], [6723, 6725], [6678, 6724, 6726], [6725, 6727], [6726, 6728, 6813], [6727, 6729], [6679, 6728, 6730], [6729, 6731], [6730, 6732, 6814], [6731, 6733], [6680, 6732, 6734], [6733, 6735], [6734, 6736, 6815], [6735, 6737], [6681, 6736, 6738], [6737, 6739], [6738, 6740, 6816], [6739, 6741], [6682, 6740, 6742], [6741, 6743], [6742, 6744, 6817], [6743, 6745], [6683, 6744, 6746], [6745, 6747], [6746, 6748, 6818], [6747, 6749], [6684, 6748, 6750], [6749, 6751], [6750, 6752, 6819], [6751, 6753], [6685, 6752, 6754], [6753, 6755], [6754, 6756, 6820], [6755, 6757], [6686, 6756, 6758], [6757, 6759], [6758, 6760, 6821], [6759, 6761], [6687, 6760, 6762], [6761, 6763], [6762, 6764, 6822], [6763, 6765], [6688, 6764, 6766], [6765, 6767], [6766, 6768, 6823], [6767, 6769], [6689, 6768, 6770], [6769, 6771], [6770, 6772, 6824], [6771, 6773], [6690, 6772, 6774], [6773, 6775], [6774, 6776, 6825], [6775, 6777], [6691, 6776, 6778], [6777, 6779], [6778, 6780, 6826], [6779, 6781], [6692, 6780, 6782], [6781, 6783], [6782, 6784, 6827], [6783, 6785], [6693, 6784, 6786], [6785, 6787], [6786, 6788, 6828], [6787, 6789], [6694, 6788, 6790], [6789, 6791], [6790, 6792, 6829], [6791, 6793], [6695, 6792, 6794], [6793, 6795], [6794, 6796, 6830], [6795, 6797], [6696, 6796, 6798], [6797, 6799], [6798, 6800, 6831], [6799, 6801], [6697, 6800, 6802], [6801, 6803], [6802, 6804, 6832], [6803, 6805], [6698, 6804], [6699, 6833], [6703, 6837], [6707, 6841], [6711, 6845], [6715, 6849], [6719, 6853], [6723, 6857], [6727, 6861], [6731, 6865], [6735, 6869], [6739, 6873], [6743, 6877], [6747, 6881], [6751, 6885], [6755, 6889], [6759, 6893], [6763, 6897], [6767, 6901], [6771, 6905], [6775, 6909], [6779, 6913], [6783, 6917], [6787, 6921], [6791, 6925], [6795, 6929], [6799, 6933], [6803, 6937], [6806, 6834], [6833, 6835], [6834, 6836, 6940], [6835, 6837], [6807, 6836, 6838], [6837, 6839], [6838, 6840, 6941], [6839, 6841], [6808, 6840, 6842], [6841, 6843], [6842, 6844, 6942], [6843, 6845], [6809, 6844, 6846], [6845, 6847], [6846, 6848, 6943], [6847, 6849], [6810, 6848, 6850], [6849, 6851], [6850, 6852, 6944], [6851, 6853], [6811, 6852, 6854], [6853, 6855], [6854, 6856, 6945], [6855, 6857], [6812, 6856, 6858], [6857, 6859], [6858, 6860, 6946], [6859, 6861], [6813, 6860, 6862], [6861, 6863], [6862, 6864, 6947], [6863, 6865], [6814, 6864, 6866], [6865, 6867], [6866, 6868, 6948], [6867, 6869], [6815, 6868, 6870], [6869, 6871], [6870, 6872, 6949], [6871, 6873], [6816, 6872, 6874], [6873, 6875], [6874, 6876, 6950], [6875, 6877], [6817, 6876, 6878], [6877, 6879], [6878, 6880, 6951], [6879, 6881], [6818, 6880, 6882], [6881, 6883], [6882, 6884, 6952], [6883, 6885], [6819, 6884, 6886], [6885, 6887], [6886, 6888, 6953], [6887, 6889], [6820, 6888, 6890], [6889, 6891], [6890, 6892, 6954], [6891, 6893], [6821, 6892, 6894], [6893, 6895], [6894, 6896, 6955], [6895, 6897], [6822, 6896, 6898], [6897, 6899], [6898, 6900, 6956], [6899, 6901], [6823, 6900, 6902], [6901, 6903], [6902, 6904, 6957], [6903, 6905], [6824, 6904, 6906], [6905, 6907], [6906, 6908, 6958], [6907, 6909], [6825, 6908, 6910], [6909, 6911], [6910, 6912, 6959], [6911, 6913], [6826, 6912, 6914], [6913, 6915], [6914, 6916, 6960], [6915, 6917], [6827, 6916, 6918], [6917, 6919], [6918, 6920, 6961], [6919, 6921], [6828, 6920, 6922], [6921, 6923], [6922, 6924, 6962], [6923, 6925], [6829, 6924, 6926], [6925, 6927], [6926, 6928, 6963], [6927, 6929], [6830, 6928, 6930], [6929, 6931], [6930, 6932, 6964], [6931, 6933], [6831, 6932, 6934], [6933, 6935], [6934, 6936, 6965], [6935, 6937], [6832, 6936, 6938], [6937, 6939], [6938, 6966], [6835, 6968], [6839, 6972], [6843, 6976], [6847, 6980], [6851, 6984], [6855, 6988], [6859, 6992], [6863, 6996], [6867, 7000], [6871, 7004], [6875, 7008], [6879, 7012], [6883, 7016], [6887, 7020], [6891, 7024], [6895, 7028], [6899, 7032], [6903, 7036], [6907, 7040], [6911, 7044], [6915, 7048], [6919, 7052], [6923, 7056], [6927, 7060], [6931, 7064], [6935, 7068], [6939, 7072], [6968], [6940, 6967, 6969], [6968, 6970], [6969, 6971], [6970, 6972], [6941, 6971, 6973], [6972, 6974], [6973, 6975], [6974, 6976], [6942, 6975, 6977], [6976, 6978], [6977, 6979], [6978, 6980], [6943, 6979, 6981], [6980, 6982], [6981, 6983], [6982, 6984], [6944, 6983, 6985], [6984, 6986], [6985, 6987], [6986, 6988], [6945, 6987, 6989], [6988, 6990], [6989, 6991], [6990, 6992], [6946, 6991, 6993], [6992, 6994], [6993, 6995], [6994, 6996], [6947, 6995, 6997], [6996, 6998], [6997, 6999], [6998, 7000], [6948, 6999, 7001], [7000, 7002], [7001, 7003], [7002, 7004], [6949, 7003, 7005], [7004, 7006], [7005, 7007], [7006, 7008], [6950, 7007, 7009], [7008, 7010], [7009, 7011], [7010, 7012], [6951, 7011, 7013], [7012, 7014], [7013, 7015], [7014, 7016], [6952, 7015, 7017], [7016, 7018], [7017, 7019], [7018, 7020], [6953, 7019, 7021], [7020, 7022], [7021, 7023], [7022, 7024], [6954, 7023, 7025], [7024, 7026], [7025, 7027], [7026, 7028], [6955, 7027, 7029], [7028, 7030], [7029, 7031], [7030, 7032], [6956, 7031, 7033], [7032, 7034], [7033, 7035], [7034, 7036], [6957, 7035, 7037], [7036, 7038], [7037, 7039], [7038, 7040], [6958, 7039, 7041], [7040, 7042], [7041, 7043], [7042, 7044], [6959, 7043, 7045], [7044, 7046], [7045, 7047], [7046, 7048], [6960, 7047, 7049], [7048, 7050], [7049, 7051], [7050, 7052], [6961, 7051, 7053], [7052, 7054], [7053, 7055], [7054, 7056], [6962, 7055, 7057], [7056, 7058], [7057, 7059], [7058, 7060], [6963, 7059, 7061], [7060, 7062], [7061, 7063], [7062, 7064], [6964, 7063, 7065], [7064, 7066], [7065, 7067], [7066, 7068], [6965, 7067, 7069], [7068, 7070], [7069, 7071], [7070, 7072], [6966, 7071]] +CNOTERROR: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] +CNOTTIME: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] diff --git a/benchmark/topology/topo_9361.layout b/benchmark/topology/topo_9361.layout index aafdd71df..a8b692e98 100644 --- a/benchmark/topology/topo_9361.layout +++ b/benchmark/topology/topo_9361.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1, 122], [0, 2], [1, 3], [2, 4], [3, 5, 123], [4, 6], [5, 7], [6, 8], [7, 9, 124], [8, 10], [9, 11], [10, 12], [11, 13, 125], [12, 14], [13, 15], [14, 16], [15, 17, 126], [16, 18], [17, 19], [18, 20], [19, 21, 127], [20, 22], [21, 23], [22, 24], [23, 25, 128], [24, 26], [25, 27], [26, 28], [27, 29, 129], [28, 30], [29, 31], [30, 32], [31, 33, 130], [32, 34], [33, 35], [34, 36], [35, 37, 131], [36, 38], [37, 39], [38, 40], [39, 41, 132], [40, 42], [41, 43], [42, 44], [43, 45, 133], [44, 46], [45, 47], [46, 48], [47, 49, 134], [48, 50], [49, 51], [50, 52], [51, 53, 135], [52, 54], [53, 55], [54, 56], [55, 57, 136], [56, 58], [57, 59], [58, 60], [59, 61, 137], [60, 62], [61, 63], [62, 64], [63, 65, 138], [64, 66], [65, 67], [66, 68], [67, 69, 139], [68, 70], [69, 71], [70, 72], [71, 73, 140], [72, 74], [73, 75], [74, 76], [75, 77, 141], [76, 78], [77, 79], [78, 80], [79, 81, 142], [80, 82], [81, 83], [82, 84], [83, 85, 143], [84, 86], [85, 87], [86, 88], [87, 89, 144], [88, 90], [89, 91], [90, 92], [91, 93, 145], [92, 94], [93, 95], [94, 96], [95, 97, 146], [96, 98], [97, 99], [98, 100], [99, 101, 147], [100, 102], [101, 103], [102, 104], [103, 105, 148], [104, 106], [105, 107], [106, 108], [107, 109, 149], [108, 110], [109, 111], [110, 112], [111, 113, 150], [112, 114], [113, 115], [114, 116], [115, 117, 151], [116, 118], [117, 119], [118, 120], [119, 121, 152], [120], [0, 153], [4, 157], [8, 161], [12, 165], [16, 169], [20, 173], [24, 177], [28, 181], [32, 185], [36, 189], [40, 193], [44, 197], [48, 201], [52, 205], [56, 209], [60, 213], [64, 217], [68, 221], [72, 225], [76, 229], [80, 233], [84, 237], [88, 241], [92, 245], [96, 249], [100, 253], [104, 257], [108, 261], [112, 265], [116, 269], [120, 273], [122, 154], [153, 155], [154, 156, 276], [155, 157], [123, 156, 158], [157, 159], [158, 160, 277], [159, 161], [124, 160, 162], [161, 163], [162, 164, 278], [163, 165], [125, 164, 166], [165, 167], [166, 168, 279], [167, 169], [126, 168, 170], [169, 171], [170, 172, 280], [171, 173], [127, 172, 174], [173, 175], [174, 176, 281], [175, 177], [128, 176, 178], [177, 179], [178, 180, 282], [179, 181], [129, 180, 182], [181, 183], [182, 184, 283], [183, 185], [130, 184, 186], [185, 187], [186, 188, 284], [187, 189], [131, 188, 190], [189, 191], [190, 192, 285], [191, 193], [132, 192, 194], [193, 195], [194, 196, 286], [195, 197], [133, 196, 198], [197, 199], [198, 200, 287], [199, 201], [134, 200, 202], [201, 203], [202, 204, 288], [203, 205], [135, 204, 206], [205, 207], [206, 208, 289], [207, 209], [136, 208, 210], [209, 211], [210, 212, 290], [211, 213], [137, 212, 214], [213, 215], [214, 216, 291], [215, 217], [138, 216, 218], [217, 219], [218, 220, 292], [219, 221], [139, 220, 222], [221, 223], [222, 224, 293], [223, 225], [140, 224, 226], [225, 227], [226, 228, 294], [227, 229], [141, 228, 230], [229, 231], [230, 232, 295], [231, 233], [142, 232, 234], [233, 235], [234, 236, 296], [235, 237], [143, 236, 238], [237, 239], [238, 240, 297], [239, 241], [144, 240, 242], [241, 243], [242, 244, 298], [243, 245], [145, 244, 246], [245, 247], [246, 248, 299], [247, 249], [146, 248, 250], [249, 251], [250, 252, 300], [251, 253], [147, 252, 254], [253, 255], [254, 256, 301], [255, 257], [148, 256, 258], [257, 259], [258, 260, 302], [259, 261], [149, 260, 262], [261, 263], [262, 264, 303], [263, 265], [150, 264, 266], [265, 267], [266, 268, 304], [267, 269], [151, 268, 270], [269, 271], [270, 272, 305], [271, 273], [152, 272, 274], [273, 275], [274, 306], [155, 309], [159, 313], [163, 317], [167, 321], [171, 325], [175, 329], [179, 333], [183, 337], [187, 341], [191, 345], [195, 349], [199, 353], [203, 357], [207, 361], [211, 365], [215, 369], [219, 373], [223, 377], [227, 381], [231, 385], [235, 389], [239, 393], [243, 397], [247, 401], [251, 405], [255, 409], [259, 413], [263, 417], [267, 421], [271, 425], [275, 429], [308, 430], [307, 309], [276, 308, 310], [309, 311], [310, 312, 431], [311, 313], [277, 312, 314], [313, 315], [314, 316, 432], [315, 317], [278, 316, 318], [317, 319], [318, 320, 433], [319, 321], [279, 320, 322], [321, 323], [322, 324, 434], [323, 325], [280, 324, 326], [325, 327], [326, 328, 435], [327, 329], [281, 328, 330], [329, 331], [330, 332, 436], [331, 333], [282, 332, 334], [333, 335], [334, 336, 437], [335, 337], [283, 336, 338], [337, 339], [338, 340, 438], [339, 341], [284, 340, 342], [341, 343], [342, 344, 439], [343, 345], [285, 344, 346], [345, 347], [346, 348, 440], [347, 349], [286, 348, 350], [349, 351], [350, 352, 441], [351, 353], [287, 352, 354], [353, 355], [354, 356, 442], [355, 357], [288, 356, 358], [357, 359], [358, 360, 443], [359, 361], [289, 360, 362], [361, 363], [362, 364, 444], [363, 365], [290, 364, 366], [365, 367], [366, 368, 445], [367, 369], [291, 368, 370], [369, 371], [370, 372, 446], [371, 373], [292, 372, 374], [373, 375], [374, 376, 447], [375, 377], [293, 376, 378], [377, 379], [378, 380, 448], [379, 381], [294, 380, 382], [381, 383], [382, 384, 449], [383, 385], [295, 384, 386], [385, 387], [386, 388, 450], [387, 389], [296, 388, 390], [389, 391], [390, 392, 451], [391, 393], [297, 392, 394], [393, 395], [394, 396, 452], [395, 397], [298, 396, 398], [397, 399], [398, 400, 453], [399, 401], [299, 400, 402], [401, 403], [402, 404, 454], [403, 405], [300, 404, 406], [405, 407], [406, 408, 455], [407, 409], [301, 408, 410], [409, 411], [410, 412, 456], [411, 413], [302, 412, 414], [413, 415], [414, 416, 457], [415, 417], [303, 416, 418], [417, 419], [418, 420, 458], [419, 421], [304, 420, 422], [421, 423], [422, 424, 459], [423, 425], [305, 424, 426], [425, 427], [426, 428, 460], [427, 429], [306, 428], [307, 461], [311, 465], [315, 469], [319, 473], [323, 477], [327, 481], [331, 485], [335, 489], [339, 493], [343, 497], [347, 501], [351, 505], [355, 509], [359, 513], [363, 517], [367, 521], [371, 525], [375, 529], [379, 533], [383, 537], [387, 541], [391, 545], [395, 549], [399, 553], [403, 557], [407, 561], [411, 565], [415, 569], [419, 573], [423, 577], [427, 581], [430, 462], [461, 463], [462, 464, 584], [463, 465], [431, 464, 466], [465, 467], [466, 468, 585], [467, 469], [432, 468, 470], [469, 471], [470, 472, 586], [471, 473], [433, 472, 474], [473, 475], [474, 476, 587], [475, 477], [434, 476, 478], [477, 479], [478, 480, 588], [479, 481], [435, 480, 482], [481, 483], [482, 484, 589], [483, 485], [436, 484, 486], [485, 487], [486, 488, 590], [487, 489], [437, 488, 490], [489, 491], [490, 492, 591], [491, 493], [438, 492, 494], [493, 495], [494, 496, 592], [495, 497], [439, 496, 498], [497, 499], [498, 500, 593], [499, 501], [440, 500, 502], [501, 503], [502, 504, 594], [503, 505], [441, 504, 506], [505, 507], [506, 508, 595], [507, 509], [442, 508, 510], [509, 511], [510, 512, 596], [511, 513], [443, 512, 514], [513, 515], [514, 516, 597], [515, 517], [444, 516, 518], [517, 519], [518, 520, 598], [519, 521], [445, 520, 522], [521, 523], [522, 524, 599], [523, 525], [446, 524, 526], [525, 527], [526, 528, 600], [527, 529], [447, 528, 530], [529, 531], [530, 532, 601], [531, 533], [448, 532, 534], [533, 535], [534, 536, 602], [535, 537], [449, 536, 538], [537, 539], [538, 540, 603], [539, 541], [450, 540, 542], [541, 543], [542, 544, 604], [543, 545], [451, 544, 546], [545, 547], [546, 548, 605], [547, 549], [452, 548, 550], [549, 551], [550, 552, 606], [551, 553], [453, 552, 554], [553, 555], [554, 556, 607], [555, 557], [454, 556, 558], [557, 559], [558, 560, 608], [559, 561], [455, 560, 562], [561, 563], [562, 564, 609], [563, 565], [456, 564, 566], [565, 567], [566, 568, 610], [567, 569], [457, 568, 570], [569, 571], [570, 572, 611], [571, 573], [458, 572, 574], [573, 575], [574, 576, 612], [575, 577], [459, 576, 578], [577, 579], [578, 580, 613], [579, 581], [460, 580, 582], [581, 583], [582, 614], [463, 617], [467, 621], [471, 625], [475, 629], [479, 633], [483, 637], [487, 641], [491, 645], [495, 649], [499, 653], [503, 657], [507, 661], [511, 665], [515, 669], [519, 673], [523, 677], [527, 681], [531, 685], [535, 689], [539, 693], [543, 697], [547, 701], [551, 705], [555, 709], [559, 713], [563, 717], [567, 721], [571, 725], [575, 729], [579, 733], [583, 737], [616, 738], [615, 617], [584, 616, 618], [617, 619], [618, 620, 739], [619, 621], [585, 620, 622], [621, 623], [622, 624, 740], [623, 625], [586, 624, 626], [625, 627], [626, 628, 741], [627, 629], [587, 628, 630], [629, 631], [630, 632, 742], [631, 633], [588, 632, 634], [633, 635], [634, 636, 743], [635, 637], [589, 636, 638], [637, 639], [638, 640, 744], [639, 641], [590, 640, 642], [641, 643], [642, 644, 745], [643, 645], [591, 644, 646], [645, 647], [646, 648, 746], [647, 649], [592, 648, 650], [649, 651], [650, 652, 747], [651, 653], [593, 652, 654], [653, 655], [654, 656, 748], [655, 657], [594, 656, 658], [657, 659], [658, 660, 749], [659, 661], [595, 660, 662], [661, 663], [662, 664, 750], [663, 665], [596, 664, 666], [665, 667], [666, 668, 751], [667, 669], [597, 668, 670], [669, 671], [670, 672, 752], [671, 673], [598, 672, 674], [673, 675], [674, 676, 753], [675, 677], [599, 676, 678], [677, 679], [678, 680, 754], [679, 681], [600, 680, 682], [681, 683], [682, 684, 755], [683, 685], [601, 684, 686], [685, 687], [686, 688, 756], [687, 689], [602, 688, 690], [689, 691], [690, 692, 757], [691, 693], [603, 692, 694], [693, 695], [694, 696, 758], [695, 697], [604, 696, 698], [697, 699], [698, 700, 759], [699, 701], [605, 700, 702], [701, 703], [702, 704, 760], [703, 705], [606, 704, 706], [705, 707], [706, 708, 761], [707, 709], [607, 708, 710], [709, 711], [710, 712, 762], [711, 713], [608, 712, 714], [713, 715], [714, 716, 763], [715, 717], [609, 716, 718], [717, 719], [718, 720, 764], [719, 721], [610, 720, 722], [721, 723], [722, 724, 765], [723, 725], [611, 724, 726], [725, 727], [726, 728, 766], [727, 729], [612, 728, 730], [729, 731], [730, 732, 767], [731, 733], [613, 732, 734], [733, 735], [734, 736, 768], [735, 737], [614, 736], [615, 769], [619, 773], [623, 777], [627, 781], [631, 785], [635, 789], [639, 793], [643, 797], [647, 801], [651, 805], [655, 809], [659, 813], [663, 817], [667, 821], [671, 825], [675, 829], [679, 833], [683, 837], [687, 841], [691, 845], [695, 849], [699, 853], [703, 857], [707, 861], [711, 865], [715, 869], [719, 873], [723, 877], [727, 881], [731, 885], [735, 889], [738, 770], [769, 771], [770, 772, 892], [771, 773], [739, 772, 774], [773, 775], [774, 776, 893], [775, 777], [740, 776, 778], [777, 779], [778, 780, 894], [779, 781], [741, 780, 782], [781, 783], [782, 784, 895], [783, 785], [742, 784, 786], [785, 787], [786, 788, 896], [787, 789], [743, 788, 790], [789, 791], [790, 792, 897], [791, 793], [744, 792, 794], [793, 795], [794, 796, 898], [795, 797], [745, 796, 798], [797, 799], [798, 800, 899], [799, 801], [746, 800, 802], [801, 803], [802, 804, 900], [803, 805], [747, 804, 806], [805, 807], [806, 808, 901], [807, 809], [748, 808, 810], [809, 811], [810, 812, 902], [811, 813], [749, 812, 814], [813, 815], [814, 816, 903], [815, 817], [750, 816, 818], [817, 819], [818, 820, 904], [819, 821], [751, 820, 822], [821, 823], [822, 824, 905], [823, 825], [752, 824, 826], [825, 827], [826, 828, 906], [827, 829], [753, 828, 830], [829, 831], [830, 832, 907], [831, 833], [754, 832, 834], [833, 835], [834, 836, 908], [835, 837], [755, 836, 838], [837, 839], [838, 840, 909], [839, 841], [756, 840, 842], [841, 843], [842, 844, 910], [843, 845], [757, 844, 846], [845, 847], [846, 848, 911], [847, 849], [758, 848, 850], [849, 851], [850, 852, 912], [851, 853], [759, 852, 854], [853, 855], [854, 856, 913], [855, 857], [760, 856, 858], [857, 859], [858, 860, 914], [859, 861], [761, 860, 862], [861, 863], [862, 864, 915], [863, 865], [762, 864, 866], [865, 867], [866, 868, 916], [867, 869], [763, 868, 870], [869, 871], [870, 872, 917], [871, 873], [764, 872, 874], [873, 875], [874, 876, 918], [875, 877], [765, 876, 878], [877, 879], [878, 880, 919], [879, 881], [766, 880, 882], [881, 883], [882, 884, 920], [883, 885], [767, 884, 886], [885, 887], [886, 888, 921], [887, 889], [768, 888, 890], [889, 891], [890, 922], [771, 925], [775, 929], [779, 933], [783, 937], [787, 941], [791, 945], [795, 949], [799, 953], [803, 957], [807, 961], [811, 965], [815, 969], [819, 973], [823, 977], [827, 981], [831, 985], [835, 989], [839, 993], [843, 997], [847, 1001], [851, 1005], [855, 1009], [859, 1013], [863, 1017], [867, 1021], [871, 1025], [875, 1029], [879, 1033], [883, 1037], [887, 1041], [891, 1045], [924, 1046], [923, 925], [892, 924, 926], [925, 927], [926, 928, 1047], [927, 929], [893, 928, 930], [929, 931], [930, 932, 1048], [931, 933], [894, 932, 934], [933, 935], [934, 936, 1049], [935, 937], [895, 936, 938], [937, 939], [938, 940, 1050], [939, 941], [896, 940, 942], [941, 943], [942, 944, 1051], [943, 945], [897, 944, 946], [945, 947], [946, 948, 1052], [947, 949], [898, 948, 950], [949, 951], [950, 952, 1053], [951, 953], [899, 952, 954], [953, 955], [954, 956, 1054], [955, 957], [900, 956, 958], [957, 959], [958, 960, 1055], [959, 961], [901, 960, 962], [961, 963], [962, 964, 1056], [963, 965], [902, 964, 966], [965, 967], [966, 968, 1057], [967, 969], [903, 968, 970], [969, 971], [970, 972, 1058], [971, 973], [904, 972, 974], [973, 975], [974, 976, 1059], [975, 977], [905, 976, 978], [977, 979], [978, 980, 1060], [979, 981], [906, 980, 982], [981, 983], [982, 984, 1061], [983, 985], [907, 984, 986], [985, 987], [986, 988, 1062], [987, 989], [908, 988, 990], [989, 991], [990, 992, 1063], [991, 993], [909, 992, 994], [993, 995], [994, 996, 1064], [995, 997], [910, 996, 998], [997, 999], [998, 1000, 1065], [999, 1001], [911, 1000, 1002], [1001, 1003], [1002, 1004, 1066], [1003, 1005], [912, 1004, 1006], [1005, 1007], [1006, 1008, 1067], [1007, 1009], [913, 1008, 1010], [1009, 1011], [1010, 1012, 1068], [1011, 1013], [914, 1012, 1014], [1013, 1015], [1014, 1016, 1069], [1015, 1017], [915, 1016, 1018], [1017, 1019], [1018, 1020, 1070], [1019, 1021], [916, 1020, 1022], [1021, 1023], [1022, 1024, 1071], [1023, 1025], [917, 1024, 1026], [1025, 1027], [1026, 1028, 1072], [1027, 1029], [918, 1028, 1030], [1029, 1031], [1030, 1032, 1073], [1031, 1033], [919, 1032, 1034], [1033, 1035], [1034, 1036, 1074], [1035, 1037], [920, 1036, 1038], [1037, 1039], [1038, 1040, 1075], [1039, 1041], [921, 1040, 1042], [1041, 1043], [1042, 1044, 1076], [1043, 1045], [922, 1044], [923, 1077], [927, 1081], [931, 1085], [935, 1089], [939, 1093], [943, 1097], [947, 1101], [951, 1105], [955, 1109], [959, 1113], [963, 1117], [967, 1121], [971, 1125], [975, 1129], [979, 1133], [983, 1137], [987, 1141], [991, 1145], [995, 1149], [999, 1153], [1003, 1157], [1007, 1161], [1011, 1165], [1015, 1169], [1019, 1173], [1023, 1177], [1027, 1181], [1031, 1185], [1035, 1189], [1039, 1193], [1043, 1197], [1046, 1078], [1077, 1079], [1078, 1080, 1200], [1079, 1081], [1047, 1080, 1082], [1081, 1083], [1082, 1084, 1201], [1083, 1085], [1048, 1084, 1086], [1085, 1087], [1086, 1088, 1202], [1087, 1089], [1049, 1088, 1090], [1089, 1091], [1090, 1092, 1203], [1091, 1093], [1050, 1092, 1094], [1093, 1095], [1094, 1096, 1204], [1095, 1097], [1051, 1096, 1098], [1097, 1099], [1098, 1100, 1205], [1099, 1101], [1052, 1100, 1102], [1101, 1103], [1102, 1104, 1206], [1103, 1105], [1053, 1104, 1106], [1105, 1107], [1106, 1108, 1207], [1107, 1109], [1054, 1108, 1110], [1109, 1111], [1110, 1112, 1208], [1111, 1113], [1055, 1112, 1114], [1113, 1115], [1114, 1116, 1209], [1115, 1117], [1056, 1116, 1118], [1117, 1119], [1118, 1120, 1210], [1119, 1121], [1057, 1120, 1122], [1121, 1123], [1122, 1124, 1211], [1123, 1125], [1058, 1124, 1126], [1125, 1127], [1126, 1128, 1212], [1127, 1129], [1059, 1128, 1130], [1129, 1131], [1130, 1132, 1213], [1131, 1133], [1060, 1132, 1134], [1133, 1135], [1134, 1136, 1214], [1135, 1137], [1061, 1136, 1138], [1137, 1139], [1138, 1140, 1215], [1139, 1141], [1062, 1140, 1142], [1141, 1143], [1142, 1144, 1216], [1143, 1145], [1063, 1144, 1146], [1145, 1147], [1146, 1148, 1217], [1147, 1149], [1064, 1148, 1150], [1149, 1151], [1150, 1152, 1218], [1151, 1153], [1065, 1152, 1154], [1153, 1155], [1154, 1156, 1219], [1155, 1157], [1066, 1156, 1158], [1157, 1159], [1158, 1160, 1220], [1159, 1161], [1067, 1160, 1162], [1161, 1163], [1162, 1164, 1221], [1163, 1165], [1068, 1164, 1166], [1165, 1167], [1166, 1168, 1222], [1167, 1169], [1069, 1168, 1170], [1169, 1171], [1170, 1172, 1223], [1171, 1173], [1070, 1172, 1174], [1173, 1175], [1174, 1176, 1224], [1175, 1177], [1071, 1176, 1178], [1177, 1179], [1178, 1180, 1225], [1179, 1181], [1072, 1180, 1182], [1181, 1183], [1182, 1184, 1226], [1183, 1185], [1073, 1184, 1186], [1185, 1187], [1186, 1188, 1227], [1187, 1189], [1074, 1188, 1190], [1189, 1191], [1190, 1192, 1228], [1191, 1193], [1075, 1192, 1194], [1193, 1195], [1194, 1196, 1229], [1195, 1197], [1076, 1196, 1198], [1197, 1199], [1198, 1230], [1079, 1233], [1083, 1237], [1087, 1241], [1091, 1245], [1095, 1249], [1099, 1253], [1103, 1257], [1107, 1261], [1111, 1265], [1115, 1269], [1119, 1273], [1123, 1277], [1127, 1281], [1131, 1285], [1135, 1289], [1139, 1293], [1143, 1297], [1147, 1301], [1151, 1305], [1155, 1309], [1159, 1313], [1163, 1317], [1167, 1321], [1171, 1325], [1175, 1329], [1179, 1333], [1183, 1337], [1187, 1341], [1191, 1345], [1195, 1349], [1199, 1353], [1232, 1354], [1231, 1233], [1200, 1232, 1234], [1233, 1235], [1234, 1236, 1355], [1235, 1237], [1201, 1236, 1238], [1237, 1239], [1238, 1240, 1356], [1239, 1241], [1202, 1240, 1242], [1241, 1243], [1242, 1244, 1357], [1243, 1245], [1203, 1244, 1246], [1245, 1247], [1246, 1248, 1358], [1247, 1249], [1204, 1248, 1250], [1249, 1251], [1250, 1252, 1359], [1251, 1253], [1205, 1252, 1254], [1253, 1255], [1254, 1256, 1360], [1255, 1257], [1206, 1256, 1258], [1257, 1259], [1258, 1260, 1361], [1259, 1261], [1207, 1260, 1262], [1261, 1263], [1262, 1264, 1362], [1263, 1265], [1208, 1264, 1266], [1265, 1267], [1266, 1268, 1363], [1267, 1269], [1209, 1268, 1270], [1269, 1271], [1270, 1272, 1364], [1271, 1273], [1210, 1272, 1274], [1273, 1275], [1274, 1276, 1365], [1275, 1277], [1211, 1276, 1278], [1277, 1279], [1278, 1280, 1366], [1279, 1281], [1212, 1280, 1282], [1281, 1283], [1282, 1284, 1367], [1283, 1285], [1213, 1284, 1286], [1285, 1287], [1286, 1288, 1368], [1287, 1289], [1214, 1288, 1290], [1289, 1291], [1290, 1292, 1369], [1291, 1293], [1215, 1292, 1294], [1293, 1295], [1294, 1296, 1370], [1295, 1297], [1216, 1296, 1298], [1297, 1299], [1298, 1300, 1371], [1299, 1301], [1217, 1300, 1302], [1301, 1303], [1302, 1304, 1372], [1303, 1305], [1218, 1304, 1306], [1305, 1307], [1306, 1308, 1373], [1307, 1309], [1219, 1308, 1310], [1309, 1311], [1310, 1312, 1374], [1311, 1313], [1220, 1312, 1314], [1313, 1315], [1314, 1316, 1375], [1315, 1317], [1221, 1316, 1318], [1317, 1319], [1318, 1320, 1376], [1319, 1321], [1222, 1320, 1322], [1321, 1323], [1322, 1324, 1377], [1323, 1325], [1223, 1324, 1326], [1325, 1327], [1326, 1328, 1378], [1327, 1329], [1224, 1328, 1330], [1329, 1331], [1330, 1332, 1379], [1331, 1333], [1225, 1332, 1334], [1333, 1335], [1334, 1336, 1380], [1335, 1337], [1226, 1336, 1338], [1337, 1339], [1338, 1340, 1381], [1339, 1341], [1227, 1340, 1342], [1341, 1343], [1342, 1344, 1382], [1343, 1345], [1228, 1344, 1346], [1345, 1347], [1346, 1348, 1383], [1347, 1349], [1229, 1348, 1350], [1349, 1351], [1350, 1352, 1384], [1351, 1353], [1230, 1352], [1231, 1385], [1235, 1389], [1239, 1393], [1243, 1397], [1247, 1401], [1251, 1405], [1255, 1409], [1259, 1413], [1263, 1417], [1267, 1421], [1271, 1425], [1275, 1429], [1279, 1433], [1283, 1437], [1287, 1441], [1291, 1445], [1295, 1449], [1299, 1453], [1303, 1457], [1307, 1461], [1311, 1465], [1315, 1469], [1319, 1473], [1323, 1477], [1327, 1481], [1331, 1485], [1335, 1489], [1339, 1493], [1343, 1497], [1347, 1501], [1351, 1505], [1354, 1386], [1385, 1387], [1386, 1388, 1508], [1387, 1389], [1355, 1388, 1390], [1389, 1391], [1390, 1392, 1509], [1391, 1393], [1356, 1392, 1394], [1393, 1395], [1394, 1396, 1510], [1395, 1397], [1357, 1396, 1398], [1397, 1399], [1398, 1400, 1511], [1399, 1401], [1358, 1400, 1402], [1401, 1403], [1402, 1404, 1512], [1403, 1405], [1359, 1404, 1406], [1405, 1407], [1406, 1408, 1513], [1407, 1409], [1360, 1408, 1410], [1409, 1411], [1410, 1412, 1514], [1411, 1413], [1361, 1412, 1414], [1413, 1415], [1414, 1416, 1515], [1415, 1417], [1362, 1416, 1418], [1417, 1419], [1418, 1420, 1516], [1419, 1421], [1363, 1420, 1422], [1421, 1423], [1422, 1424, 1517], [1423, 1425], [1364, 1424, 1426], [1425, 1427], [1426, 1428, 1518], [1427, 1429], [1365, 1428, 1430], [1429, 1431], [1430, 1432, 1519], [1431, 1433], [1366, 1432, 1434], [1433, 1435], [1434, 1436, 1520], [1435, 1437], [1367, 1436, 1438], [1437, 1439], [1438, 1440, 1521], [1439, 1441], [1368, 1440, 1442], [1441, 1443], [1442, 1444, 1522], [1443, 1445], [1369, 1444, 1446], [1445, 1447], [1446, 1448, 1523], [1447, 1449], [1370, 1448, 1450], [1449, 1451], [1450, 1452, 1524], [1451, 1453], [1371, 1452, 1454], [1453, 1455], [1454, 1456, 1525], [1455, 1457], [1372, 1456, 1458], [1457, 1459], [1458, 1460, 1526], [1459, 1461], [1373, 1460, 1462], [1461, 1463], [1462, 1464, 1527], [1463, 1465], [1374, 1464, 1466], [1465, 1467], [1466, 1468, 1528], [1467, 1469], [1375, 1468, 1470], [1469, 1471], [1470, 1472, 1529], [1471, 1473], [1376, 1472, 1474], [1473, 1475], [1474, 1476, 1530], [1475, 1477], [1377, 1476, 1478], [1477, 1479], [1478, 1480, 1531], [1479, 1481], [1378, 1480, 1482], [1481, 1483], [1482, 1484, 1532], [1483, 1485], [1379, 1484, 1486], [1485, 1487], [1486, 1488, 1533], [1487, 1489], [1380, 1488, 1490], [1489, 1491], [1490, 1492, 1534], [1491, 1493], [1381, 1492, 1494], [1493, 1495], [1494, 1496, 1535], [1495, 1497], [1382, 1496, 1498], [1497, 1499], [1498, 1500, 1536], [1499, 1501], [1383, 1500, 1502], [1501, 1503], [1502, 1504, 1537], [1503, 1505], [1384, 1504, 1506], [1505, 1507], [1506, 1538], [1387, 1541], [1391, 1545], [1395, 1549], [1399, 1553], [1403, 1557], [1407, 1561], [1411, 1565], [1415, 1569], [1419, 1573], [1423, 1577], [1427, 1581], [1431, 1585], [1435, 1589], [1439, 1593], [1443, 1597], [1447, 1601], [1451, 1605], [1455, 1609], [1459, 1613], [1463, 1617], [1467, 1621], [1471, 1625], [1475, 1629], [1479, 1633], [1483, 1637], [1487, 1641], [1491, 1645], [1495, 1649], [1499, 1653], [1503, 1657], [1507, 1661], [1540, 1662], [1539, 1541], [1508, 1540, 1542], [1541, 1543], [1542, 1544, 1663], [1543, 1545], [1509, 1544, 1546], [1545, 1547], [1546, 1548, 1664], [1547, 1549], [1510, 1548, 1550], [1549, 1551], [1550, 1552, 1665], [1551, 1553], [1511, 1552, 1554], [1553, 1555], [1554, 1556, 1666], [1555, 1557], [1512, 1556, 1558], [1557, 1559], [1558, 1560, 1667], [1559, 1561], [1513, 1560, 1562], [1561, 1563], [1562, 1564, 1668], [1563, 1565], [1514, 1564, 1566], [1565, 1567], [1566, 1568, 1669], [1567, 1569], [1515, 1568, 1570], [1569, 1571], [1570, 1572, 1670], [1571, 1573], [1516, 1572, 1574], [1573, 1575], [1574, 1576, 1671], [1575, 1577], [1517, 1576, 1578], [1577, 1579], [1578, 1580, 1672], [1579, 1581], [1518, 1580, 1582], [1581, 1583], [1582, 1584, 1673], [1583, 1585], [1519, 1584, 1586], [1585, 1587], [1586, 1588, 1674], [1587, 1589], [1520, 1588, 1590], [1589, 1591], [1590, 1592, 1675], [1591, 1593], [1521, 1592, 1594], [1593, 1595], [1594, 1596, 1676], [1595, 1597], [1522, 1596, 1598], [1597, 1599], [1598, 1600, 1677], [1599, 1601], [1523, 1600, 1602], [1601, 1603], [1602, 1604, 1678], [1603, 1605], [1524, 1604, 1606], [1605, 1607], [1606, 1608, 1679], [1607, 1609], [1525, 1608, 1610], [1609, 1611], [1610, 1612, 1680], [1611, 1613], [1526, 1612, 1614], [1613, 1615], [1614, 1616, 1681], [1615, 1617], [1527, 1616, 1618], [1617, 1619], [1618, 1620, 1682], [1619, 1621], [1528, 1620, 1622], [1621, 1623], [1622, 1624, 1683], [1623, 1625], [1529, 1624, 1626], [1625, 1627], [1626, 1628, 1684], [1627, 1629], [1530, 1628, 1630], [1629, 1631], [1630, 1632, 1685], [1631, 1633], [1531, 1632, 1634], [1633, 1635], [1634, 1636, 1686], [1635, 1637], [1532, 1636, 1638], [1637, 1639], [1638, 1640, 1687], [1639, 1641], [1533, 1640, 1642], [1641, 1643], [1642, 1644, 1688], [1643, 1645], [1534, 1644, 1646], [1645, 1647], [1646, 1648, 1689], [1647, 1649], [1535, 1648, 1650], [1649, 1651], [1650, 1652, 1690], [1651, 1653], [1536, 1652, 1654], [1653, 1655], [1654, 1656, 1691], [1655, 1657], [1537, 1656, 1658], [1657, 1659], [1658, 1660, 1692], [1659, 1661], [1538, 1660], [1539, 1693], [1543, 1697], [1547, 1701], [1551, 1705], [1555, 1709], [1559, 1713], [1563, 1717], [1567, 1721], [1571, 1725], [1575, 1729], [1579, 1733], [1583, 1737], [1587, 1741], [1591, 1745], [1595, 1749], [1599, 1753], [1603, 1757], [1607, 1761], [1611, 1765], [1615, 1769], [1619, 1773], [1623, 1777], [1627, 1781], [1631, 1785], [1635, 1789], [1639, 1793], [1643, 1797], [1647, 1801], [1651, 1805], [1655, 1809], [1659, 1813], [1662, 1694], [1693, 1695], [1694, 1696, 1816], [1695, 1697], [1663, 1696, 1698], [1697, 1699], [1698, 1700, 1817], [1699, 1701], [1664, 1700, 1702], [1701, 1703], [1702, 1704, 1818], [1703, 1705], [1665, 1704, 1706], [1705, 1707], [1706, 1708, 1819], [1707, 1709], [1666, 1708, 1710], [1709, 1711], [1710, 1712, 1820], [1711, 1713], [1667, 1712, 1714], [1713, 1715], [1714, 1716, 1821], [1715, 1717], [1668, 1716, 1718], [1717, 1719], [1718, 1720, 1822], [1719, 1721], [1669, 1720, 1722], [1721, 1723], [1722, 1724, 1823], [1723, 1725], [1670, 1724, 1726], [1725, 1727], [1726, 1728, 1824], [1727, 1729], [1671, 1728, 1730], [1729, 1731], [1730, 1732, 1825], [1731, 1733], [1672, 1732, 1734], [1733, 1735], [1734, 1736, 1826], [1735, 1737], [1673, 1736, 1738], [1737, 1739], [1738, 1740, 1827], [1739, 1741], [1674, 1740, 1742], [1741, 1743], [1742, 1744, 1828], [1743, 1745], [1675, 1744, 1746], [1745, 1747], [1746, 1748, 1829], [1747, 1749], [1676, 1748, 1750], [1749, 1751], [1750, 1752, 1830], [1751, 1753], [1677, 1752, 1754], [1753, 1755], [1754, 1756, 1831], [1755, 1757], [1678, 1756, 1758], [1757, 1759], [1758, 1760, 1832], [1759, 1761], [1679, 1760, 1762], [1761, 1763], [1762, 1764, 1833], [1763, 1765], [1680, 1764, 1766], [1765, 1767], [1766, 1768, 1834], [1767, 1769], [1681, 1768, 1770], [1769, 1771], [1770, 1772, 1835], [1771, 1773], [1682, 1772, 1774], [1773, 1775], [1774, 1776, 1836], [1775, 1777], [1683, 1776, 1778], [1777, 1779], [1778, 1780, 1837], [1779, 1781], [1684, 1780, 1782], [1781, 1783], [1782, 1784, 1838], [1783, 1785], [1685, 1784, 1786], [1785, 1787], [1786, 1788, 1839], [1787, 1789], [1686, 1788, 1790], [1789, 1791], [1790, 1792, 1840], [1791, 1793], [1687, 1792, 1794], [1793, 1795], [1794, 1796, 1841], [1795, 1797], [1688, 1796, 1798], [1797, 1799], [1798, 1800, 1842], [1799, 1801], [1689, 1800, 1802], [1801, 1803], [1802, 1804, 1843], [1803, 1805], [1690, 1804, 1806], [1805, 1807], [1806, 1808, 1844], [1807, 1809], [1691, 1808, 1810], [1809, 1811], [1810, 1812, 1845], [1811, 1813], [1692, 1812, 1814], [1813, 1815], [1814, 1846], [1695, 1849], [1699, 1853], [1703, 1857], [1707, 1861], [1711, 1865], [1715, 1869], [1719, 1873], [1723, 1877], [1727, 1881], [1731, 1885], [1735, 1889], [1739, 1893], [1743, 1897], [1747, 1901], [1751, 1905], [1755, 1909], [1759, 1913], [1763, 1917], [1767, 1921], [1771, 1925], [1775, 1929], [1779, 1933], [1783, 1937], [1787, 1941], [1791, 1945], [1795, 1949], [1799, 1953], [1803, 1957], [1807, 1961], [1811, 1965], [1815, 1969], [1848, 1970], [1847, 1849], [1816, 1848, 1850], [1849, 1851], [1850, 1852, 1971], [1851, 1853], [1817, 1852, 1854], [1853, 1855], [1854, 1856, 1972], [1855, 1857], [1818, 1856, 1858], [1857, 1859], [1858, 1860, 1973], [1859, 1861], [1819, 1860, 1862], [1861, 1863], [1862, 1864, 1974], [1863, 1865], [1820, 1864, 1866], [1865, 1867], [1866, 1868, 1975], [1867, 1869], [1821, 1868, 1870], [1869, 1871], [1870, 1872, 1976], [1871, 1873], [1822, 1872, 1874], [1873, 1875], [1874, 1876, 1977], [1875, 1877], [1823, 1876, 1878], [1877, 1879], [1878, 1880, 1978], [1879, 1881], [1824, 1880, 1882], [1881, 1883], [1882, 1884, 1979], [1883, 1885], [1825, 1884, 1886], [1885, 1887], [1886, 1888, 1980], [1887, 1889], [1826, 1888, 1890], [1889, 1891], [1890, 1892, 1981], [1891, 1893], [1827, 1892, 1894], [1893, 1895], [1894, 1896, 1982], [1895, 1897], [1828, 1896, 1898], [1897, 1899], [1898, 1900, 1983], [1899, 1901], [1829, 1900, 1902], [1901, 1903], [1902, 1904, 1984], [1903, 1905], [1830, 1904, 1906], [1905, 1907], [1906, 1908, 1985], [1907, 1909], [1831, 1908, 1910], [1909, 1911], [1910, 1912, 1986], [1911, 1913], [1832, 1912, 1914], [1913, 1915], [1914, 1916, 1987], [1915, 1917], [1833, 1916, 1918], [1917, 1919], [1918, 1920, 1988], [1919, 1921], [1834, 1920, 1922], [1921, 1923], [1922, 1924, 1989], [1923, 1925], [1835, 1924, 1926], [1925, 1927], [1926, 1928, 1990], [1927, 1929], [1836, 1928, 1930], [1929, 1931], [1930, 1932, 1991], [1931, 1933], [1837, 1932, 1934], [1933, 1935], [1934, 1936, 1992], [1935, 1937], [1838, 1936, 1938], [1937, 1939], [1938, 1940, 1993], [1939, 1941], [1839, 1940, 1942], [1941, 1943], [1942, 1944, 1994], [1943, 1945], [1840, 1944, 1946], [1945, 1947], [1946, 1948, 1995], [1947, 1949], [1841, 1948, 1950], [1949, 1951], [1950, 1952, 1996], [1951, 1953], [1842, 1952, 1954], [1953, 1955], [1954, 1956, 1997], [1955, 1957], [1843, 1956, 1958], [1957, 1959], [1958, 1960, 1998], [1959, 1961], [1844, 1960, 1962], [1961, 1963], [1962, 1964, 1999], [1963, 1965], [1845, 1964, 1966], [1965, 1967], [1966, 1968, 2000], [1967, 1969], [1846, 1968], [1847, 2001], [1851, 2005], [1855, 2009], [1859, 2013], [1863, 2017], [1867, 2021], [1871, 2025], [1875, 2029], [1879, 2033], [1883, 2037], [1887, 2041], [1891, 2045], [1895, 2049], [1899, 2053], [1903, 2057], [1907, 2061], [1911, 2065], [1915, 2069], [1919, 2073], [1923, 2077], [1927, 2081], [1931, 2085], [1935, 2089], [1939, 2093], [1943, 2097], [1947, 2101], [1951, 2105], [1955, 2109], [1959, 2113], [1963, 2117], [1967, 2121], [1970, 2002], [2001, 2003], [2002, 2004, 2124], [2003, 2005], [1971, 2004, 2006], [2005, 2007], [2006, 2008, 2125], [2007, 2009], [1972, 2008, 2010], [2009, 2011], [2010, 2012, 2126], [2011, 2013], [1973, 2012, 2014], [2013, 2015], [2014, 2016, 2127], [2015, 2017], [1974, 2016, 2018], [2017, 2019], [2018, 2020, 2128], [2019, 2021], [1975, 2020, 2022], [2021, 2023], [2022, 2024, 2129], [2023, 2025], [1976, 2024, 2026], [2025, 2027], [2026, 2028, 2130], [2027, 2029], [1977, 2028, 2030], [2029, 2031], [2030, 2032, 2131], [2031, 2033], [1978, 2032, 2034], [2033, 2035], [2034, 2036, 2132], [2035, 2037], [1979, 2036, 2038], [2037, 2039], [2038, 2040, 2133], [2039, 2041], [1980, 2040, 2042], [2041, 2043], [2042, 2044, 2134], [2043, 2045], [1981, 2044, 2046], [2045, 2047], [2046, 2048, 2135], [2047, 2049], [1982, 2048, 2050], [2049, 2051], [2050, 2052, 2136], [2051, 2053], [1983, 2052, 2054], [2053, 2055], [2054, 2056, 2137], [2055, 2057], [1984, 2056, 2058], [2057, 2059], [2058, 2060, 2138], [2059, 2061], [1985, 2060, 2062], [2061, 2063], [2062, 2064, 2139], [2063, 2065], [1986, 2064, 2066], [2065, 2067], [2066, 2068, 2140], [2067, 2069], [1987, 2068, 2070], [2069, 2071], [2070, 2072, 2141], [2071, 2073], [1988, 2072, 2074], [2073, 2075], [2074, 2076, 2142], [2075, 2077], [1989, 2076, 2078], [2077, 2079], [2078, 2080, 2143], [2079, 2081], [1990, 2080, 2082], [2081, 2083], [2082, 2084, 2144], [2083, 2085], [1991, 2084, 2086], [2085, 2087], [2086, 2088, 2145], [2087, 2089], [1992, 2088, 2090], [2089, 2091], [2090, 2092, 2146], [2091, 2093], [1993, 2092, 2094], [2093, 2095], [2094, 2096, 2147], [2095, 2097], [1994, 2096, 2098], [2097, 2099], [2098, 2100, 2148], [2099, 2101], [1995, 2100, 2102], [2101, 2103], [2102, 2104, 2149], [2103, 2105], [1996, 2104, 2106], [2105, 2107], [2106, 2108, 2150], [2107, 2109], [1997, 2108, 2110], [2109, 2111], [2110, 2112, 2151], [2111, 2113], [1998, 2112, 2114], [2113, 2115], [2114, 2116, 2152], [2115, 2117], [1999, 2116, 2118], [2117, 2119], [2118, 2120, 2153], [2119, 2121], [2000, 2120, 2122], [2121, 2123], [2122, 2154], [2003, 2157], [2007, 2161], [2011, 2165], [2015, 2169], [2019, 2173], [2023, 2177], [2027, 2181], [2031, 2185], [2035, 2189], [2039, 2193], [2043, 2197], [2047, 2201], [2051, 2205], [2055, 2209], [2059, 2213], [2063, 2217], [2067, 2221], [2071, 2225], [2075, 2229], [2079, 2233], [2083, 2237], [2087, 2241], [2091, 2245], [2095, 2249], [2099, 2253], [2103, 2257], [2107, 2261], [2111, 2265], [2115, 2269], [2119, 2273], [2123, 2277], [2156, 2278], [2155, 2157], [2124, 2156, 2158], [2157, 2159], [2158, 2160, 2279], [2159, 2161], [2125, 2160, 2162], [2161, 2163], [2162, 2164, 2280], [2163, 2165], [2126, 2164, 2166], [2165, 2167], [2166, 2168, 2281], [2167, 2169], [2127, 2168, 2170], [2169, 2171], [2170, 2172, 2282], [2171, 2173], [2128, 2172, 2174], [2173, 2175], [2174, 2176, 2283], [2175, 2177], [2129, 2176, 2178], [2177, 2179], [2178, 2180, 2284], [2179, 2181], [2130, 2180, 2182], [2181, 2183], [2182, 2184, 2285], [2183, 2185], [2131, 2184, 2186], [2185, 2187], [2186, 2188, 2286], [2187, 2189], [2132, 2188, 2190], [2189, 2191], [2190, 2192, 2287], [2191, 2193], [2133, 2192, 2194], [2193, 2195], [2194, 2196, 2288], [2195, 2197], [2134, 2196, 2198], [2197, 2199], [2198, 2200, 2289], [2199, 2201], [2135, 2200, 2202], [2201, 2203], [2202, 2204, 2290], [2203, 2205], [2136, 2204, 2206], [2205, 2207], [2206, 2208, 2291], [2207, 2209], [2137, 2208, 2210], [2209, 2211], [2210, 2212, 2292], [2211, 2213], [2138, 2212, 2214], [2213, 2215], [2214, 2216, 2293], [2215, 2217], [2139, 2216, 2218], [2217, 2219], [2218, 2220, 2294], [2219, 2221], [2140, 2220, 2222], [2221, 2223], [2222, 2224, 2295], [2223, 2225], [2141, 2224, 2226], [2225, 2227], [2226, 2228, 2296], [2227, 2229], [2142, 2228, 2230], [2229, 2231], [2230, 2232, 2297], [2231, 2233], [2143, 2232, 2234], [2233, 2235], [2234, 2236, 2298], [2235, 2237], [2144, 2236, 2238], [2237, 2239], [2238, 2240, 2299], [2239, 2241], [2145, 2240, 2242], [2241, 2243], [2242, 2244, 2300], [2243, 2245], [2146, 2244, 2246], [2245, 2247], [2246, 2248, 2301], [2247, 2249], [2147, 2248, 2250], [2249, 2251], [2250, 2252, 2302], [2251, 2253], [2148, 2252, 2254], [2253, 2255], [2254, 2256, 2303], [2255, 2257], [2149, 2256, 2258], [2257, 2259], [2258, 2260, 2304], [2259, 2261], [2150, 2260, 2262], [2261, 2263], [2262, 2264, 2305], [2263, 2265], [2151, 2264, 2266], [2265, 2267], [2266, 2268, 2306], [2267, 2269], [2152, 2268, 2270], [2269, 2271], [2270, 2272, 2307], [2271, 2273], [2153, 2272, 2274], [2273, 2275], [2274, 2276, 2308], [2275, 2277], [2154, 2276], [2155, 2309], [2159, 2313], [2163, 2317], [2167, 2321], [2171, 2325], [2175, 2329], [2179, 2333], [2183, 2337], [2187, 2341], [2191, 2345], [2195, 2349], [2199, 2353], [2203, 2357], [2207, 2361], [2211, 2365], [2215, 2369], [2219, 2373], [2223, 2377], [2227, 2381], [2231, 2385], [2235, 2389], [2239, 2393], [2243, 2397], [2247, 2401], [2251, 2405], [2255, 2409], [2259, 2413], [2263, 2417], [2267, 2421], [2271, 2425], [2275, 2429], [2278, 2310], [2309, 2311], [2310, 2312, 2432], [2311, 2313], [2279, 2312, 2314], [2313, 2315], [2314, 2316, 2433], [2315, 2317], [2280, 2316, 2318], [2317, 2319], [2318, 2320, 2434], [2319, 2321], [2281, 2320, 2322], [2321, 2323], [2322, 2324, 2435], [2323, 2325], [2282, 2324, 2326], [2325, 2327], [2326, 2328, 2436], [2327, 2329], [2283, 2328, 2330], [2329, 2331], [2330, 2332, 2437], [2331, 2333], [2284, 2332, 2334], [2333, 2335], [2334, 2336, 2438], [2335, 2337], [2285, 2336, 2338], [2337, 2339], [2338, 2340, 2439], [2339, 2341], [2286, 2340, 2342], [2341, 2343], [2342, 2344, 2440], [2343, 2345], [2287, 2344, 2346], [2345, 2347], [2346, 2348, 2441], [2347, 2349], [2288, 2348, 2350], [2349, 2351], [2350, 2352, 2442], [2351, 2353], [2289, 2352, 2354], [2353, 2355], [2354, 2356, 2443], [2355, 2357], [2290, 2356, 2358], [2357, 2359], [2358, 2360, 2444], [2359, 2361], [2291, 2360, 2362], [2361, 2363], [2362, 2364, 2445], [2363, 2365], [2292, 2364, 2366], [2365, 2367], [2366, 2368, 2446], [2367, 2369], [2293, 2368, 2370], [2369, 2371], [2370, 2372, 2447], [2371, 2373], [2294, 2372, 2374], [2373, 2375], [2374, 2376, 2448], [2375, 2377], [2295, 2376, 2378], [2377, 2379], [2378, 2380, 2449], [2379, 2381], [2296, 2380, 2382], [2381, 2383], [2382, 2384, 2450], [2383, 2385], [2297, 2384, 2386], [2385, 2387], [2386, 2388, 2451], [2387, 2389], [2298, 2388, 2390], [2389, 2391], [2390, 2392, 2452], [2391, 2393], [2299, 2392, 2394], [2393, 2395], [2394, 2396, 2453], [2395, 2397], [2300, 2396, 2398], [2397, 2399], [2398, 2400, 2454], [2399, 2401], [2301, 2400, 2402], [2401, 2403], [2402, 2404, 2455], [2403, 2405], [2302, 2404, 2406], [2405, 2407], [2406, 2408, 2456], [2407, 2409], [2303, 2408, 2410], [2409, 2411], [2410, 2412, 2457], [2411, 2413], [2304, 2412, 2414], [2413, 2415], [2414, 2416, 2458], [2415, 2417], [2305, 2416, 2418], [2417, 2419], [2418, 2420, 2459], [2419, 2421], [2306, 2420, 2422], [2421, 2423], [2422, 2424, 2460], [2423, 2425], [2307, 2424, 2426], [2425, 2427], [2426, 2428, 2461], [2427, 2429], [2308, 2428, 2430], [2429, 2431], [2430, 2462], [2311, 2465], [2315, 2469], [2319, 2473], [2323, 2477], [2327, 2481], [2331, 2485], [2335, 2489], [2339, 2493], [2343, 2497], [2347, 2501], [2351, 2505], [2355, 2509], [2359, 2513], [2363, 2517], [2367, 2521], [2371, 2525], [2375, 2529], [2379, 2533], [2383, 2537], [2387, 2541], [2391, 2545], [2395, 2549], [2399, 2553], [2403, 2557], [2407, 2561], [2411, 2565], [2415, 2569], [2419, 2573], [2423, 2577], [2427, 2581], [2431, 2585], [2464, 2586], [2463, 2465], [2432, 2464, 2466], [2465, 2467], [2466, 2468, 2587], [2467, 2469], [2433, 2468, 2470], [2469, 2471], [2470, 2472, 2588], [2471, 2473], [2434, 2472, 2474], [2473, 2475], [2474, 2476, 2589], [2475, 2477], [2435, 2476, 2478], [2477, 2479], [2478, 2480, 2590], [2479, 2481], [2436, 2480, 2482], [2481, 2483], [2482, 2484, 2591], [2483, 2485], [2437, 2484, 2486], [2485, 2487], [2486, 2488, 2592], [2487, 2489], [2438, 2488, 2490], [2489, 2491], [2490, 2492, 2593], [2491, 2493], [2439, 2492, 2494], [2493, 2495], [2494, 2496, 2594], [2495, 2497], [2440, 2496, 2498], [2497, 2499], [2498, 2500, 2595], [2499, 2501], [2441, 2500, 2502], [2501, 2503], [2502, 2504, 2596], [2503, 2505], [2442, 2504, 2506], [2505, 2507], [2506, 2508, 2597], [2507, 2509], [2443, 2508, 2510], [2509, 2511], [2510, 2512, 2598], [2511, 2513], [2444, 2512, 2514], [2513, 2515], [2514, 2516, 2599], [2515, 2517], [2445, 2516, 2518], [2517, 2519], [2518, 2520, 2600], [2519, 2521], [2446, 2520, 2522], [2521, 2523], [2522, 2524, 2601], [2523, 2525], [2447, 2524, 2526], [2525, 2527], [2526, 2528, 2602], [2527, 2529], [2448, 2528, 2530], [2529, 2531], [2530, 2532, 2603], [2531, 2533], [2449, 2532, 2534], [2533, 2535], [2534, 2536, 2604], [2535, 2537], [2450, 2536, 2538], [2537, 2539], [2538, 2540, 2605], [2539, 2541], [2451, 2540, 2542], [2541, 2543], [2542, 2544, 2606], [2543, 2545], [2452, 2544, 2546], [2545, 2547], [2546, 2548, 2607], [2547, 2549], [2453, 2548, 2550], [2549, 2551], [2550, 2552, 2608], [2551, 2553], [2454, 2552, 2554], [2553, 2555], [2554, 2556, 2609], [2555, 2557], [2455, 2556, 2558], [2557, 2559], [2558, 2560, 2610], [2559, 2561], [2456, 2560, 2562], [2561, 2563], [2562, 2564, 2611], [2563, 2565], [2457, 2564, 2566], [2565, 2567], [2566, 2568, 2612], [2567, 2569], [2458, 2568, 2570], [2569, 2571], [2570, 2572, 2613], [2571, 2573], [2459, 2572, 2574], [2573, 2575], [2574, 2576, 2614], [2575, 2577], [2460, 2576, 2578], [2577, 2579], [2578, 2580, 2615], [2579, 2581], [2461, 2580, 2582], [2581, 2583], [2582, 2584, 2616], [2583, 2585], [2462, 2584], [2463, 2617], [2467, 2621], [2471, 2625], [2475, 2629], [2479, 2633], [2483, 2637], [2487, 2641], [2491, 2645], [2495, 2649], [2499, 2653], [2503, 2657], [2507, 2661], [2511, 2665], [2515, 2669], [2519, 2673], [2523, 2677], [2527, 2681], [2531, 2685], [2535, 2689], [2539, 2693], [2543, 2697], [2547, 2701], [2551, 2705], [2555, 2709], [2559, 2713], [2563, 2717], [2567, 2721], [2571, 2725], [2575, 2729], [2579, 2733], [2583, 2737], [2586, 2618], [2617, 2619], [2618, 2620, 2740], [2619, 2621], [2587, 2620, 2622], [2621, 2623], [2622, 2624, 2741], [2623, 2625], [2588, 2624, 2626], [2625, 2627], [2626, 2628, 2742], [2627, 2629], [2589, 2628, 2630], [2629, 2631], [2630, 2632, 2743], [2631, 2633], [2590, 2632, 2634], [2633, 2635], [2634, 2636, 2744], [2635, 2637], [2591, 2636, 2638], [2637, 2639], [2638, 2640, 2745], [2639, 2641], [2592, 2640, 2642], [2641, 2643], [2642, 2644, 2746], [2643, 2645], [2593, 2644, 2646], [2645, 2647], [2646, 2648, 2747], [2647, 2649], [2594, 2648, 2650], [2649, 2651], [2650, 2652, 2748], [2651, 2653], [2595, 2652, 2654], [2653, 2655], [2654, 2656, 2749], [2655, 2657], [2596, 2656, 2658], [2657, 2659], [2658, 2660, 2750], [2659, 2661], [2597, 2660, 2662], [2661, 2663], [2662, 2664, 2751], [2663, 2665], [2598, 2664, 2666], [2665, 2667], [2666, 2668, 2752], [2667, 2669], [2599, 2668, 2670], [2669, 2671], [2670, 2672, 2753], [2671, 2673], [2600, 2672, 2674], [2673, 2675], [2674, 2676, 2754], [2675, 2677], [2601, 2676, 2678], [2677, 2679], [2678, 2680, 2755], [2679, 2681], [2602, 2680, 2682], [2681, 2683], [2682, 2684, 2756], [2683, 2685], [2603, 2684, 2686], [2685, 2687], [2686, 2688, 2757], [2687, 2689], [2604, 2688, 2690], [2689, 2691], [2690, 2692, 2758], [2691, 2693], [2605, 2692, 2694], [2693, 2695], [2694, 2696, 2759], [2695, 2697], [2606, 2696, 2698], [2697, 2699], [2698, 2700, 2760], [2699, 2701], [2607, 2700, 2702], [2701, 2703], [2702, 2704, 2761], [2703, 2705], [2608, 2704, 2706], [2705, 2707], [2706, 2708, 2762], [2707, 2709], [2609, 2708, 2710], [2709, 2711], [2710, 2712, 2763], [2711, 2713], [2610, 2712, 2714], [2713, 2715], [2714, 2716, 2764], [2715, 2717], [2611, 2716, 2718], [2717, 2719], [2718, 2720, 2765], [2719, 2721], [2612, 2720, 2722], [2721, 2723], [2722, 2724, 2766], [2723, 2725], [2613, 2724, 2726], [2725, 2727], [2726, 2728, 2767], [2727, 2729], [2614, 2728, 2730], [2729, 2731], [2730, 2732, 2768], [2731, 2733], [2615, 2732, 2734], [2733, 2735], [2734, 2736, 2769], [2735, 2737], [2616, 2736, 2738], [2737, 2739], [2738, 2770], [2619, 2773], [2623, 2777], [2627, 2781], [2631, 2785], [2635, 2789], [2639, 2793], [2643, 2797], [2647, 2801], [2651, 2805], [2655, 2809], [2659, 2813], [2663, 2817], [2667, 2821], [2671, 2825], [2675, 2829], [2679, 2833], [2683, 2837], [2687, 2841], [2691, 2845], [2695, 2849], [2699, 2853], [2703, 2857], [2707, 2861], [2711, 2865], [2715, 2869], [2719, 2873], [2723, 2877], [2727, 2881], [2731, 2885], [2735, 2889], [2739, 2893], [2772, 2894], [2771, 2773], [2740, 2772, 2774], [2773, 2775], [2774, 2776, 2895], [2775, 2777], [2741, 2776, 2778], [2777, 2779], [2778, 2780, 2896], [2779, 2781], [2742, 2780, 2782], [2781, 2783], [2782, 2784, 2897], [2783, 2785], [2743, 2784, 2786], [2785, 2787], [2786, 2788, 2898], [2787, 2789], [2744, 2788, 2790], [2789, 2791], [2790, 2792, 2899], [2791, 2793], [2745, 2792, 2794], [2793, 2795], [2794, 2796, 2900], [2795, 2797], [2746, 2796, 2798], [2797, 2799], [2798, 2800, 2901], [2799, 2801], [2747, 2800, 2802], [2801, 2803], [2802, 2804, 2902], [2803, 2805], [2748, 2804, 2806], [2805, 2807], [2806, 2808, 2903], [2807, 2809], [2749, 2808, 2810], [2809, 2811], [2810, 2812, 2904], [2811, 2813], [2750, 2812, 2814], [2813, 2815], [2814, 2816, 2905], [2815, 2817], [2751, 2816, 2818], [2817, 2819], [2818, 2820, 2906], [2819, 2821], [2752, 2820, 2822], [2821, 2823], [2822, 2824, 2907], [2823, 2825], [2753, 2824, 2826], [2825, 2827], [2826, 2828, 2908], [2827, 2829], [2754, 2828, 2830], [2829, 2831], [2830, 2832, 2909], [2831, 2833], [2755, 2832, 2834], [2833, 2835], [2834, 2836, 2910], [2835, 2837], [2756, 2836, 2838], [2837, 2839], [2838, 2840, 2911], [2839, 2841], [2757, 2840, 2842], [2841, 2843], [2842, 2844, 2912], [2843, 2845], [2758, 2844, 2846], [2845, 2847], [2846, 2848, 2913], [2847, 2849], [2759, 2848, 2850], [2849, 2851], [2850, 2852, 2914], [2851, 2853], [2760, 2852, 2854], [2853, 2855], [2854, 2856, 2915], [2855, 2857], [2761, 2856, 2858], [2857, 2859], [2858, 2860, 2916], [2859, 2861], [2762, 2860, 2862], [2861, 2863], [2862, 2864, 2917], [2863, 2865], [2763, 2864, 2866], [2865, 2867], [2866, 2868, 2918], [2867, 2869], [2764, 2868, 2870], [2869, 2871], [2870, 2872, 2919], [2871, 2873], [2765, 2872, 2874], [2873, 2875], [2874, 2876, 2920], [2875, 2877], [2766, 2876, 2878], [2877, 2879], [2878, 2880, 2921], [2879, 2881], [2767, 2880, 2882], [2881, 2883], [2882, 2884, 2922], [2883, 2885], [2768, 2884, 2886], [2885, 2887], [2886, 2888, 2923], [2887, 2889], [2769, 2888, 2890], [2889, 2891], [2890, 2892, 2924], [2891, 2893], [2770, 2892], [2771, 2925], [2775, 2929], [2779, 2933], [2783, 2937], [2787, 2941], [2791, 2945], [2795, 2949], [2799, 2953], [2803, 2957], [2807, 2961], [2811, 2965], [2815, 2969], [2819, 2973], [2823, 2977], [2827, 2981], [2831, 2985], [2835, 2989], [2839, 2993], [2843, 2997], [2847, 3001], [2851, 3005], [2855, 3009], [2859, 3013], [2863, 3017], [2867, 3021], [2871, 3025], [2875, 3029], [2879, 3033], [2883, 3037], [2887, 3041], [2891, 3045], [2894, 2926], [2925, 2927], [2926, 2928, 3048], [2927, 2929], [2895, 2928, 2930], [2929, 2931], [2930, 2932, 3049], [2931, 2933], [2896, 2932, 2934], [2933, 2935], [2934, 2936, 3050], [2935, 2937], [2897, 2936, 2938], [2937, 2939], [2938, 2940, 3051], [2939, 2941], [2898, 2940, 2942], [2941, 2943], [2942, 2944, 3052], [2943, 2945], [2899, 2944, 2946], [2945, 2947], [2946, 2948, 3053], [2947, 2949], [2900, 2948, 2950], [2949, 2951], [2950, 2952, 3054], [2951, 2953], [2901, 2952, 2954], [2953, 2955], [2954, 2956, 3055], [2955, 2957], [2902, 2956, 2958], [2957, 2959], [2958, 2960, 3056], [2959, 2961], [2903, 2960, 2962], [2961, 2963], [2962, 2964, 3057], [2963, 2965], [2904, 2964, 2966], [2965, 2967], [2966, 2968, 3058], [2967, 2969], [2905, 2968, 2970], [2969, 2971], [2970, 2972, 3059], [2971, 2973], [2906, 2972, 2974], [2973, 2975], [2974, 2976, 3060], [2975, 2977], [2907, 2976, 2978], [2977, 2979], [2978, 2980, 3061], [2979, 2981], [2908, 2980, 2982], [2981, 2983], [2982, 2984, 3062], [2983, 2985], [2909, 2984, 2986], [2985, 2987], [2986, 2988, 3063], [2987, 2989], [2910, 2988, 2990], [2989, 2991], [2990, 2992, 3064], [2991, 2993], [2911, 2992, 2994], [2993, 2995], [2994, 2996, 3065], [2995, 2997], [2912, 2996, 2998], [2997, 2999], [2998, 3000, 3066], [2999, 3001], [2913, 3000, 3002], [3001, 3003], [3002, 3004, 3067], [3003, 3005], [2914, 3004, 3006], [3005, 3007], [3006, 3008, 3068], [3007, 3009], [2915, 3008, 3010], [3009, 3011], [3010, 3012, 3069], [3011, 3013], [2916, 3012, 3014], [3013, 3015], [3014, 3016, 3070], [3015, 3017], [2917, 3016, 3018], [3017, 3019], [3018, 3020, 3071], [3019, 3021], [2918, 3020, 3022], [3021, 3023], [3022, 3024, 3072], [3023, 3025], [2919, 3024, 3026], [3025, 3027], [3026, 3028, 3073], [3027, 3029], [2920, 3028, 3030], [3029, 3031], [3030, 3032, 3074], [3031, 3033], [2921, 3032, 3034], [3033, 3035], [3034, 3036, 3075], [3035, 3037], [2922, 3036, 3038], [3037, 3039], [3038, 3040, 3076], [3039, 3041], [2923, 3040, 3042], [3041, 3043], [3042, 3044, 3077], [3043, 3045], [2924, 3044, 3046], [3045, 3047], [3046, 3078], [2927, 3081], [2931, 3085], [2935, 3089], [2939, 3093], [2943, 3097], [2947, 3101], [2951, 3105], [2955, 3109], [2959, 3113], [2963, 3117], [2967, 3121], [2971, 3125], [2975, 3129], [2979, 3133], [2983, 3137], [2987, 3141], [2991, 3145], [2995, 3149], [2999, 3153], [3003, 3157], [3007, 3161], [3011, 3165], [3015, 3169], [3019, 3173], [3023, 3177], [3027, 3181], [3031, 3185], [3035, 3189], [3039, 3193], [3043, 3197], [3047, 3201], [3080, 3202], [3079, 3081], [3048, 3080, 3082], [3081, 3083], [3082, 3084, 3203], [3083, 3085], [3049, 3084, 3086], [3085, 3087], [3086, 3088, 3204], [3087, 3089], [3050, 3088, 3090], [3089, 3091], [3090, 3092, 3205], [3091, 3093], [3051, 3092, 3094], [3093, 3095], [3094, 3096, 3206], [3095, 3097], [3052, 3096, 3098], [3097, 3099], [3098, 3100, 3207], [3099, 3101], [3053, 3100, 3102], [3101, 3103], [3102, 3104, 3208], [3103, 3105], [3054, 3104, 3106], [3105, 3107], [3106, 3108, 3209], [3107, 3109], [3055, 3108, 3110], [3109, 3111], [3110, 3112, 3210], [3111, 3113], [3056, 3112, 3114], [3113, 3115], [3114, 3116, 3211], [3115, 3117], [3057, 3116, 3118], [3117, 3119], [3118, 3120, 3212], [3119, 3121], [3058, 3120, 3122], [3121, 3123], [3122, 3124, 3213], [3123, 3125], [3059, 3124, 3126], [3125, 3127], [3126, 3128, 3214], [3127, 3129], [3060, 3128, 3130], [3129, 3131], [3130, 3132, 3215], [3131, 3133], [3061, 3132, 3134], [3133, 3135], [3134, 3136, 3216], [3135, 3137], [3062, 3136, 3138], [3137, 3139], [3138, 3140, 3217], [3139, 3141], [3063, 3140, 3142], [3141, 3143], [3142, 3144, 3218], [3143, 3145], [3064, 3144, 3146], [3145, 3147], [3146, 3148, 3219], [3147, 3149], [3065, 3148, 3150], [3149, 3151], [3150, 3152, 3220], [3151, 3153], [3066, 3152, 3154], [3153, 3155], [3154, 3156, 3221], [3155, 3157], [3067, 3156, 3158], [3157, 3159], [3158, 3160, 3222], [3159, 3161], [3068, 3160, 3162], [3161, 3163], [3162, 3164, 3223], [3163, 3165], [3069, 3164, 3166], [3165, 3167], [3166, 3168, 3224], [3167, 3169], [3070, 3168, 3170], [3169, 3171], [3170, 3172, 3225], [3171, 3173], [3071, 3172, 3174], [3173, 3175], [3174, 3176, 3226], [3175, 3177], [3072, 3176, 3178], [3177, 3179], [3178, 3180, 3227], [3179, 3181], [3073, 3180, 3182], [3181, 3183], [3182, 3184, 3228], [3183, 3185], [3074, 3184, 3186], [3185, 3187], [3186, 3188, 3229], [3187, 3189], [3075, 3188, 3190], [3189, 3191], [3190, 3192, 3230], [3191, 3193], [3076, 3192, 3194], [3193, 3195], [3194, 3196, 3231], [3195, 3197], [3077, 3196, 3198], [3197, 3199], [3198, 3200, 3232], [3199, 3201], [3078, 3200], [3079, 3233], [3083, 3237], [3087, 3241], [3091, 3245], [3095, 3249], [3099, 3253], [3103, 3257], [3107, 3261], [3111, 3265], [3115, 3269], [3119, 3273], [3123, 3277], [3127, 3281], [3131, 3285], [3135, 3289], [3139, 3293], [3143, 3297], [3147, 3301], [3151, 3305], [3155, 3309], [3159, 3313], [3163, 3317], [3167, 3321], [3171, 3325], [3175, 3329], [3179, 3333], [3183, 3337], [3187, 3341], [3191, 3345], [3195, 3349], [3199, 3353], [3202, 3234], [3233, 3235], [3234, 3236, 3356], [3235, 3237], [3203, 3236, 3238], [3237, 3239], [3238, 3240, 3357], [3239, 3241], [3204, 3240, 3242], [3241, 3243], [3242, 3244, 3358], [3243, 3245], [3205, 3244, 3246], [3245, 3247], [3246, 3248, 3359], [3247, 3249], [3206, 3248, 3250], [3249, 3251], [3250, 3252, 3360], [3251, 3253], [3207, 3252, 3254], [3253, 3255], [3254, 3256, 3361], [3255, 3257], [3208, 3256, 3258], [3257, 3259], [3258, 3260, 3362], [3259, 3261], [3209, 3260, 3262], [3261, 3263], [3262, 3264, 3363], [3263, 3265], [3210, 3264, 3266], [3265, 3267], [3266, 3268, 3364], [3267, 3269], [3211, 3268, 3270], [3269, 3271], [3270, 3272, 3365], [3271, 3273], [3212, 3272, 3274], [3273, 3275], [3274, 3276, 3366], [3275, 3277], [3213, 3276, 3278], [3277, 3279], [3278, 3280, 3367], [3279, 3281], [3214, 3280, 3282], [3281, 3283], [3282, 3284, 3368], [3283, 3285], [3215, 3284, 3286], [3285, 3287], [3286, 3288, 3369], [3287, 3289], [3216, 3288, 3290], [3289, 3291], [3290, 3292, 3370], [3291, 3293], [3217, 3292, 3294], [3293, 3295], [3294, 3296, 3371], [3295, 3297], [3218, 3296, 3298], [3297, 3299], [3298, 3300, 3372], [3299, 3301], [3219, 3300, 3302], [3301, 3303], [3302, 3304, 3373], [3303, 3305], [3220, 3304, 3306], [3305, 3307], [3306, 3308, 3374], [3307, 3309], [3221, 3308, 3310], [3309, 3311], [3310, 3312, 3375], [3311, 3313], [3222, 3312, 3314], [3313, 3315], [3314, 3316, 3376], [3315, 3317], [3223, 3316, 3318], [3317, 3319], [3318, 3320, 3377], [3319, 3321], [3224, 3320, 3322], [3321, 3323], [3322, 3324, 3378], [3323, 3325], [3225, 3324, 3326], [3325, 3327], [3326, 3328, 3379], [3327, 3329], [3226, 3328, 3330], [3329, 3331], [3330, 3332, 3380], [3331, 3333], [3227, 3332, 3334], [3333, 3335], [3334, 3336, 3381], [3335, 3337], [3228, 3336, 3338], [3337, 3339], [3338, 3340, 3382], [3339, 3341], [3229, 3340, 3342], [3341, 3343], [3342, 3344, 3383], [3343, 3345], [3230, 3344, 3346], [3345, 3347], [3346, 3348, 3384], [3347, 3349], [3231, 3348, 3350], [3349, 3351], [3350, 3352, 3385], [3351, 3353], [3232, 3352, 3354], [3353, 3355], [3354, 3386], [3235, 3389], [3239, 3393], [3243, 3397], [3247, 3401], [3251, 3405], [3255, 3409], [3259, 3413], [3263, 3417], [3267, 3421], [3271, 3425], [3275, 3429], [3279, 3433], [3283, 3437], [3287, 3441], [3291, 3445], [3295, 3449], [3299, 3453], [3303, 3457], [3307, 3461], [3311, 3465], [3315, 3469], [3319, 3473], [3323, 3477], [3327, 3481], [3331, 3485], [3335, 3489], [3339, 3493], [3343, 3497], [3347, 3501], [3351, 3505], [3355, 3509], [3388, 3510], [3387, 3389], [3356, 3388, 3390], [3389, 3391], [3390, 3392, 3511], [3391, 3393], [3357, 3392, 3394], [3393, 3395], [3394, 3396, 3512], [3395, 3397], [3358, 3396, 3398], [3397, 3399], [3398, 3400, 3513], [3399, 3401], [3359, 3400, 3402], [3401, 3403], [3402, 3404, 3514], [3403, 3405], [3360, 3404, 3406], [3405, 3407], [3406, 3408, 3515], [3407, 3409], [3361, 3408, 3410], [3409, 3411], [3410, 3412, 3516], [3411, 3413], [3362, 3412, 3414], [3413, 3415], [3414, 3416, 3517], [3415, 3417], [3363, 3416, 3418], [3417, 3419], [3418, 3420, 3518], [3419, 3421], [3364, 3420, 3422], [3421, 3423], [3422, 3424, 3519], [3423, 3425], [3365, 3424, 3426], [3425, 3427], [3426, 3428, 3520], [3427, 3429], [3366, 3428, 3430], [3429, 3431], [3430, 3432, 3521], [3431, 3433], [3367, 3432, 3434], [3433, 3435], [3434, 3436, 3522], [3435, 3437], [3368, 3436, 3438], [3437, 3439], [3438, 3440, 3523], [3439, 3441], [3369, 3440, 3442], [3441, 3443], [3442, 3444, 3524], [3443, 3445], [3370, 3444, 3446], [3445, 3447], [3446, 3448, 3525], [3447, 3449], [3371, 3448, 3450], [3449, 3451], [3450, 3452, 3526], [3451, 3453], [3372, 3452, 3454], [3453, 3455], [3454, 3456, 3527], [3455, 3457], [3373, 3456, 3458], [3457, 3459], [3458, 3460, 3528], [3459, 3461], [3374, 3460, 3462], [3461, 3463], [3462, 3464, 3529], [3463, 3465], [3375, 3464, 3466], [3465, 3467], [3466, 3468, 3530], [3467, 3469], [3376, 3468, 3470], [3469, 3471], [3470, 3472, 3531], [3471, 3473], [3377, 3472, 3474], [3473, 3475], [3474, 3476, 3532], [3475, 3477], [3378, 3476, 3478], [3477, 3479], [3478, 3480, 3533], [3479, 3481], [3379, 3480, 3482], [3481, 3483], [3482, 3484, 3534], [3483, 3485], [3380, 3484, 3486], [3485, 3487], [3486, 3488, 3535], [3487, 3489], [3381, 3488, 3490], [3489, 3491], [3490, 3492, 3536], [3491, 3493], [3382, 3492, 3494], [3493, 3495], [3494, 3496, 3537], [3495, 3497], [3383, 3496, 3498], [3497, 3499], [3498, 3500, 3538], [3499, 3501], [3384, 3500, 3502], [3501, 3503], [3502, 3504, 3539], [3503, 3505], [3385, 3504, 3506], [3505, 3507], [3506, 3508, 3540], [3507, 3509], [3386, 3508], [3387, 3541], [3391, 3545], [3395, 3549], [3399, 3553], [3403, 3557], [3407, 3561], [3411, 3565], [3415, 3569], [3419, 3573], [3423, 3577], [3427, 3581], [3431, 3585], [3435, 3589], [3439, 3593], [3443, 3597], [3447, 3601], [3451, 3605], [3455, 3609], [3459, 3613], [3463, 3617], [3467, 3621], [3471, 3625], [3475, 3629], [3479, 3633], [3483, 3637], [3487, 3641], [3491, 3645], [3495, 3649], [3499, 3653], [3503, 3657], [3507, 3661], [3510, 3542], [3541, 3543], [3542, 3544, 3664], [3543, 3545], [3511, 3544, 3546], [3545, 3547], [3546, 3548, 3665], [3547, 3549], [3512, 3548, 3550], [3549, 3551], [3550, 3552, 3666], [3551, 3553], [3513, 3552, 3554], [3553, 3555], [3554, 3556, 3667], [3555, 3557], [3514, 3556, 3558], [3557, 3559], [3558, 3560, 3668], [3559, 3561], [3515, 3560, 3562], [3561, 3563], [3562, 3564, 3669], [3563, 3565], [3516, 3564, 3566], [3565, 3567], [3566, 3568, 3670], [3567, 3569], [3517, 3568, 3570], [3569, 3571], [3570, 3572, 3671], [3571, 3573], [3518, 3572, 3574], [3573, 3575], [3574, 3576, 3672], [3575, 3577], [3519, 3576, 3578], [3577, 3579], [3578, 3580, 3673], [3579, 3581], [3520, 3580, 3582], [3581, 3583], [3582, 3584, 3674], [3583, 3585], [3521, 3584, 3586], [3585, 3587], [3586, 3588, 3675], [3587, 3589], [3522, 3588, 3590], [3589, 3591], [3590, 3592, 3676], [3591, 3593], [3523, 3592, 3594], [3593, 3595], [3594, 3596, 3677], [3595, 3597], [3524, 3596, 3598], [3597, 3599], [3598, 3600, 3678], [3599, 3601], [3525, 3600, 3602], [3601, 3603], [3602, 3604, 3679], [3603, 3605], [3526, 3604, 3606], [3605, 3607], [3606, 3608, 3680], [3607, 3609], [3527, 3608, 3610], [3609, 3611], [3610, 3612, 3681], [3611, 3613], [3528, 3612, 3614], [3613, 3615], [3614, 3616, 3682], [3615, 3617], [3529, 3616, 3618], [3617, 3619], [3618, 3620, 3683], [3619, 3621], [3530, 3620, 3622], [3621, 3623], [3622, 3624, 3684], [3623, 3625], [3531, 3624, 3626], [3625, 3627], [3626, 3628, 3685], [3627, 3629], [3532, 3628, 3630], [3629, 3631], [3630, 3632, 3686], [3631, 3633], [3533, 3632, 3634], [3633, 3635], [3634, 3636, 3687], [3635, 3637], [3534, 3636, 3638], [3637, 3639], [3638, 3640, 3688], [3639, 3641], [3535, 3640, 3642], [3641, 3643], [3642, 3644, 3689], [3643, 3645], [3536, 3644, 3646], [3645, 3647], [3646, 3648, 3690], [3647, 3649], [3537, 3648, 3650], [3649, 3651], [3650, 3652, 3691], [3651, 3653], [3538, 3652, 3654], [3653, 3655], [3654, 3656, 3692], [3655, 3657], [3539, 3656, 3658], [3657, 3659], [3658, 3660, 3693], [3659, 3661], [3540, 3660, 3662], [3661, 3663], [3662, 3694], [3543, 3697], [3547, 3701], [3551, 3705], [3555, 3709], [3559, 3713], [3563, 3717], [3567, 3721], [3571, 3725], [3575, 3729], [3579, 3733], [3583, 3737], [3587, 3741], [3591, 3745], [3595, 3749], [3599, 3753], [3603, 3757], [3607, 3761], [3611, 3765], [3615, 3769], [3619, 3773], [3623, 3777], [3627, 3781], [3631, 3785], [3635, 3789], [3639, 3793], [3643, 3797], [3647, 3801], [3651, 3805], [3655, 3809], [3659, 3813], [3663, 3817], [3696, 3818], [3695, 3697], [3664, 3696, 3698], [3697, 3699], [3698, 3700, 3819], [3699, 3701], [3665, 3700, 3702], [3701, 3703], [3702, 3704, 3820], [3703, 3705], [3666, 3704, 3706], [3705, 3707], [3706, 3708, 3821], [3707, 3709], [3667, 3708, 3710], [3709, 3711], [3710, 3712, 3822], [3711, 3713], [3668, 3712, 3714], [3713, 3715], [3714, 3716, 3823], [3715, 3717], [3669, 3716, 3718], [3717, 3719], [3718, 3720, 3824], [3719, 3721], [3670, 3720, 3722], [3721, 3723], [3722, 3724, 3825], [3723, 3725], [3671, 3724, 3726], [3725, 3727], [3726, 3728, 3826], [3727, 3729], [3672, 3728, 3730], [3729, 3731], [3730, 3732, 3827], [3731, 3733], [3673, 3732, 3734], [3733, 3735], [3734, 3736, 3828], [3735, 3737], [3674, 3736, 3738], [3737, 3739], [3738, 3740, 3829], [3739, 3741], [3675, 3740, 3742], [3741, 3743], [3742, 3744, 3830], [3743, 3745], [3676, 3744, 3746], [3745, 3747], [3746, 3748, 3831], [3747, 3749], [3677, 3748, 3750], [3749, 3751], [3750, 3752, 3832], [3751, 3753], [3678, 3752, 3754], [3753, 3755], [3754, 3756, 3833], [3755, 3757], [3679, 3756, 3758], [3757, 3759], [3758, 3760, 3834], [3759, 3761], [3680, 3760, 3762], [3761, 3763], [3762, 3764, 3835], [3763, 3765], [3681, 3764, 3766], [3765, 3767], [3766, 3768, 3836], [3767, 3769], [3682, 3768, 3770], [3769, 3771], [3770, 3772, 3837], [3771, 3773], [3683, 3772, 3774], [3773, 3775], [3774, 3776, 3838], [3775, 3777], [3684, 3776, 3778], [3777, 3779], [3778, 3780, 3839], [3779, 3781], [3685, 3780, 3782], [3781, 3783], [3782, 3784, 3840], [3783, 3785], [3686, 3784, 3786], [3785, 3787], [3786, 3788, 3841], [3787, 3789], [3687, 3788, 3790], [3789, 3791], [3790, 3792, 3842], [3791, 3793], [3688, 3792, 3794], [3793, 3795], [3794, 3796, 3843], [3795, 3797], [3689, 3796, 3798], [3797, 3799], [3798, 3800, 3844], [3799, 3801], [3690, 3800, 3802], [3801, 3803], [3802, 3804, 3845], [3803, 3805], [3691, 3804, 3806], [3805, 3807], [3806, 3808, 3846], [3807, 3809], [3692, 3808, 3810], [3809, 3811], [3810, 3812, 3847], [3811, 3813], [3693, 3812, 3814], [3813, 3815], [3814, 3816, 3848], [3815, 3817], [3694, 3816], [3695, 3849], [3699, 3853], [3703, 3857], [3707, 3861], [3711, 3865], [3715, 3869], [3719, 3873], [3723, 3877], [3727, 3881], [3731, 3885], [3735, 3889], [3739, 3893], [3743, 3897], [3747, 3901], [3751, 3905], [3755, 3909], [3759, 3913], [3763, 3917], [3767, 3921], [3771, 3925], [3775, 3929], [3779, 3933], [3783, 3937], [3787, 3941], [3791, 3945], [3795, 3949], [3799, 3953], [3803, 3957], [3807, 3961], [3811, 3965], [3815, 3969], [3818, 3850], [3849, 3851], [3850, 3852, 3972], [3851, 3853], [3819, 3852, 3854], [3853, 3855], [3854, 3856, 3973], [3855, 3857], [3820, 3856, 3858], [3857, 3859], [3858, 3860, 3974], [3859, 3861], [3821, 3860, 3862], [3861, 3863], [3862, 3864, 3975], [3863, 3865], [3822, 3864, 3866], [3865, 3867], [3866, 3868, 3976], [3867, 3869], [3823, 3868, 3870], [3869, 3871], [3870, 3872, 3977], [3871, 3873], [3824, 3872, 3874], [3873, 3875], [3874, 3876, 3978], [3875, 3877], [3825, 3876, 3878], [3877, 3879], [3878, 3880, 3979], [3879, 3881], [3826, 3880, 3882], [3881, 3883], [3882, 3884, 3980], [3883, 3885], [3827, 3884, 3886], [3885, 3887], [3886, 3888, 3981], [3887, 3889], [3828, 3888, 3890], [3889, 3891], [3890, 3892, 3982], [3891, 3893], [3829, 3892, 3894], [3893, 3895], [3894, 3896, 3983], [3895, 3897], [3830, 3896, 3898], [3897, 3899], [3898, 3900, 3984], [3899, 3901], [3831, 3900, 3902], [3901, 3903], [3902, 3904, 3985], [3903, 3905], [3832, 3904, 3906], [3905, 3907], [3906, 3908, 3986], [3907, 3909], [3833, 3908, 3910], [3909, 3911], [3910, 3912, 3987], [3911, 3913], [3834, 3912, 3914], [3913, 3915], [3914, 3916, 3988], [3915, 3917], [3835, 3916, 3918], [3917, 3919], [3918, 3920, 3989], [3919, 3921], [3836, 3920, 3922], [3921, 3923], [3922, 3924, 3990], [3923, 3925], [3837, 3924, 3926], [3925, 3927], [3926, 3928, 3991], [3927, 3929], [3838, 3928, 3930], [3929, 3931], [3930, 3932, 3992], [3931, 3933], [3839, 3932, 3934], [3933, 3935], [3934, 3936, 3993], [3935, 3937], [3840, 3936, 3938], [3937, 3939], [3938, 3940, 3994], [3939, 3941], [3841, 3940, 3942], [3941, 3943], [3942, 3944, 3995], [3943, 3945], [3842, 3944, 3946], [3945, 3947], [3946, 3948, 3996], [3947, 3949], [3843, 3948, 3950], [3949, 3951], [3950, 3952, 3997], [3951, 3953], [3844, 3952, 3954], [3953, 3955], [3954, 3956, 3998], [3955, 3957], [3845, 3956, 3958], [3957, 3959], [3958, 3960, 3999], [3959, 3961], [3846, 3960, 3962], [3961, 3963], [3962, 3964, 4000], [3963, 3965], [3847, 3964, 3966], [3965, 3967], [3966, 3968, 4001], [3967, 3969], [3848, 3968, 3970], [3969, 3971], [3970, 4002], [3851, 4005], [3855, 4009], [3859, 4013], [3863, 4017], [3867, 4021], [3871, 4025], [3875, 4029], [3879, 4033], [3883, 4037], [3887, 4041], [3891, 4045], [3895, 4049], [3899, 4053], [3903, 4057], [3907, 4061], [3911, 4065], [3915, 4069], [3919, 4073], [3923, 4077], [3927, 4081], [3931, 4085], [3935, 4089], [3939, 4093], [3943, 4097], [3947, 4101], [3951, 4105], [3955, 4109], [3959, 4113], [3963, 4117], [3967, 4121], [3971, 4125], [4004, 4126], [4003, 4005], [3972, 4004, 4006], [4005, 4007], [4006, 4008, 4127], [4007, 4009], [3973, 4008, 4010], [4009, 4011], [4010, 4012, 4128], [4011, 4013], [3974, 4012, 4014], [4013, 4015], [4014, 4016, 4129], [4015, 4017], [3975, 4016, 4018], [4017, 4019], [4018, 4020, 4130], [4019, 4021], [3976, 4020, 4022], [4021, 4023], [4022, 4024, 4131], [4023, 4025], [3977, 4024, 4026], [4025, 4027], [4026, 4028, 4132], [4027, 4029], [3978, 4028, 4030], [4029, 4031], [4030, 4032, 4133], [4031, 4033], [3979, 4032, 4034], [4033, 4035], [4034, 4036, 4134], [4035, 4037], [3980, 4036, 4038], [4037, 4039], [4038, 4040, 4135], [4039, 4041], [3981, 4040, 4042], [4041, 4043], [4042, 4044, 4136], [4043, 4045], [3982, 4044, 4046], [4045, 4047], [4046, 4048, 4137], [4047, 4049], [3983, 4048, 4050], [4049, 4051], [4050, 4052, 4138], [4051, 4053], [3984, 4052, 4054], [4053, 4055], [4054, 4056, 4139], [4055, 4057], [3985, 4056, 4058], [4057, 4059], [4058, 4060, 4140], [4059, 4061], [3986, 4060, 4062], [4061, 4063], [4062, 4064, 4141], [4063, 4065], [3987, 4064, 4066], [4065, 4067], [4066, 4068, 4142], [4067, 4069], [3988, 4068, 4070], [4069, 4071], [4070, 4072, 4143], [4071, 4073], [3989, 4072, 4074], [4073, 4075], [4074, 4076, 4144], [4075, 4077], [3990, 4076, 4078], [4077, 4079], [4078, 4080, 4145], [4079, 4081], [3991, 4080, 4082], [4081, 4083], [4082, 4084, 4146], [4083, 4085], [3992, 4084, 4086], [4085, 4087], [4086, 4088, 4147], [4087, 4089], [3993, 4088, 4090], [4089, 4091], [4090, 4092, 4148], [4091, 4093], [3994, 4092, 4094], [4093, 4095], [4094, 4096, 4149], [4095, 4097], [3995, 4096, 4098], [4097, 4099], [4098, 4100, 4150], [4099, 4101], [3996, 4100, 4102], [4101, 4103], [4102, 4104, 4151], [4103, 4105], [3997, 4104, 4106], [4105, 4107], [4106, 4108, 4152], [4107, 4109], [3998, 4108, 4110], [4109, 4111], [4110, 4112, 4153], [4111, 4113], [3999, 4112, 4114], [4113, 4115], [4114, 4116, 4154], [4115, 4117], [4000, 4116, 4118], [4117, 4119], [4118, 4120, 4155], [4119, 4121], [4001, 4120, 4122], [4121, 4123], [4122, 4124, 4156], [4123, 4125], [4002, 4124], [4003, 4157], [4007, 4161], [4011, 4165], [4015, 4169], [4019, 4173], [4023, 4177], [4027, 4181], [4031, 4185], [4035, 4189], [4039, 4193], [4043, 4197], [4047, 4201], [4051, 4205], [4055, 4209], [4059, 4213], [4063, 4217], [4067, 4221], [4071, 4225], [4075, 4229], [4079, 4233], [4083, 4237], [4087, 4241], [4091, 4245], [4095, 4249], [4099, 4253], [4103, 4257], [4107, 4261], [4111, 4265], [4115, 4269], [4119, 4273], [4123, 4277], [4126, 4158], [4157, 4159], [4158, 4160, 4280], [4159, 4161], [4127, 4160, 4162], [4161, 4163], [4162, 4164, 4281], [4163, 4165], [4128, 4164, 4166], [4165, 4167], [4166, 4168, 4282], [4167, 4169], [4129, 4168, 4170], [4169, 4171], [4170, 4172, 4283], [4171, 4173], [4130, 4172, 4174], [4173, 4175], [4174, 4176, 4284], [4175, 4177], [4131, 4176, 4178], [4177, 4179], [4178, 4180, 4285], [4179, 4181], [4132, 4180, 4182], [4181, 4183], [4182, 4184, 4286], [4183, 4185], [4133, 4184, 4186], [4185, 4187], [4186, 4188, 4287], [4187, 4189], [4134, 4188, 4190], [4189, 4191], [4190, 4192, 4288], [4191, 4193], [4135, 4192, 4194], [4193, 4195], [4194, 4196, 4289], [4195, 4197], [4136, 4196, 4198], [4197, 4199], [4198, 4200, 4290], [4199, 4201], [4137, 4200, 4202], [4201, 4203], [4202, 4204, 4291], [4203, 4205], [4138, 4204, 4206], [4205, 4207], [4206, 4208, 4292], [4207, 4209], [4139, 4208, 4210], [4209, 4211], [4210, 4212, 4293], [4211, 4213], [4140, 4212, 4214], [4213, 4215], [4214, 4216, 4294], [4215, 4217], [4141, 4216, 4218], [4217, 4219], [4218, 4220, 4295], [4219, 4221], [4142, 4220, 4222], [4221, 4223], [4222, 4224, 4296], [4223, 4225], [4143, 4224, 4226], [4225, 4227], [4226, 4228, 4297], [4227, 4229], [4144, 4228, 4230], [4229, 4231], [4230, 4232, 4298], [4231, 4233], [4145, 4232, 4234], [4233, 4235], [4234, 4236, 4299], [4235, 4237], [4146, 4236, 4238], [4237, 4239], [4238, 4240, 4300], [4239, 4241], [4147, 4240, 4242], [4241, 4243], [4242, 4244, 4301], [4243, 4245], [4148, 4244, 4246], [4245, 4247], [4246, 4248, 4302], [4247, 4249], [4149, 4248, 4250], [4249, 4251], [4250, 4252, 4303], [4251, 4253], [4150, 4252, 4254], [4253, 4255], [4254, 4256, 4304], [4255, 4257], [4151, 4256, 4258], [4257, 4259], [4258, 4260, 4305], [4259, 4261], [4152, 4260, 4262], [4261, 4263], [4262, 4264, 4306], [4263, 4265], [4153, 4264, 4266], [4265, 4267], [4266, 4268, 4307], [4267, 4269], [4154, 4268, 4270], [4269, 4271], [4270, 4272, 4308], [4271, 4273], [4155, 4272, 4274], [4273, 4275], [4274, 4276, 4309], [4275, 4277], [4156, 4276, 4278], [4277, 4279], [4278, 4310], [4159, 4313], [4163, 4317], [4167, 4321], [4171, 4325], [4175, 4329], [4179, 4333], [4183, 4337], [4187, 4341], [4191, 4345], [4195, 4349], [4199, 4353], [4203, 4357], [4207, 4361], [4211, 4365], [4215, 4369], [4219, 4373], [4223, 4377], [4227, 4381], [4231, 4385], [4235, 4389], [4239, 4393], [4243, 4397], [4247, 4401], [4251, 4405], [4255, 4409], [4259, 4413], [4263, 4417], [4267, 4421], [4271, 4425], [4275, 4429], [4279, 4433], [4312, 4434], [4311, 4313], [4280, 4312, 4314], [4313, 4315], [4314, 4316, 4435], [4315, 4317], [4281, 4316, 4318], [4317, 4319], [4318, 4320, 4436], [4319, 4321], [4282, 4320, 4322], [4321, 4323], [4322, 4324, 4437], [4323, 4325], [4283, 4324, 4326], [4325, 4327], [4326, 4328, 4438], [4327, 4329], [4284, 4328, 4330], [4329, 4331], [4330, 4332, 4439], [4331, 4333], [4285, 4332, 4334], [4333, 4335], [4334, 4336, 4440], [4335, 4337], [4286, 4336, 4338], [4337, 4339], [4338, 4340, 4441], [4339, 4341], [4287, 4340, 4342], [4341, 4343], [4342, 4344, 4442], [4343, 4345], [4288, 4344, 4346], [4345, 4347], [4346, 4348, 4443], [4347, 4349], [4289, 4348, 4350], [4349, 4351], [4350, 4352, 4444], [4351, 4353], [4290, 4352, 4354], [4353, 4355], [4354, 4356, 4445], [4355, 4357], [4291, 4356, 4358], [4357, 4359], [4358, 4360, 4446], [4359, 4361], [4292, 4360, 4362], [4361, 4363], [4362, 4364, 4447], [4363, 4365], [4293, 4364, 4366], [4365, 4367], [4366, 4368, 4448], [4367, 4369], [4294, 4368, 4370], [4369, 4371], [4370, 4372, 4449], [4371, 4373], [4295, 4372, 4374], [4373, 4375], [4374, 4376, 4450], [4375, 4377], [4296, 4376, 4378], [4377, 4379], [4378, 4380, 4451], [4379, 4381], [4297, 4380, 4382], [4381, 4383], [4382, 4384, 4452], [4383, 4385], [4298, 4384, 4386], [4385, 4387], [4386, 4388, 4453], [4387, 4389], [4299, 4388, 4390], [4389, 4391], [4390, 4392, 4454], [4391, 4393], [4300, 4392, 4394], [4393, 4395], [4394, 4396, 4455], [4395, 4397], [4301, 4396, 4398], [4397, 4399], [4398, 4400, 4456], [4399, 4401], [4302, 4400, 4402], [4401, 4403], [4402, 4404, 4457], [4403, 4405], [4303, 4404, 4406], [4405, 4407], [4406, 4408, 4458], [4407, 4409], [4304, 4408, 4410], [4409, 4411], [4410, 4412, 4459], [4411, 4413], [4305, 4412, 4414], [4413, 4415], [4414, 4416, 4460], [4415, 4417], [4306, 4416, 4418], [4417, 4419], [4418, 4420, 4461], [4419, 4421], [4307, 4420, 4422], [4421, 4423], [4422, 4424, 4462], [4423, 4425], [4308, 4424, 4426], [4425, 4427], [4426, 4428, 4463], [4427, 4429], [4309, 4428, 4430], [4429, 4431], [4430, 4432, 4464], [4431, 4433], [4310, 4432], [4311, 4465], [4315, 4469], [4319, 4473], [4323, 4477], [4327, 4481], [4331, 4485], [4335, 4489], [4339, 4493], [4343, 4497], [4347, 4501], [4351, 4505], [4355, 4509], [4359, 4513], [4363, 4517], [4367, 4521], [4371, 4525], [4375, 4529], [4379, 4533], [4383, 4537], [4387, 4541], [4391, 4545], [4395, 4549], [4399, 4553], [4403, 4557], [4407, 4561], [4411, 4565], [4415, 4569], [4419, 4573], [4423, 4577], [4427, 4581], [4431, 4585], [4434, 4466], [4465, 4467], [4466, 4468, 4588], [4467, 4469], [4435, 4468, 4470], [4469, 4471], [4470, 4472, 4589], [4471, 4473], [4436, 4472, 4474], [4473, 4475], [4474, 4476, 4590], [4475, 4477], [4437, 4476, 4478], [4477, 4479], [4478, 4480, 4591], [4479, 4481], [4438, 4480, 4482], [4481, 4483], [4482, 4484, 4592], [4483, 4485], [4439, 4484, 4486], [4485, 4487], [4486, 4488, 4593], [4487, 4489], [4440, 4488, 4490], [4489, 4491], [4490, 4492, 4594], [4491, 4493], [4441, 4492, 4494], [4493, 4495], [4494, 4496, 4595], [4495, 4497], [4442, 4496, 4498], [4497, 4499], [4498, 4500, 4596], [4499, 4501], [4443, 4500, 4502], [4501, 4503], [4502, 4504, 4597], [4503, 4505], [4444, 4504, 4506], [4505, 4507], [4506, 4508, 4598], [4507, 4509], [4445, 4508, 4510], [4509, 4511], [4510, 4512, 4599], [4511, 4513], [4446, 4512, 4514], [4513, 4515], [4514, 4516, 4600], [4515, 4517], [4447, 4516, 4518], [4517, 4519], [4518, 4520, 4601], [4519, 4521], [4448, 4520, 4522], [4521, 4523], [4522, 4524, 4602], [4523, 4525], [4449, 4524, 4526], [4525, 4527], [4526, 4528, 4603], [4527, 4529], [4450, 4528, 4530], [4529, 4531], [4530, 4532, 4604], [4531, 4533], [4451, 4532, 4534], [4533, 4535], [4534, 4536, 4605], [4535, 4537], [4452, 4536, 4538], [4537, 4539], [4538, 4540, 4606], [4539, 4541], [4453, 4540, 4542], [4541, 4543], [4542, 4544, 4607], [4543, 4545], [4454, 4544, 4546], [4545, 4547], [4546, 4548, 4608], [4547, 4549], [4455, 4548, 4550], [4549, 4551], [4550, 4552, 4609], [4551, 4553], [4456, 4552, 4554], [4553, 4555], [4554, 4556, 4610], [4555, 4557], [4457, 4556, 4558], [4557, 4559], [4558, 4560, 4611], [4559, 4561], [4458, 4560, 4562], [4561, 4563], [4562, 4564, 4612], [4563, 4565], [4459, 4564, 4566], [4565, 4567], [4566, 4568, 4613], [4567, 4569], [4460, 4568, 4570], [4569, 4571], [4570, 4572, 4614], [4571, 4573], [4461, 4572, 4574], [4573, 4575], [4574, 4576, 4615], [4575, 4577], [4462, 4576, 4578], [4577, 4579], [4578, 4580, 4616], [4579, 4581], [4463, 4580, 4582], [4581, 4583], [4582, 4584, 4617], [4583, 4585], [4464, 4584, 4586], [4585, 4587], [4586, 4618], [4467, 4621], [4471, 4625], [4475, 4629], [4479, 4633], [4483, 4637], [4487, 4641], [4491, 4645], [4495, 4649], [4499, 4653], [4503, 4657], [4507, 4661], [4511, 4665], [4515, 4669], [4519, 4673], [4523, 4677], [4527, 4681], [4531, 4685], [4535, 4689], [4539, 4693], [4543, 4697], [4547, 4701], [4551, 4705], [4555, 4709], [4559, 4713], [4563, 4717], [4567, 4721], [4571, 4725], [4575, 4729], [4579, 4733], [4583, 4737], [4587, 4741], [4620, 4742], [4619, 4621], [4588, 4620, 4622], [4621, 4623], [4622, 4624, 4743], [4623, 4625], [4589, 4624, 4626], [4625, 4627], [4626, 4628, 4744], [4627, 4629], [4590, 4628, 4630], [4629, 4631], [4630, 4632, 4745], [4631, 4633], [4591, 4632, 4634], [4633, 4635], [4634, 4636, 4746], [4635, 4637], [4592, 4636, 4638], [4637, 4639], [4638, 4640, 4747], [4639, 4641], [4593, 4640, 4642], [4641, 4643], [4642, 4644, 4748], [4643, 4645], [4594, 4644, 4646], [4645, 4647], [4646, 4648, 4749], [4647, 4649], [4595, 4648, 4650], [4649, 4651], [4650, 4652, 4750], [4651, 4653], [4596, 4652, 4654], [4653, 4655], [4654, 4656, 4751], [4655, 4657], [4597, 4656, 4658], [4657, 4659], [4658, 4660, 4752], [4659, 4661], [4598, 4660, 4662], [4661, 4663], [4662, 4664, 4753], [4663, 4665], [4599, 4664, 4666], [4665, 4667], [4666, 4668, 4754], [4667, 4669], [4600, 4668, 4670], [4669, 4671], [4670, 4672, 4755], [4671, 4673], [4601, 4672, 4674], [4673, 4675], [4674, 4676, 4756], [4675, 4677], [4602, 4676, 4678], [4677, 4679], [4678, 4680, 4757], [4679, 4681], [4603, 4680, 4682], [4681, 4683], [4682, 4684, 4758], [4683, 4685], [4604, 4684, 4686], [4685, 4687], [4686, 4688, 4759], [4687, 4689], [4605, 4688, 4690], [4689, 4691], [4690, 4692, 4760], [4691, 4693], [4606, 4692, 4694], [4693, 4695], [4694, 4696, 4761], [4695, 4697], [4607, 4696, 4698], [4697, 4699], [4698, 4700, 4762], [4699, 4701], [4608, 4700, 4702], [4701, 4703], [4702, 4704, 4763], [4703, 4705], [4609, 4704, 4706], [4705, 4707], [4706, 4708, 4764], [4707, 4709], [4610, 4708, 4710], [4709, 4711], [4710, 4712, 4765], [4711, 4713], [4611, 4712, 4714], [4713, 4715], [4714, 4716, 4766], [4715, 4717], [4612, 4716, 4718], [4717, 4719], [4718, 4720, 4767], [4719, 4721], [4613, 4720, 4722], [4721, 4723], [4722, 4724, 4768], [4723, 4725], [4614, 4724, 4726], [4725, 4727], [4726, 4728, 4769], [4727, 4729], [4615, 4728, 4730], [4729, 4731], [4730, 4732, 4770], [4731, 4733], [4616, 4732, 4734], [4733, 4735], [4734, 4736, 4771], [4735, 4737], [4617, 4736, 4738], [4737, 4739], [4738, 4740, 4772], [4739, 4741], [4618, 4740], [4619, 4773], [4623, 4777], [4627, 4781], [4631, 4785], [4635, 4789], [4639, 4793], [4643, 4797], [4647, 4801], [4651, 4805], [4655, 4809], [4659, 4813], [4663, 4817], [4667, 4821], [4671, 4825], [4675, 4829], [4679, 4833], [4683, 4837], [4687, 4841], [4691, 4845], [4695, 4849], [4699, 4853], [4703, 4857], [4707, 4861], [4711, 4865], [4715, 4869], [4719, 4873], [4723, 4877], [4727, 4881], [4731, 4885], [4735, 4889], [4739, 4893], [4742, 4774], [4773, 4775], [4774, 4776, 4896], [4775, 4777], [4743, 4776, 4778], [4777, 4779], [4778, 4780, 4897], [4779, 4781], [4744, 4780, 4782], [4781, 4783], [4782, 4784, 4898], [4783, 4785], [4745, 4784, 4786], [4785, 4787], [4786, 4788, 4899], [4787, 4789], [4746, 4788, 4790], [4789, 4791], [4790, 4792, 4900], [4791, 4793], [4747, 4792, 4794], [4793, 4795], [4794, 4796, 4901], [4795, 4797], [4748, 4796, 4798], [4797, 4799], [4798, 4800, 4902], [4799, 4801], [4749, 4800, 4802], [4801, 4803], [4802, 4804, 4903], [4803, 4805], [4750, 4804, 4806], [4805, 4807], [4806, 4808, 4904], [4807, 4809], [4751, 4808, 4810], [4809, 4811], [4810, 4812, 4905], [4811, 4813], [4752, 4812, 4814], [4813, 4815], [4814, 4816, 4906], [4815, 4817], [4753, 4816, 4818], [4817, 4819], [4818, 4820, 4907], [4819, 4821], [4754, 4820, 4822], [4821, 4823], [4822, 4824, 4908], [4823, 4825], [4755, 4824, 4826], [4825, 4827], [4826, 4828, 4909], [4827, 4829], [4756, 4828, 4830], [4829, 4831], [4830, 4832, 4910], [4831, 4833], [4757, 4832, 4834], [4833, 4835], [4834, 4836, 4911], [4835, 4837], [4758, 4836, 4838], [4837, 4839], [4838, 4840, 4912], [4839, 4841], [4759, 4840, 4842], [4841, 4843], [4842, 4844, 4913], [4843, 4845], [4760, 4844, 4846], [4845, 4847], [4846, 4848, 4914], [4847, 4849], [4761, 4848, 4850], [4849, 4851], [4850, 4852, 4915], [4851, 4853], [4762, 4852, 4854], [4853, 4855], [4854, 4856, 4916], [4855, 4857], [4763, 4856, 4858], [4857, 4859], [4858, 4860, 4917], [4859, 4861], [4764, 4860, 4862], [4861, 4863], [4862, 4864, 4918], [4863, 4865], [4765, 4864, 4866], [4865, 4867], [4866, 4868, 4919], [4867, 4869], [4766, 4868, 4870], [4869, 4871], [4870, 4872, 4920], [4871, 4873], [4767, 4872, 4874], [4873, 4875], [4874, 4876, 4921], [4875, 4877], [4768, 4876, 4878], [4877, 4879], [4878, 4880, 4922], [4879, 4881], [4769, 4880, 4882], [4881, 4883], [4882, 4884, 4923], [4883, 4885], [4770, 4884, 4886], [4885, 4887], [4886, 4888, 4924], [4887, 4889], [4771, 4888, 4890], [4889, 4891], [4890, 4892, 4925], [4891, 4893], [4772, 4892, 4894], [4893, 4895], [4894, 4926], [4775, 4929], [4779, 4933], [4783, 4937], [4787, 4941], [4791, 4945], [4795, 4949], [4799, 4953], [4803, 4957], [4807, 4961], [4811, 4965], [4815, 4969], [4819, 4973], [4823, 4977], [4827, 4981], [4831, 4985], [4835, 4989], [4839, 4993], [4843, 4997], [4847, 5001], [4851, 5005], [4855, 5009], [4859, 5013], [4863, 5017], [4867, 5021], [4871, 5025], [4875, 5029], [4879, 5033], [4883, 5037], [4887, 5041], [4891, 5045], [4895, 5049], [4928, 5050], [4927, 4929], [4896, 4928, 4930], [4929, 4931], [4930, 4932, 5051], [4931, 4933], [4897, 4932, 4934], [4933, 4935], [4934, 4936, 5052], [4935, 4937], [4898, 4936, 4938], [4937, 4939], [4938, 4940, 5053], [4939, 4941], [4899, 4940, 4942], [4941, 4943], [4942, 4944, 5054], [4943, 4945], [4900, 4944, 4946], [4945, 4947], [4946, 4948, 5055], [4947, 4949], [4901, 4948, 4950], [4949, 4951], [4950, 4952, 5056], [4951, 4953], [4902, 4952, 4954], [4953, 4955], [4954, 4956, 5057], [4955, 4957], [4903, 4956, 4958], [4957, 4959], [4958, 4960, 5058], [4959, 4961], [4904, 4960, 4962], [4961, 4963], [4962, 4964, 5059], [4963, 4965], [4905, 4964, 4966], [4965, 4967], [4966, 4968, 5060], [4967, 4969], [4906, 4968, 4970], [4969, 4971], [4970, 4972, 5061], [4971, 4973], [4907, 4972, 4974], [4973, 4975], [4974, 4976, 5062], [4975, 4977], [4908, 4976, 4978], [4977, 4979], [4978, 4980, 5063], [4979, 4981], [4909, 4980, 4982], [4981, 4983], [4982, 4984, 5064], [4983, 4985], [4910, 4984, 4986], [4985, 4987], [4986, 4988, 5065], [4987, 4989], [4911, 4988, 4990], [4989, 4991], [4990, 4992, 5066], [4991, 4993], [4912, 4992, 4994], [4993, 4995], [4994, 4996, 5067], [4995, 4997], [4913, 4996, 4998], [4997, 4999], [4998, 5000, 5068], [4999, 5001], [4914, 5000, 5002], [5001, 5003], [5002, 5004, 5069], [5003, 5005], [4915, 5004, 5006], [5005, 5007], [5006, 5008, 5070], [5007, 5009], [4916, 5008, 5010], [5009, 5011], [5010, 5012, 5071], [5011, 5013], [4917, 5012, 5014], [5013, 5015], [5014, 5016, 5072], [5015, 5017], [4918, 5016, 5018], [5017, 5019], [5018, 5020, 5073], [5019, 5021], [4919, 5020, 5022], [5021, 5023], [5022, 5024, 5074], [5023, 5025], [4920, 5024, 5026], [5025, 5027], [5026, 5028, 5075], [5027, 5029], [4921, 5028, 5030], [5029, 5031], [5030, 5032, 5076], [5031, 5033], [4922, 5032, 5034], [5033, 5035], [5034, 5036, 5077], [5035, 5037], [4923, 5036, 5038], [5037, 5039], [5038, 5040, 5078], [5039, 5041], [4924, 5040, 5042], [5041, 5043], [5042, 5044, 5079], [5043, 5045], [4925, 5044, 5046], [5045, 5047], [5046, 5048, 5080], [5047, 5049], [4926, 5048], [4927, 5081], [4931, 5085], [4935, 5089], [4939, 5093], [4943, 5097], [4947, 5101], [4951, 5105], [4955, 5109], [4959, 5113], [4963, 5117], [4967, 5121], [4971, 5125], [4975, 5129], [4979, 5133], [4983, 5137], [4987, 5141], [4991, 5145], [4995, 5149], [4999, 5153], [5003, 5157], [5007, 5161], [5011, 5165], [5015, 5169], [5019, 5173], [5023, 5177], [5027, 5181], [5031, 5185], [5035, 5189], [5039, 5193], [5043, 5197], [5047, 5201], [5050, 5082], [5081, 5083], [5082, 5084, 5204], [5083, 5085], [5051, 5084, 5086], [5085, 5087], [5086, 5088, 5205], [5087, 5089], [5052, 5088, 5090], [5089, 5091], [5090, 5092, 5206], [5091, 5093], [5053, 5092, 5094], [5093, 5095], [5094, 5096, 5207], [5095, 5097], [5054, 5096, 5098], [5097, 5099], [5098, 5100, 5208], [5099, 5101], [5055, 5100, 5102], [5101, 5103], [5102, 5104, 5209], [5103, 5105], [5056, 5104, 5106], [5105, 5107], [5106, 5108, 5210], [5107, 5109], [5057, 5108, 5110], [5109, 5111], [5110, 5112, 5211], [5111, 5113], [5058, 5112, 5114], [5113, 5115], [5114, 5116, 5212], [5115, 5117], [5059, 5116, 5118], [5117, 5119], [5118, 5120, 5213], [5119, 5121], [5060, 5120, 5122], [5121, 5123], [5122, 5124, 5214], [5123, 5125], [5061, 5124, 5126], [5125, 5127], [5126, 5128, 5215], [5127, 5129], [5062, 5128, 5130], [5129, 5131], [5130, 5132, 5216], [5131, 5133], [5063, 5132, 5134], [5133, 5135], [5134, 5136, 5217], [5135, 5137], [5064, 5136, 5138], [5137, 5139], [5138, 5140, 5218], [5139, 5141], [5065, 5140, 5142], [5141, 5143], [5142, 5144, 5219], [5143, 5145], [5066, 5144, 5146], [5145, 5147], [5146, 5148, 5220], [5147, 5149], [5067, 5148, 5150], [5149, 5151], [5150, 5152, 5221], [5151, 5153], [5068, 5152, 5154], [5153, 5155], [5154, 5156, 5222], [5155, 5157], [5069, 5156, 5158], [5157, 5159], [5158, 5160, 5223], [5159, 5161], [5070, 5160, 5162], [5161, 5163], [5162, 5164, 5224], [5163, 5165], [5071, 5164, 5166], [5165, 5167], [5166, 5168, 5225], [5167, 5169], [5072, 5168, 5170], [5169, 5171], [5170, 5172, 5226], [5171, 5173], [5073, 5172, 5174], [5173, 5175], [5174, 5176, 5227], [5175, 5177], [5074, 5176, 5178], [5177, 5179], [5178, 5180, 5228], [5179, 5181], [5075, 5180, 5182], [5181, 5183], [5182, 5184, 5229], [5183, 5185], [5076, 5184, 5186], [5185, 5187], [5186, 5188, 5230], [5187, 5189], [5077, 5188, 5190], [5189, 5191], [5190, 5192, 5231], [5191, 5193], [5078, 5192, 5194], [5193, 5195], [5194, 5196, 5232], [5195, 5197], [5079, 5196, 5198], [5197, 5199], [5198, 5200, 5233], [5199, 5201], [5080, 5200, 5202], [5201, 5203], [5202, 5234], [5083, 5237], [5087, 5241], [5091, 5245], [5095, 5249], [5099, 5253], [5103, 5257], [5107, 5261], [5111, 5265], [5115, 5269], [5119, 5273], [5123, 5277], [5127, 5281], [5131, 5285], [5135, 5289], [5139, 5293], [5143, 5297], [5147, 5301], [5151, 5305], [5155, 5309], [5159, 5313], [5163, 5317], [5167, 5321], [5171, 5325], [5175, 5329], [5179, 5333], [5183, 5337], [5187, 5341], [5191, 5345], [5195, 5349], [5199, 5353], [5203, 5357], [5236, 5358], [5235, 5237], [5204, 5236, 5238], [5237, 5239], [5238, 5240, 5359], [5239, 5241], [5205, 5240, 5242], [5241, 5243], [5242, 5244, 5360], [5243, 5245], [5206, 5244, 5246], [5245, 5247], [5246, 5248, 5361], [5247, 5249], [5207, 5248, 5250], [5249, 5251], [5250, 5252, 5362], [5251, 5253], [5208, 5252, 5254], [5253, 5255], [5254, 5256, 5363], [5255, 5257], [5209, 5256, 5258], [5257, 5259], [5258, 5260, 5364], [5259, 5261], [5210, 5260, 5262], [5261, 5263], [5262, 5264, 5365], [5263, 5265], [5211, 5264, 5266], [5265, 5267], [5266, 5268, 5366], [5267, 5269], [5212, 5268, 5270], [5269, 5271], [5270, 5272, 5367], [5271, 5273], [5213, 5272, 5274], [5273, 5275], [5274, 5276, 5368], [5275, 5277], [5214, 5276, 5278], [5277, 5279], [5278, 5280, 5369], [5279, 5281], [5215, 5280, 5282], [5281, 5283], [5282, 5284, 5370], [5283, 5285], [5216, 5284, 5286], [5285, 5287], [5286, 5288, 5371], [5287, 5289], [5217, 5288, 5290], [5289, 5291], [5290, 5292, 5372], [5291, 5293], [5218, 5292, 5294], [5293, 5295], [5294, 5296, 5373], [5295, 5297], [5219, 5296, 5298], [5297, 5299], [5298, 5300, 5374], [5299, 5301], [5220, 5300, 5302], [5301, 5303], [5302, 5304, 5375], [5303, 5305], [5221, 5304, 5306], [5305, 5307], [5306, 5308, 5376], [5307, 5309], [5222, 5308, 5310], [5309, 5311], [5310, 5312, 5377], [5311, 5313], [5223, 5312, 5314], [5313, 5315], [5314, 5316, 5378], [5315, 5317], [5224, 5316, 5318], [5317, 5319], [5318, 5320, 5379], [5319, 5321], [5225, 5320, 5322], [5321, 5323], [5322, 5324, 5380], [5323, 5325], [5226, 5324, 5326], [5325, 5327], [5326, 5328, 5381], [5327, 5329], [5227, 5328, 5330], [5329, 5331], [5330, 5332, 5382], [5331, 5333], [5228, 5332, 5334], [5333, 5335], [5334, 5336, 5383], [5335, 5337], [5229, 5336, 5338], [5337, 5339], [5338, 5340, 5384], [5339, 5341], [5230, 5340, 5342], [5341, 5343], [5342, 5344, 5385], [5343, 5345], [5231, 5344, 5346], [5345, 5347], [5346, 5348, 5386], [5347, 5349], [5232, 5348, 5350], [5349, 5351], [5350, 5352, 5387], [5351, 5353], [5233, 5352, 5354], [5353, 5355], [5354, 5356, 5388], [5355, 5357], [5234, 5356], [5235, 5389], [5239, 5393], [5243, 5397], [5247, 5401], [5251, 5405], [5255, 5409], [5259, 5413], [5263, 5417], [5267, 5421], [5271, 5425], [5275, 5429], [5279, 5433], [5283, 5437], [5287, 5441], [5291, 5445], [5295, 5449], [5299, 5453], [5303, 5457], [5307, 5461], [5311, 5465], [5315, 5469], [5319, 5473], [5323, 5477], [5327, 5481], [5331, 5485], [5335, 5489], [5339, 5493], [5343, 5497], [5347, 5501], [5351, 5505], [5355, 5509], [5358, 5390], [5389, 5391], [5390, 5392, 5512], [5391, 5393], [5359, 5392, 5394], [5393, 5395], [5394, 5396, 5513], [5395, 5397], [5360, 5396, 5398], [5397, 5399], [5398, 5400, 5514], [5399, 5401], [5361, 5400, 5402], [5401, 5403], [5402, 5404, 5515], [5403, 5405], [5362, 5404, 5406], [5405, 5407], [5406, 5408, 5516], [5407, 5409], [5363, 5408, 5410], [5409, 5411], [5410, 5412, 5517], [5411, 5413], [5364, 5412, 5414], [5413, 5415], [5414, 5416, 5518], [5415, 5417], [5365, 5416, 5418], [5417, 5419], [5418, 5420, 5519], [5419, 5421], [5366, 5420, 5422], [5421, 5423], [5422, 5424, 5520], [5423, 5425], [5367, 5424, 5426], [5425, 5427], [5426, 5428, 5521], [5427, 5429], [5368, 5428, 5430], [5429, 5431], [5430, 5432, 5522], [5431, 5433], [5369, 5432, 5434], [5433, 5435], [5434, 5436, 5523], [5435, 5437], [5370, 5436, 5438], [5437, 5439], [5438, 5440, 5524], [5439, 5441], [5371, 5440, 5442], [5441, 5443], [5442, 5444, 5525], [5443, 5445], [5372, 5444, 5446], [5445, 5447], [5446, 5448, 5526], [5447, 5449], [5373, 5448, 5450], [5449, 5451], [5450, 5452, 5527], [5451, 5453], [5374, 5452, 5454], [5453, 5455], [5454, 5456, 5528], [5455, 5457], [5375, 5456, 5458], [5457, 5459], [5458, 5460, 5529], [5459, 5461], [5376, 5460, 5462], [5461, 5463], [5462, 5464, 5530], [5463, 5465], [5377, 5464, 5466], [5465, 5467], [5466, 5468, 5531], [5467, 5469], [5378, 5468, 5470], [5469, 5471], [5470, 5472, 5532], [5471, 5473], [5379, 5472, 5474], [5473, 5475], [5474, 5476, 5533], [5475, 5477], [5380, 5476, 5478], [5477, 5479], [5478, 5480, 5534], [5479, 5481], [5381, 5480, 5482], [5481, 5483], [5482, 5484, 5535], [5483, 5485], [5382, 5484, 5486], [5485, 5487], [5486, 5488, 5536], [5487, 5489], [5383, 5488, 5490], [5489, 5491], [5490, 5492, 5537], [5491, 5493], [5384, 5492, 5494], [5493, 5495], [5494, 5496, 5538], [5495, 5497], [5385, 5496, 5498], [5497, 5499], [5498, 5500, 5539], [5499, 5501], [5386, 5500, 5502], [5501, 5503], [5502, 5504, 5540], [5503, 5505], [5387, 5504, 5506], [5505, 5507], [5506, 5508, 5541], [5507, 5509], [5388, 5508, 5510], [5509, 5511], [5510, 5542], [5391, 5545], [5395, 5549], [5399, 5553], [5403, 5557], [5407, 5561], [5411, 5565], [5415, 5569], [5419, 5573], [5423, 5577], [5427, 5581], [5431, 5585], [5435, 5589], [5439, 5593], [5443, 5597], [5447, 5601], [5451, 5605], [5455, 5609], [5459, 5613], [5463, 5617], [5467, 5621], [5471, 5625], [5475, 5629], [5479, 5633], [5483, 5637], [5487, 5641], [5491, 5645], [5495, 5649], [5499, 5653], [5503, 5657], [5507, 5661], [5511, 5665], [5544, 5666], [5543, 5545], [5512, 5544, 5546], [5545, 5547], [5546, 5548, 5667], [5547, 5549], [5513, 5548, 5550], [5549, 5551], [5550, 5552, 5668], [5551, 5553], [5514, 5552, 5554], [5553, 5555], [5554, 5556, 5669], [5555, 5557], [5515, 5556, 5558], [5557, 5559], [5558, 5560, 5670], [5559, 5561], [5516, 5560, 5562], [5561, 5563], [5562, 5564, 5671], [5563, 5565], [5517, 5564, 5566], [5565, 5567], [5566, 5568, 5672], [5567, 5569], [5518, 5568, 5570], [5569, 5571], [5570, 5572, 5673], [5571, 5573], [5519, 5572, 5574], [5573, 5575], [5574, 5576, 5674], [5575, 5577], [5520, 5576, 5578], [5577, 5579], [5578, 5580, 5675], [5579, 5581], [5521, 5580, 5582], [5581, 5583], [5582, 5584, 5676], [5583, 5585], [5522, 5584, 5586], [5585, 5587], [5586, 5588, 5677], [5587, 5589], [5523, 5588, 5590], [5589, 5591], [5590, 5592, 5678], [5591, 5593], [5524, 5592, 5594], [5593, 5595], [5594, 5596, 5679], [5595, 5597], [5525, 5596, 5598], [5597, 5599], [5598, 5600, 5680], [5599, 5601], [5526, 5600, 5602], [5601, 5603], [5602, 5604, 5681], [5603, 5605], [5527, 5604, 5606], [5605, 5607], [5606, 5608, 5682], [5607, 5609], [5528, 5608, 5610], [5609, 5611], [5610, 5612, 5683], [5611, 5613], [5529, 5612, 5614], [5613, 5615], [5614, 5616, 5684], [5615, 5617], [5530, 5616, 5618], [5617, 5619], [5618, 5620, 5685], [5619, 5621], [5531, 5620, 5622], [5621, 5623], [5622, 5624, 5686], [5623, 5625], [5532, 5624, 5626], [5625, 5627], [5626, 5628, 5687], [5627, 5629], [5533, 5628, 5630], [5629, 5631], [5630, 5632, 5688], [5631, 5633], [5534, 5632, 5634], [5633, 5635], [5634, 5636, 5689], [5635, 5637], [5535, 5636, 5638], [5637, 5639], [5638, 5640, 5690], [5639, 5641], [5536, 5640, 5642], [5641, 5643], [5642, 5644, 5691], [5643, 5645], [5537, 5644, 5646], [5645, 5647], [5646, 5648, 5692], [5647, 5649], [5538, 5648, 5650], [5649, 5651], [5650, 5652, 5693], [5651, 5653], [5539, 5652, 5654], [5653, 5655], [5654, 5656, 5694], [5655, 5657], [5540, 5656, 5658], [5657, 5659], [5658, 5660, 5695], [5659, 5661], [5541, 5660, 5662], [5661, 5663], [5662, 5664, 5696], [5663, 5665], [5542, 5664], [5543, 5697], [5547, 5701], [5551, 5705], [5555, 5709], [5559, 5713], [5563, 5717], [5567, 5721], [5571, 5725], [5575, 5729], [5579, 5733], [5583, 5737], [5587, 5741], [5591, 5745], [5595, 5749], [5599, 5753], [5603, 5757], [5607, 5761], [5611, 5765], [5615, 5769], [5619, 5773], [5623, 5777], [5627, 5781], [5631, 5785], [5635, 5789], [5639, 5793], [5643, 5797], [5647, 5801], [5651, 5805], [5655, 5809], [5659, 5813], [5663, 5817], [5666, 5698], [5697, 5699], [5698, 5700, 5820], [5699, 5701], [5667, 5700, 5702], [5701, 5703], [5702, 5704, 5821], [5703, 5705], [5668, 5704, 5706], [5705, 5707], [5706, 5708, 5822], [5707, 5709], [5669, 5708, 5710], [5709, 5711], [5710, 5712, 5823], [5711, 5713], [5670, 5712, 5714], [5713, 5715], [5714, 5716, 5824], [5715, 5717], [5671, 5716, 5718], [5717, 5719], [5718, 5720, 5825], [5719, 5721], [5672, 5720, 5722], [5721, 5723], [5722, 5724, 5826], [5723, 5725], [5673, 5724, 5726], [5725, 5727], [5726, 5728, 5827], [5727, 5729], [5674, 5728, 5730], [5729, 5731], [5730, 5732, 5828], [5731, 5733], [5675, 5732, 5734], [5733, 5735], [5734, 5736, 5829], [5735, 5737], [5676, 5736, 5738], [5737, 5739], [5738, 5740, 5830], [5739, 5741], [5677, 5740, 5742], [5741, 5743], [5742, 5744, 5831], [5743, 5745], [5678, 5744, 5746], [5745, 5747], [5746, 5748, 5832], [5747, 5749], [5679, 5748, 5750], [5749, 5751], [5750, 5752, 5833], [5751, 5753], [5680, 5752, 5754], [5753, 5755], [5754, 5756, 5834], [5755, 5757], [5681, 5756, 5758], [5757, 5759], [5758, 5760, 5835], [5759, 5761], [5682, 5760, 5762], [5761, 5763], [5762, 5764, 5836], [5763, 5765], [5683, 5764, 5766], [5765, 5767], [5766, 5768, 5837], [5767, 5769], [5684, 5768, 5770], [5769, 5771], [5770, 5772, 5838], [5771, 5773], [5685, 5772, 5774], [5773, 5775], [5774, 5776, 5839], [5775, 5777], [5686, 5776, 5778], [5777, 5779], [5778, 5780, 5840], [5779, 5781], [5687, 5780, 5782], [5781, 5783], [5782, 5784, 5841], [5783, 5785], [5688, 5784, 5786], [5785, 5787], [5786, 5788, 5842], [5787, 5789], [5689, 5788, 5790], [5789, 5791], [5790, 5792, 5843], [5791, 5793], [5690, 5792, 5794], [5793, 5795], [5794, 5796, 5844], [5795, 5797], [5691, 5796, 5798], [5797, 5799], [5798, 5800, 5845], [5799, 5801], [5692, 5800, 5802], [5801, 5803], [5802, 5804, 5846], [5803, 5805], [5693, 5804, 5806], [5805, 5807], [5806, 5808, 5847], [5807, 5809], [5694, 5808, 5810], [5809, 5811], [5810, 5812, 5848], [5811, 5813], [5695, 5812, 5814], [5813, 5815], [5814, 5816, 5849], [5815, 5817], [5696, 5816, 5818], [5817, 5819], [5818, 5850], [5699, 5853], [5703, 5857], [5707, 5861], [5711, 5865], [5715, 5869], [5719, 5873], [5723, 5877], [5727, 5881], [5731, 5885], [5735, 5889], [5739, 5893], [5743, 5897], [5747, 5901], [5751, 5905], [5755, 5909], [5759, 5913], [5763, 5917], [5767, 5921], [5771, 5925], [5775, 5929], [5779, 5933], [5783, 5937], [5787, 5941], [5791, 5945], [5795, 5949], [5799, 5953], [5803, 5957], [5807, 5961], [5811, 5965], [5815, 5969], [5819, 5973], [5852, 5974], [5851, 5853], [5820, 5852, 5854], [5853, 5855], [5854, 5856, 5975], [5855, 5857], [5821, 5856, 5858], [5857, 5859], [5858, 5860, 5976], [5859, 5861], [5822, 5860, 5862], [5861, 5863], [5862, 5864, 5977], [5863, 5865], [5823, 5864, 5866], [5865, 5867], [5866, 5868, 5978], [5867, 5869], [5824, 5868, 5870], [5869, 5871], [5870, 5872, 5979], [5871, 5873], [5825, 5872, 5874], [5873, 5875], [5874, 5876, 5980], [5875, 5877], [5826, 5876, 5878], [5877, 5879], [5878, 5880, 5981], [5879, 5881], [5827, 5880, 5882], [5881, 5883], [5882, 5884, 5982], [5883, 5885], [5828, 5884, 5886], [5885, 5887], [5886, 5888, 5983], [5887, 5889], [5829, 5888, 5890], [5889, 5891], [5890, 5892, 5984], [5891, 5893], [5830, 5892, 5894], [5893, 5895], [5894, 5896, 5985], [5895, 5897], [5831, 5896, 5898], [5897, 5899], [5898, 5900, 5986], [5899, 5901], [5832, 5900, 5902], [5901, 5903], [5902, 5904, 5987], [5903, 5905], [5833, 5904, 5906], [5905, 5907], [5906, 5908, 5988], [5907, 5909], [5834, 5908, 5910], [5909, 5911], [5910, 5912, 5989], [5911, 5913], [5835, 5912, 5914], [5913, 5915], [5914, 5916, 5990], [5915, 5917], [5836, 5916, 5918], [5917, 5919], [5918, 5920, 5991], [5919, 5921], [5837, 5920, 5922], [5921, 5923], [5922, 5924, 5992], [5923, 5925], [5838, 5924, 5926], [5925, 5927], [5926, 5928, 5993], [5927, 5929], [5839, 5928, 5930], [5929, 5931], [5930, 5932, 5994], [5931, 5933], [5840, 5932, 5934], [5933, 5935], [5934, 5936, 5995], [5935, 5937], [5841, 5936, 5938], [5937, 5939], [5938, 5940, 5996], [5939, 5941], [5842, 5940, 5942], [5941, 5943], [5942, 5944, 5997], [5943, 5945], [5843, 5944, 5946], [5945, 5947], [5946, 5948, 5998], [5947, 5949], [5844, 5948, 5950], [5949, 5951], [5950, 5952, 5999], [5951, 5953], [5845, 5952, 5954], [5953, 5955], [5954, 5956, 6000], [5955, 5957], [5846, 5956, 5958], [5957, 5959], [5958, 5960, 6001], [5959, 5961], [5847, 5960, 5962], [5961, 5963], [5962, 5964, 6002], [5963, 5965], [5848, 5964, 5966], [5965, 5967], [5966, 5968, 6003], [5967, 5969], [5849, 5968, 5970], [5969, 5971], [5970, 5972, 6004], [5971, 5973], [5850, 5972], [5851, 6005], [5855, 6009], [5859, 6013], [5863, 6017], [5867, 6021], [5871, 6025], [5875, 6029], [5879, 6033], [5883, 6037], [5887, 6041], [5891, 6045], [5895, 6049], [5899, 6053], [5903, 6057], [5907, 6061], [5911, 6065], [5915, 6069], [5919, 6073], [5923, 6077], [5927, 6081], [5931, 6085], [5935, 6089], [5939, 6093], [5943, 6097], [5947, 6101], [5951, 6105], [5955, 6109], [5959, 6113], [5963, 6117], [5967, 6121], [5971, 6125], [5974, 6006], [6005, 6007], [6006, 6008, 6128], [6007, 6009], [5975, 6008, 6010], [6009, 6011], [6010, 6012, 6129], [6011, 6013], [5976, 6012, 6014], [6013, 6015], [6014, 6016, 6130], [6015, 6017], [5977, 6016, 6018], [6017, 6019], [6018, 6020, 6131], [6019, 6021], [5978, 6020, 6022], [6021, 6023], [6022, 6024, 6132], [6023, 6025], [5979, 6024, 6026], [6025, 6027], [6026, 6028, 6133], [6027, 6029], [5980, 6028, 6030], [6029, 6031], [6030, 6032, 6134], [6031, 6033], [5981, 6032, 6034], [6033, 6035], [6034, 6036, 6135], [6035, 6037], [5982, 6036, 6038], [6037, 6039], [6038, 6040, 6136], [6039, 6041], [5983, 6040, 6042], [6041, 6043], [6042, 6044, 6137], [6043, 6045], [5984, 6044, 6046], [6045, 6047], [6046, 6048, 6138], [6047, 6049], [5985, 6048, 6050], [6049, 6051], [6050, 6052, 6139], [6051, 6053], [5986, 6052, 6054], [6053, 6055], [6054, 6056, 6140], [6055, 6057], [5987, 6056, 6058], [6057, 6059], [6058, 6060, 6141], [6059, 6061], [5988, 6060, 6062], [6061, 6063], [6062, 6064, 6142], [6063, 6065], [5989, 6064, 6066], [6065, 6067], [6066, 6068, 6143], [6067, 6069], [5990, 6068, 6070], [6069, 6071], [6070, 6072, 6144], [6071, 6073], [5991, 6072, 6074], [6073, 6075], [6074, 6076, 6145], [6075, 6077], [5992, 6076, 6078], [6077, 6079], [6078, 6080, 6146], [6079, 6081], [5993, 6080, 6082], [6081, 6083], [6082, 6084, 6147], [6083, 6085], [5994, 6084, 6086], [6085, 6087], [6086, 6088, 6148], [6087, 6089], [5995, 6088, 6090], [6089, 6091], [6090, 6092, 6149], [6091, 6093], [5996, 6092, 6094], [6093, 6095], [6094, 6096, 6150], [6095, 6097], [5997, 6096, 6098], [6097, 6099], [6098, 6100, 6151], [6099, 6101], [5998, 6100, 6102], [6101, 6103], [6102, 6104, 6152], [6103, 6105], [5999, 6104, 6106], [6105, 6107], [6106, 6108, 6153], [6107, 6109], [6000, 6108, 6110], [6109, 6111], [6110, 6112, 6154], [6111, 6113], [6001, 6112, 6114], [6113, 6115], [6114, 6116, 6155], [6115, 6117], [6002, 6116, 6118], [6117, 6119], [6118, 6120, 6156], [6119, 6121], [6003, 6120, 6122], [6121, 6123], [6122, 6124, 6157], [6123, 6125], [6004, 6124, 6126], [6125, 6127], [6126, 6158], [6007, 6161], [6011, 6165], [6015, 6169], [6019, 6173], [6023, 6177], [6027, 6181], [6031, 6185], [6035, 6189], [6039, 6193], [6043, 6197], [6047, 6201], [6051, 6205], [6055, 6209], [6059, 6213], [6063, 6217], [6067, 6221], [6071, 6225], [6075, 6229], [6079, 6233], [6083, 6237], [6087, 6241], [6091, 6245], [6095, 6249], [6099, 6253], [6103, 6257], [6107, 6261], [6111, 6265], [6115, 6269], [6119, 6273], [6123, 6277], [6127, 6281], [6160, 6282], [6159, 6161], [6128, 6160, 6162], [6161, 6163], [6162, 6164, 6283], [6163, 6165], [6129, 6164, 6166], [6165, 6167], [6166, 6168, 6284], [6167, 6169], [6130, 6168, 6170], [6169, 6171], [6170, 6172, 6285], [6171, 6173], [6131, 6172, 6174], [6173, 6175], [6174, 6176, 6286], [6175, 6177], [6132, 6176, 6178], [6177, 6179], [6178, 6180, 6287], [6179, 6181], [6133, 6180, 6182], [6181, 6183], [6182, 6184, 6288], [6183, 6185], [6134, 6184, 6186], [6185, 6187], [6186, 6188, 6289], [6187, 6189], [6135, 6188, 6190], [6189, 6191], [6190, 6192, 6290], [6191, 6193], [6136, 6192, 6194], [6193, 6195], [6194, 6196, 6291], [6195, 6197], [6137, 6196, 6198], [6197, 6199], [6198, 6200, 6292], [6199, 6201], [6138, 6200, 6202], [6201, 6203], [6202, 6204, 6293], [6203, 6205], [6139, 6204, 6206], [6205, 6207], [6206, 6208, 6294], [6207, 6209], [6140, 6208, 6210], [6209, 6211], [6210, 6212, 6295], [6211, 6213], [6141, 6212, 6214], [6213, 6215], [6214, 6216, 6296], [6215, 6217], [6142, 6216, 6218], [6217, 6219], [6218, 6220, 6297], [6219, 6221], [6143, 6220, 6222], [6221, 6223], [6222, 6224, 6298], [6223, 6225], [6144, 6224, 6226], [6225, 6227], [6226, 6228, 6299], [6227, 6229], [6145, 6228, 6230], [6229, 6231], [6230, 6232, 6300], [6231, 6233], [6146, 6232, 6234], [6233, 6235], [6234, 6236, 6301], [6235, 6237], [6147, 6236, 6238], [6237, 6239], [6238, 6240, 6302], [6239, 6241], [6148, 6240, 6242], [6241, 6243], [6242, 6244, 6303], [6243, 6245], [6149, 6244, 6246], [6245, 6247], [6246, 6248, 6304], [6247, 6249], [6150, 6248, 6250], [6249, 6251], [6250, 6252, 6305], [6251, 6253], [6151, 6252, 6254], [6253, 6255], [6254, 6256, 6306], [6255, 6257], [6152, 6256, 6258], [6257, 6259], [6258, 6260, 6307], [6259, 6261], [6153, 6260, 6262], [6261, 6263], [6262, 6264, 6308], [6263, 6265], [6154, 6264, 6266], [6265, 6267], [6266, 6268, 6309], [6267, 6269], [6155, 6268, 6270], [6269, 6271], [6270, 6272, 6310], [6271, 6273], [6156, 6272, 6274], [6273, 6275], [6274, 6276, 6311], [6275, 6277], [6157, 6276, 6278], [6277, 6279], [6278, 6280, 6312], [6279, 6281], [6158, 6280], [6159, 6313], [6163, 6317], [6167, 6321], [6171, 6325], [6175, 6329], [6179, 6333], [6183, 6337], [6187, 6341], [6191, 6345], [6195, 6349], [6199, 6353], [6203, 6357], [6207, 6361], [6211, 6365], [6215, 6369], [6219, 6373], [6223, 6377], [6227, 6381], [6231, 6385], [6235, 6389], [6239, 6393], [6243, 6397], [6247, 6401], [6251, 6405], [6255, 6409], [6259, 6413], [6263, 6417], [6267, 6421], [6271, 6425], [6275, 6429], [6279, 6433], [6282, 6314], [6313, 6315], [6314, 6316, 6436], [6315, 6317], [6283, 6316, 6318], [6317, 6319], [6318, 6320, 6437], [6319, 6321], [6284, 6320, 6322], [6321, 6323], [6322, 6324, 6438], [6323, 6325], [6285, 6324, 6326], [6325, 6327], [6326, 6328, 6439], [6327, 6329], [6286, 6328, 6330], [6329, 6331], [6330, 6332, 6440], [6331, 6333], [6287, 6332, 6334], [6333, 6335], [6334, 6336, 6441], [6335, 6337], [6288, 6336, 6338], [6337, 6339], [6338, 6340, 6442], [6339, 6341], [6289, 6340, 6342], [6341, 6343], [6342, 6344, 6443], [6343, 6345], [6290, 6344, 6346], [6345, 6347], [6346, 6348, 6444], [6347, 6349], [6291, 6348, 6350], [6349, 6351], [6350, 6352, 6445], [6351, 6353], [6292, 6352, 6354], [6353, 6355], [6354, 6356, 6446], [6355, 6357], [6293, 6356, 6358], [6357, 6359], [6358, 6360, 6447], [6359, 6361], [6294, 6360, 6362], [6361, 6363], [6362, 6364, 6448], [6363, 6365], [6295, 6364, 6366], [6365, 6367], [6366, 6368, 6449], [6367, 6369], [6296, 6368, 6370], [6369, 6371], [6370, 6372, 6450], [6371, 6373], [6297, 6372, 6374], [6373, 6375], [6374, 6376, 6451], [6375, 6377], [6298, 6376, 6378], [6377, 6379], [6378, 6380, 6452], [6379, 6381], [6299, 6380, 6382], [6381, 6383], [6382, 6384, 6453], [6383, 6385], [6300, 6384, 6386], [6385, 6387], [6386, 6388, 6454], [6387, 6389], [6301, 6388, 6390], [6389, 6391], [6390, 6392, 6455], [6391, 6393], [6302, 6392, 6394], [6393, 6395], [6394, 6396, 6456], [6395, 6397], [6303, 6396, 6398], [6397, 6399], [6398, 6400, 6457], [6399, 6401], [6304, 6400, 6402], [6401, 6403], [6402, 6404, 6458], [6403, 6405], [6305, 6404, 6406], [6405, 6407], [6406, 6408, 6459], [6407, 6409], [6306, 6408, 6410], [6409, 6411], [6410, 6412, 6460], [6411, 6413], [6307, 6412, 6414], [6413, 6415], [6414, 6416, 6461], [6415, 6417], [6308, 6416, 6418], [6417, 6419], [6418, 6420, 6462], [6419, 6421], [6309, 6420, 6422], [6421, 6423], [6422, 6424, 6463], [6423, 6425], [6310, 6424, 6426], [6425, 6427], [6426, 6428, 6464], [6427, 6429], [6311, 6428, 6430], [6429, 6431], [6430, 6432, 6465], [6431, 6433], [6312, 6432, 6434], [6433, 6435], [6434, 6466], [6315, 6469], [6319, 6473], [6323, 6477], [6327, 6481], [6331, 6485], [6335, 6489], [6339, 6493], [6343, 6497], [6347, 6501], [6351, 6505], [6355, 6509], [6359, 6513], [6363, 6517], [6367, 6521], [6371, 6525], [6375, 6529], [6379, 6533], [6383, 6537], [6387, 6541], [6391, 6545], [6395, 6549], [6399, 6553], [6403, 6557], [6407, 6561], [6411, 6565], [6415, 6569], [6419, 6573], [6423, 6577], [6427, 6581], [6431, 6585], [6435, 6589], [6468, 6590], [6467, 6469], [6436, 6468, 6470], [6469, 6471], [6470, 6472, 6591], [6471, 6473], [6437, 6472, 6474], [6473, 6475], [6474, 6476, 6592], [6475, 6477], [6438, 6476, 6478], [6477, 6479], [6478, 6480, 6593], [6479, 6481], [6439, 6480, 6482], [6481, 6483], [6482, 6484, 6594], [6483, 6485], [6440, 6484, 6486], [6485, 6487], [6486, 6488, 6595], [6487, 6489], [6441, 6488, 6490], [6489, 6491], [6490, 6492, 6596], [6491, 6493], [6442, 6492, 6494], [6493, 6495], [6494, 6496, 6597], [6495, 6497], [6443, 6496, 6498], [6497, 6499], [6498, 6500, 6598], [6499, 6501], [6444, 6500, 6502], [6501, 6503], [6502, 6504, 6599], [6503, 6505], [6445, 6504, 6506], [6505, 6507], [6506, 6508, 6600], [6507, 6509], [6446, 6508, 6510], [6509, 6511], [6510, 6512, 6601], [6511, 6513], [6447, 6512, 6514], [6513, 6515], [6514, 6516, 6602], [6515, 6517], [6448, 6516, 6518], [6517, 6519], [6518, 6520, 6603], [6519, 6521], [6449, 6520, 6522], [6521, 6523], [6522, 6524, 6604], [6523, 6525], [6450, 6524, 6526], [6525, 6527], [6526, 6528, 6605], [6527, 6529], [6451, 6528, 6530], [6529, 6531], [6530, 6532, 6606], [6531, 6533], [6452, 6532, 6534], [6533, 6535], [6534, 6536, 6607], [6535, 6537], [6453, 6536, 6538], [6537, 6539], [6538, 6540, 6608], [6539, 6541], [6454, 6540, 6542], [6541, 6543], [6542, 6544, 6609], [6543, 6545], [6455, 6544, 6546], [6545, 6547], [6546, 6548, 6610], [6547, 6549], [6456, 6548, 6550], [6549, 6551], [6550, 6552, 6611], [6551, 6553], [6457, 6552, 6554], [6553, 6555], [6554, 6556, 6612], [6555, 6557], [6458, 6556, 6558], [6557, 6559], [6558, 6560, 6613], [6559, 6561], [6459, 6560, 6562], [6561, 6563], [6562, 6564, 6614], [6563, 6565], [6460, 6564, 6566], [6565, 6567], [6566, 6568, 6615], [6567, 6569], [6461, 6568, 6570], [6569, 6571], [6570, 6572, 6616], [6571, 6573], [6462, 6572, 6574], [6573, 6575], [6574, 6576, 6617], [6575, 6577], [6463, 6576, 6578], [6577, 6579], [6578, 6580, 6618], [6579, 6581], [6464, 6580, 6582], [6581, 6583], [6582, 6584, 6619], [6583, 6585], [6465, 6584, 6586], [6585, 6587], [6586, 6588, 6620], [6587, 6589], [6466, 6588], [6467, 6621], [6471, 6625], [6475, 6629], [6479, 6633], [6483, 6637], [6487, 6641], [6491, 6645], [6495, 6649], [6499, 6653], [6503, 6657], [6507, 6661], [6511, 6665], [6515, 6669], [6519, 6673], [6523, 6677], [6527, 6681], [6531, 6685], [6535, 6689], [6539, 6693], [6543, 6697], [6547, 6701], [6551, 6705], [6555, 6709], [6559, 6713], [6563, 6717], [6567, 6721], [6571, 6725], [6575, 6729], [6579, 6733], [6583, 6737], [6587, 6741], [6590, 6622], [6621, 6623], [6622, 6624, 6744], [6623, 6625], [6591, 6624, 6626], [6625, 6627], [6626, 6628, 6745], [6627, 6629], [6592, 6628, 6630], [6629, 6631], [6630, 6632, 6746], [6631, 6633], [6593, 6632, 6634], [6633, 6635], [6634, 6636, 6747], [6635, 6637], [6594, 6636, 6638], [6637, 6639], [6638, 6640, 6748], [6639, 6641], [6595, 6640, 6642], [6641, 6643], [6642, 6644, 6749], [6643, 6645], [6596, 6644, 6646], [6645, 6647], [6646, 6648, 6750], [6647, 6649], [6597, 6648, 6650], [6649, 6651], [6650, 6652, 6751], [6651, 6653], [6598, 6652, 6654], [6653, 6655], [6654, 6656, 6752], [6655, 6657], [6599, 6656, 6658], [6657, 6659], [6658, 6660, 6753], [6659, 6661], [6600, 6660, 6662], [6661, 6663], [6662, 6664, 6754], [6663, 6665], [6601, 6664, 6666], [6665, 6667], [6666, 6668, 6755], [6667, 6669], [6602, 6668, 6670], [6669, 6671], [6670, 6672, 6756], [6671, 6673], [6603, 6672, 6674], [6673, 6675], [6674, 6676, 6757], [6675, 6677], [6604, 6676, 6678], [6677, 6679], [6678, 6680, 6758], [6679, 6681], [6605, 6680, 6682], [6681, 6683], [6682, 6684, 6759], [6683, 6685], [6606, 6684, 6686], [6685, 6687], [6686, 6688, 6760], [6687, 6689], [6607, 6688, 6690], [6689, 6691], [6690, 6692, 6761], [6691, 6693], [6608, 6692, 6694], [6693, 6695], [6694, 6696, 6762], [6695, 6697], [6609, 6696, 6698], [6697, 6699], [6698, 6700, 6763], [6699, 6701], [6610, 6700, 6702], [6701, 6703], [6702, 6704, 6764], [6703, 6705], [6611, 6704, 6706], [6705, 6707], [6706, 6708, 6765], [6707, 6709], [6612, 6708, 6710], [6709, 6711], [6710, 6712, 6766], [6711, 6713], [6613, 6712, 6714], [6713, 6715], [6714, 6716, 6767], [6715, 6717], [6614, 6716, 6718], [6717, 6719], [6718, 6720, 6768], [6719, 6721], [6615, 6720, 6722], [6721, 6723], [6722, 6724, 6769], [6723, 6725], [6616, 6724, 6726], [6725, 6727], [6726, 6728, 6770], [6727, 6729], [6617, 6728, 6730], [6729, 6731], [6730, 6732, 6771], [6731, 6733], [6618, 6732, 6734], [6733, 6735], [6734, 6736, 6772], [6735, 6737], [6619, 6736, 6738], [6737, 6739], [6738, 6740, 6773], [6739, 6741], [6620, 6740, 6742], [6741, 6743], [6742, 6774], [6623, 6777], [6627, 6781], [6631, 6785], [6635, 6789], [6639, 6793], [6643, 6797], [6647, 6801], [6651, 6805], [6655, 6809], [6659, 6813], [6663, 6817], [6667, 6821], [6671, 6825], [6675, 6829], [6679, 6833], [6683, 6837], [6687, 6841], [6691, 6845], [6695, 6849], [6699, 6853], [6703, 6857], [6707, 6861], [6711, 6865], [6715, 6869], [6719, 6873], [6723, 6877], [6727, 6881], [6731, 6885], [6735, 6889], [6739, 6893], [6743, 6897], [6776, 6898], [6775, 6777], [6744, 6776, 6778], [6777, 6779], [6778, 6780, 6899], [6779, 6781], [6745, 6780, 6782], [6781, 6783], [6782, 6784, 6900], [6783, 6785], [6746, 6784, 6786], [6785, 6787], [6786, 6788, 6901], [6787, 6789], [6747, 6788, 6790], [6789, 6791], [6790, 6792, 6902], [6791, 6793], [6748, 6792, 6794], [6793, 6795], [6794, 6796, 6903], [6795, 6797], [6749, 6796, 6798], [6797, 6799], [6798, 6800, 6904], [6799, 6801], [6750, 6800, 6802], [6801, 6803], [6802, 6804, 6905], [6803, 6805], [6751, 6804, 6806], [6805, 6807], [6806, 6808, 6906], [6807, 6809], [6752, 6808, 6810], [6809, 6811], [6810, 6812, 6907], [6811, 6813], [6753, 6812, 6814], [6813, 6815], [6814, 6816, 6908], [6815, 6817], [6754, 6816, 6818], [6817, 6819], [6818, 6820, 6909], [6819, 6821], [6755, 6820, 6822], [6821, 6823], [6822, 6824, 6910], [6823, 6825], [6756, 6824, 6826], [6825, 6827], [6826, 6828, 6911], [6827, 6829], [6757, 6828, 6830], [6829, 6831], [6830, 6832, 6912], [6831, 6833], [6758, 6832, 6834], [6833, 6835], [6834, 6836, 6913], [6835, 6837], [6759, 6836, 6838], [6837, 6839], [6838, 6840, 6914], [6839, 6841], [6760, 6840, 6842], [6841, 6843], [6842, 6844, 6915], [6843, 6845], [6761, 6844, 6846], [6845, 6847], [6846, 6848, 6916], [6847, 6849], [6762, 6848, 6850], [6849, 6851], [6850, 6852, 6917], [6851, 6853], [6763, 6852, 6854], [6853, 6855], [6854, 6856, 6918], [6855, 6857], [6764, 6856, 6858], [6857, 6859], [6858, 6860, 6919], [6859, 6861], [6765, 6860, 6862], [6861, 6863], [6862, 6864, 6920], [6863, 6865], [6766, 6864, 6866], [6865, 6867], [6866, 6868, 6921], [6867, 6869], [6767, 6868, 6870], [6869, 6871], [6870, 6872, 6922], [6871, 6873], [6768, 6872, 6874], [6873, 6875], [6874, 6876, 6923], [6875, 6877], [6769, 6876, 6878], [6877, 6879], [6878, 6880, 6924], [6879, 6881], [6770, 6880, 6882], [6881, 6883], [6882, 6884, 6925], [6883, 6885], [6771, 6884, 6886], [6885, 6887], [6886, 6888, 6926], [6887, 6889], [6772, 6888, 6890], [6889, 6891], [6890, 6892, 6927], [6891, 6893], [6773, 6892, 6894], [6893, 6895], [6894, 6896, 6928], [6895, 6897], [6774, 6896], [6775, 6929], [6779, 6933], [6783, 6937], [6787, 6941], [6791, 6945], [6795, 6949], [6799, 6953], [6803, 6957], [6807, 6961], [6811, 6965], [6815, 6969], [6819, 6973], [6823, 6977], [6827, 6981], [6831, 6985], [6835, 6989], [6839, 6993], [6843, 6997], [6847, 7001], [6851, 7005], [6855, 7009], [6859, 7013], [6863, 7017], [6867, 7021], [6871, 7025], [6875, 7029], [6879, 7033], [6883, 7037], [6887, 7041], [6891, 7045], [6895, 7049], [6898, 6930], [6929, 6931], [6930, 6932, 7052], [6931, 6933], [6899, 6932, 6934], [6933, 6935], [6934, 6936, 7053], [6935, 6937], [6900, 6936, 6938], [6937, 6939], [6938, 6940, 7054], [6939, 6941], [6901, 6940, 6942], [6941, 6943], [6942, 6944, 7055], [6943, 6945], [6902, 6944, 6946], [6945, 6947], [6946, 6948, 7056], [6947, 6949], [6903, 6948, 6950], [6949, 6951], [6950, 6952, 7057], [6951, 6953], [6904, 6952, 6954], [6953, 6955], [6954, 6956, 7058], [6955, 6957], [6905, 6956, 6958], [6957, 6959], [6958, 6960, 7059], [6959, 6961], [6906, 6960, 6962], [6961, 6963], [6962, 6964, 7060], [6963, 6965], [6907, 6964, 6966], [6965, 6967], [6966, 6968, 7061], [6967, 6969], [6908, 6968, 6970], [6969, 6971], [6970, 6972, 7062], [6971, 6973], [6909, 6972, 6974], [6973, 6975], [6974, 6976, 7063], [6975, 6977], [6910, 6976, 6978], [6977, 6979], [6978, 6980, 7064], [6979, 6981], [6911, 6980, 6982], [6981, 6983], [6982, 6984, 7065], [6983, 6985], [6912, 6984, 6986], [6985, 6987], [6986, 6988, 7066], [6987, 6989], [6913, 6988, 6990], [6989, 6991], [6990, 6992, 7067], [6991, 6993], [6914, 6992, 6994], [6993, 6995], [6994, 6996, 7068], [6995, 6997], [6915, 6996, 6998], [6997, 6999], [6998, 7000, 7069], [6999, 7001], [6916, 7000, 7002], [7001, 7003], [7002, 7004, 7070], [7003, 7005], [6917, 7004, 7006], [7005, 7007], [7006, 7008, 7071], [7007, 7009], [6918, 7008, 7010], [7009, 7011], [7010, 7012, 7072], [7011, 7013], [6919, 7012, 7014], [7013, 7015], [7014, 7016, 7073], [7015, 7017], [6920, 7016, 7018], [7017, 7019], [7018, 7020, 7074], [7019, 7021], [6921, 7020, 7022], [7021, 7023], [7022, 7024, 7075], [7023, 7025], [6922, 7024, 7026], [7025, 7027], [7026, 7028, 7076], [7027, 7029], [6923, 7028, 7030], [7029, 7031], [7030, 7032, 7077], [7031, 7033], [6924, 7032, 7034], [7033, 7035], [7034, 7036, 7078], [7035, 7037], [6925, 7036, 7038], [7037, 7039], [7038, 7040, 7079], [7039, 7041], [6926, 7040, 7042], [7041, 7043], [7042, 7044, 7080], [7043, 7045], [6927, 7044, 7046], [7045, 7047], [7046, 7048, 7081], [7047, 7049], [6928, 7048, 7050], [7049, 7051], [7050, 7082], [6931, 7085], [6935, 7089], [6939, 7093], [6943, 7097], [6947, 7101], [6951, 7105], [6955, 7109], [6959, 7113], [6963, 7117], [6967, 7121], [6971, 7125], [6975, 7129], [6979, 7133], [6983, 7137], [6987, 7141], [6991, 7145], [6995, 7149], [6999, 7153], [7003, 7157], [7007, 7161], [7011, 7165], [7015, 7169], [7019, 7173], [7023, 7177], [7027, 7181], [7031, 7185], [7035, 7189], [7039, 7193], [7043, 7197], [7047, 7201], [7051, 7205], [7084, 7206], [7083, 7085], [7052, 7084, 7086], [7085, 7087], [7086, 7088, 7207], [7087, 7089], [7053, 7088, 7090], [7089, 7091], [7090, 7092, 7208], [7091, 7093], [7054, 7092, 7094], [7093, 7095], [7094, 7096, 7209], [7095, 7097], [7055, 7096, 7098], [7097, 7099], [7098, 7100, 7210], [7099, 7101], [7056, 7100, 7102], [7101, 7103], [7102, 7104, 7211], [7103, 7105], [7057, 7104, 7106], [7105, 7107], [7106, 7108, 7212], [7107, 7109], [7058, 7108, 7110], [7109, 7111], [7110, 7112, 7213], [7111, 7113], [7059, 7112, 7114], [7113, 7115], [7114, 7116, 7214], [7115, 7117], [7060, 7116, 7118], [7117, 7119], [7118, 7120, 7215], [7119, 7121], [7061, 7120, 7122], [7121, 7123], [7122, 7124, 7216], [7123, 7125], [7062, 7124, 7126], [7125, 7127], [7126, 7128, 7217], [7127, 7129], [7063, 7128, 7130], [7129, 7131], [7130, 7132, 7218], [7131, 7133], [7064, 7132, 7134], [7133, 7135], [7134, 7136, 7219], [7135, 7137], [7065, 7136, 7138], [7137, 7139], [7138, 7140, 7220], [7139, 7141], [7066, 7140, 7142], [7141, 7143], [7142, 7144, 7221], [7143, 7145], [7067, 7144, 7146], [7145, 7147], [7146, 7148, 7222], [7147, 7149], [7068, 7148, 7150], [7149, 7151], [7150, 7152, 7223], [7151, 7153], [7069, 7152, 7154], [7153, 7155], [7154, 7156, 7224], [7155, 7157], [7070, 7156, 7158], [7157, 7159], [7158, 7160, 7225], [7159, 7161], [7071, 7160, 7162], [7161, 7163], [7162, 7164, 7226], [7163, 7165], [7072, 7164, 7166], [7165, 7167], [7166, 7168, 7227], [7167, 7169], [7073, 7168, 7170], [7169, 7171], [7170, 7172, 7228], [7171, 7173], [7074, 7172, 7174], [7173, 7175], [7174, 7176, 7229], [7175, 7177], [7075, 7176, 7178], [7177, 7179], [7178, 7180, 7230], [7179, 7181], [7076, 7180, 7182], [7181, 7183], [7182, 7184, 7231], [7183, 7185], [7077, 7184, 7186], [7185, 7187], [7186, 7188, 7232], [7187, 7189], [7078, 7188, 7190], [7189, 7191], [7190, 7192, 7233], [7191, 7193], [7079, 7192, 7194], [7193, 7195], [7194, 7196, 7234], [7195, 7197], [7080, 7196, 7198], [7197, 7199], [7198, 7200, 7235], [7199, 7201], [7081, 7200, 7202], [7201, 7203], [7202, 7204, 7236], [7203, 7205], [7082, 7204], [7083, 7237], [7087, 7241], [7091, 7245], [7095, 7249], [7099, 7253], [7103, 7257], [7107, 7261], [7111, 7265], [7115, 7269], [7119, 7273], [7123, 7277], [7127, 7281], [7131, 7285], [7135, 7289], [7139, 7293], [7143, 7297], [7147, 7301], [7151, 7305], [7155, 7309], [7159, 7313], [7163, 7317], [7167, 7321], [7171, 7325], [7175, 7329], [7179, 7333], [7183, 7337], [7187, 7341], [7191, 7345], [7195, 7349], [7199, 7353], [7203, 7357], [7206, 7238], [7237, 7239], [7238, 7240, 7360], [7239, 7241], [7207, 7240, 7242], [7241, 7243], [7242, 7244, 7361], [7243, 7245], [7208, 7244, 7246], [7245, 7247], [7246, 7248, 7362], [7247, 7249], [7209, 7248, 7250], [7249, 7251], [7250, 7252, 7363], [7251, 7253], [7210, 7252, 7254], [7253, 7255], [7254, 7256, 7364], [7255, 7257], [7211, 7256, 7258], [7257, 7259], [7258, 7260, 7365], [7259, 7261], [7212, 7260, 7262], [7261, 7263], [7262, 7264, 7366], [7263, 7265], [7213, 7264, 7266], [7265, 7267], [7266, 7268, 7367], [7267, 7269], [7214, 7268, 7270], [7269, 7271], [7270, 7272, 7368], [7271, 7273], [7215, 7272, 7274], [7273, 7275], [7274, 7276, 7369], [7275, 7277], [7216, 7276, 7278], [7277, 7279], [7278, 7280, 7370], [7279, 7281], [7217, 7280, 7282], [7281, 7283], [7282, 7284, 7371], [7283, 7285], [7218, 7284, 7286], [7285, 7287], [7286, 7288, 7372], [7287, 7289], [7219, 7288, 7290], [7289, 7291], [7290, 7292, 7373], [7291, 7293], [7220, 7292, 7294], [7293, 7295], [7294, 7296, 7374], [7295, 7297], [7221, 7296, 7298], [7297, 7299], [7298, 7300, 7375], [7299, 7301], [7222, 7300, 7302], [7301, 7303], [7302, 7304, 7376], [7303, 7305], [7223, 7304, 7306], [7305, 7307], [7306, 7308, 7377], [7307, 7309], [7224, 7308, 7310], [7309, 7311], [7310, 7312, 7378], [7311, 7313], [7225, 7312, 7314], [7313, 7315], [7314, 7316, 7379], [7315, 7317], [7226, 7316, 7318], [7317, 7319], [7318, 7320, 7380], [7319, 7321], [7227, 7320, 7322], [7321, 7323], [7322, 7324, 7381], [7323, 7325], [7228, 7324, 7326], [7325, 7327], [7326, 7328, 7382], [7327, 7329], [7229, 7328, 7330], [7329, 7331], [7330, 7332, 7383], [7331, 7333], [7230, 7332, 7334], [7333, 7335], [7334, 7336, 7384], [7335, 7337], [7231, 7336, 7338], [7337, 7339], [7338, 7340, 7385], [7339, 7341], [7232, 7340, 7342], [7341, 7343], [7342, 7344, 7386], [7343, 7345], [7233, 7344, 7346], [7345, 7347], [7346, 7348, 7387], [7347, 7349], [7234, 7348, 7350], [7349, 7351], [7350, 7352, 7388], [7351, 7353], [7235, 7352, 7354], [7353, 7355], [7354, 7356, 7389], [7355, 7357], [7236, 7356, 7358], [7357, 7359], [7358, 7390], [7239, 7393], [7243, 7397], [7247, 7401], [7251, 7405], [7255, 7409], [7259, 7413], [7263, 7417], [7267, 7421], [7271, 7425], [7275, 7429], [7279, 7433], [7283, 7437], [7287, 7441], [7291, 7445], [7295, 7449], [7299, 7453], [7303, 7457], [7307, 7461], [7311, 7465], [7315, 7469], [7319, 7473], [7323, 7477], [7327, 7481], [7331, 7485], [7335, 7489], [7339, 7493], [7343, 7497], [7347, 7501], [7351, 7505], [7355, 7509], [7359, 7513], [7392, 7514], [7391, 7393], [7360, 7392, 7394], [7393, 7395], [7394, 7396, 7515], [7395, 7397], [7361, 7396, 7398], [7397, 7399], [7398, 7400, 7516], [7399, 7401], [7362, 7400, 7402], [7401, 7403], [7402, 7404, 7517], [7403, 7405], [7363, 7404, 7406], [7405, 7407], [7406, 7408, 7518], [7407, 7409], [7364, 7408, 7410], [7409, 7411], [7410, 7412, 7519], [7411, 7413], [7365, 7412, 7414], [7413, 7415], [7414, 7416, 7520], [7415, 7417], [7366, 7416, 7418], [7417, 7419], [7418, 7420, 7521], [7419, 7421], [7367, 7420, 7422], [7421, 7423], [7422, 7424, 7522], [7423, 7425], [7368, 7424, 7426], [7425, 7427], [7426, 7428, 7523], [7427, 7429], [7369, 7428, 7430], [7429, 7431], [7430, 7432, 7524], [7431, 7433], [7370, 7432, 7434], [7433, 7435], [7434, 7436, 7525], [7435, 7437], [7371, 7436, 7438], [7437, 7439], [7438, 7440, 7526], [7439, 7441], [7372, 7440, 7442], [7441, 7443], [7442, 7444, 7527], [7443, 7445], [7373, 7444, 7446], [7445, 7447], [7446, 7448, 7528], [7447, 7449], [7374, 7448, 7450], [7449, 7451], [7450, 7452, 7529], [7451, 7453], [7375, 7452, 7454], [7453, 7455], [7454, 7456, 7530], [7455, 7457], [7376, 7456, 7458], [7457, 7459], [7458, 7460, 7531], [7459, 7461], [7377, 7460, 7462], [7461, 7463], [7462, 7464, 7532], [7463, 7465], [7378, 7464, 7466], [7465, 7467], [7466, 7468, 7533], [7467, 7469], [7379, 7468, 7470], [7469, 7471], [7470, 7472, 7534], [7471, 7473], [7380, 7472, 7474], [7473, 7475], [7474, 7476, 7535], [7475, 7477], [7381, 7476, 7478], [7477, 7479], [7478, 7480, 7536], [7479, 7481], [7382, 7480, 7482], [7481, 7483], [7482, 7484, 7537], [7483, 7485], [7383, 7484, 7486], [7485, 7487], [7486, 7488, 7538], [7487, 7489], [7384, 7488, 7490], [7489, 7491], [7490, 7492, 7539], [7491, 7493], [7385, 7492, 7494], [7493, 7495], [7494, 7496, 7540], [7495, 7497], [7386, 7496, 7498], [7497, 7499], [7498, 7500, 7541], [7499, 7501], [7387, 7500, 7502], [7501, 7503], [7502, 7504, 7542], [7503, 7505], [7388, 7504, 7506], [7505, 7507], [7506, 7508, 7543], [7507, 7509], [7389, 7508, 7510], [7509, 7511], [7510, 7512, 7544], [7511, 7513], [7390, 7512], [7391, 7545], [7395, 7549], [7399, 7553], [7403, 7557], [7407, 7561], [7411, 7565], [7415, 7569], [7419, 7573], [7423, 7577], [7427, 7581], [7431, 7585], [7435, 7589], [7439, 7593], [7443, 7597], [7447, 7601], [7451, 7605], [7455, 7609], [7459, 7613], [7463, 7617], [7467, 7621], [7471, 7625], [7475, 7629], [7479, 7633], [7483, 7637], [7487, 7641], [7491, 7645], [7495, 7649], [7499, 7653], [7503, 7657], [7507, 7661], [7511, 7665], [7514, 7546], [7545, 7547], [7546, 7548, 7668], [7547, 7549], [7515, 7548, 7550], [7549, 7551], [7550, 7552, 7669], [7551, 7553], [7516, 7552, 7554], [7553, 7555], [7554, 7556, 7670], [7555, 7557], [7517, 7556, 7558], [7557, 7559], [7558, 7560, 7671], [7559, 7561], [7518, 7560, 7562], [7561, 7563], [7562, 7564, 7672], [7563, 7565], [7519, 7564, 7566], [7565, 7567], [7566, 7568, 7673], [7567, 7569], [7520, 7568, 7570], [7569, 7571], [7570, 7572, 7674], [7571, 7573], [7521, 7572, 7574], [7573, 7575], [7574, 7576, 7675], [7575, 7577], [7522, 7576, 7578], [7577, 7579], [7578, 7580, 7676], [7579, 7581], [7523, 7580, 7582], [7581, 7583], [7582, 7584, 7677], [7583, 7585], [7524, 7584, 7586], [7585, 7587], [7586, 7588, 7678], [7587, 7589], [7525, 7588, 7590], [7589, 7591], [7590, 7592, 7679], [7591, 7593], [7526, 7592, 7594], [7593, 7595], [7594, 7596, 7680], [7595, 7597], [7527, 7596, 7598], [7597, 7599], [7598, 7600, 7681], [7599, 7601], [7528, 7600, 7602], [7601, 7603], [7602, 7604, 7682], [7603, 7605], [7529, 7604, 7606], [7605, 7607], [7606, 7608, 7683], [7607, 7609], [7530, 7608, 7610], [7609, 7611], [7610, 7612, 7684], [7611, 7613], [7531, 7612, 7614], [7613, 7615], [7614, 7616, 7685], [7615, 7617], [7532, 7616, 7618], [7617, 7619], [7618, 7620, 7686], [7619, 7621], [7533, 7620, 7622], [7621, 7623], [7622, 7624, 7687], [7623, 7625], [7534, 7624, 7626], [7625, 7627], [7626, 7628, 7688], [7627, 7629], [7535, 7628, 7630], [7629, 7631], [7630, 7632, 7689], [7631, 7633], [7536, 7632, 7634], [7633, 7635], [7634, 7636, 7690], [7635, 7637], [7537, 7636, 7638], [7637, 7639], [7638, 7640, 7691], [7639, 7641], [7538, 7640, 7642], [7641, 7643], [7642, 7644, 7692], [7643, 7645], [7539, 7644, 7646], [7645, 7647], [7646, 7648, 7693], [7647, 7649], [7540, 7648, 7650], [7649, 7651], [7650, 7652, 7694], [7651, 7653], [7541, 7652, 7654], [7653, 7655], [7654, 7656, 7695], [7655, 7657], [7542, 7656, 7658], [7657, 7659], [7658, 7660, 7696], [7659, 7661], [7543, 7660, 7662], [7661, 7663], [7662, 7664, 7697], [7663, 7665], [7544, 7664, 7666], [7665, 7667], [7666, 7698], [7547, 7701], [7551, 7705], [7555, 7709], [7559, 7713], [7563, 7717], [7567, 7721], [7571, 7725], [7575, 7729], [7579, 7733], [7583, 7737], [7587, 7741], [7591, 7745], [7595, 7749], [7599, 7753], [7603, 7757], [7607, 7761], [7611, 7765], [7615, 7769], [7619, 7773], [7623, 7777], [7627, 7781], [7631, 7785], [7635, 7789], [7639, 7793], [7643, 7797], [7647, 7801], [7651, 7805], [7655, 7809], [7659, 7813], [7663, 7817], [7667, 7821], [7700, 7822], [7699, 7701], [7668, 7700, 7702], [7701, 7703], [7702, 7704, 7823], [7703, 7705], [7669, 7704, 7706], [7705, 7707], [7706, 7708, 7824], [7707, 7709], [7670, 7708, 7710], [7709, 7711], [7710, 7712, 7825], [7711, 7713], [7671, 7712, 7714], [7713, 7715], [7714, 7716, 7826], [7715, 7717], [7672, 7716, 7718], [7717, 7719], [7718, 7720, 7827], [7719, 7721], [7673, 7720, 7722], [7721, 7723], [7722, 7724, 7828], [7723, 7725], [7674, 7724, 7726], [7725, 7727], [7726, 7728, 7829], [7727, 7729], [7675, 7728, 7730], [7729, 7731], [7730, 7732, 7830], [7731, 7733], [7676, 7732, 7734], [7733, 7735], [7734, 7736, 7831], [7735, 7737], [7677, 7736, 7738], [7737, 7739], [7738, 7740, 7832], [7739, 7741], [7678, 7740, 7742], [7741, 7743], [7742, 7744, 7833], [7743, 7745], [7679, 7744, 7746], [7745, 7747], [7746, 7748, 7834], [7747, 7749], [7680, 7748, 7750], [7749, 7751], [7750, 7752, 7835], [7751, 7753], [7681, 7752, 7754], [7753, 7755], [7754, 7756, 7836], [7755, 7757], [7682, 7756, 7758], [7757, 7759], [7758, 7760, 7837], [7759, 7761], [7683, 7760, 7762], [7761, 7763], [7762, 7764, 7838], [7763, 7765], [7684, 7764, 7766], [7765, 7767], [7766, 7768, 7839], [7767, 7769], [7685, 7768, 7770], [7769, 7771], [7770, 7772, 7840], [7771, 7773], [7686, 7772, 7774], [7773, 7775], [7774, 7776, 7841], [7775, 7777], [7687, 7776, 7778], [7777, 7779], [7778, 7780, 7842], [7779, 7781], [7688, 7780, 7782], [7781, 7783], [7782, 7784, 7843], [7783, 7785], [7689, 7784, 7786], [7785, 7787], [7786, 7788, 7844], [7787, 7789], [7690, 7788, 7790], [7789, 7791], [7790, 7792, 7845], [7791, 7793], [7691, 7792, 7794], [7793, 7795], [7794, 7796, 7846], [7795, 7797], [7692, 7796, 7798], [7797, 7799], [7798, 7800, 7847], [7799, 7801], [7693, 7800, 7802], [7801, 7803], [7802, 7804, 7848], [7803, 7805], [7694, 7804, 7806], [7805, 7807], [7806, 7808, 7849], [7807, 7809], [7695, 7808, 7810], [7809, 7811], [7810, 7812, 7850], [7811, 7813], [7696, 7812, 7814], [7813, 7815], [7814, 7816, 7851], [7815, 7817], [7697, 7816, 7818], [7817, 7819], [7818, 7820, 7852], [7819, 7821], [7698, 7820], [7699, 7853], [7703, 7857], [7707, 7861], [7711, 7865], [7715, 7869], [7719, 7873], [7723, 7877], [7727, 7881], [7731, 7885], [7735, 7889], [7739, 7893], [7743, 7897], [7747, 7901], [7751, 7905], [7755, 7909], [7759, 7913], [7763, 7917], [7767, 7921], [7771, 7925], [7775, 7929], [7779, 7933], [7783, 7937], [7787, 7941], [7791, 7945], [7795, 7949], [7799, 7953], [7803, 7957], [7807, 7961], [7811, 7965], [7815, 7969], [7819, 7973], [7822, 7854], [7853, 7855], [7854, 7856, 7976], [7855, 7857], [7823, 7856, 7858], [7857, 7859], [7858, 7860, 7977], [7859, 7861], [7824, 7860, 7862], [7861, 7863], [7862, 7864, 7978], [7863, 7865], [7825, 7864, 7866], [7865, 7867], [7866, 7868, 7979], [7867, 7869], [7826, 7868, 7870], [7869, 7871], [7870, 7872, 7980], [7871, 7873], [7827, 7872, 7874], [7873, 7875], [7874, 7876, 7981], [7875, 7877], [7828, 7876, 7878], [7877, 7879], [7878, 7880, 7982], [7879, 7881], [7829, 7880, 7882], [7881, 7883], [7882, 7884, 7983], [7883, 7885], [7830, 7884, 7886], [7885, 7887], [7886, 7888, 7984], [7887, 7889], [7831, 7888, 7890], [7889, 7891], [7890, 7892, 7985], [7891, 7893], [7832, 7892, 7894], [7893, 7895], [7894, 7896, 7986], [7895, 7897], [7833, 7896, 7898], [7897, 7899], [7898, 7900, 7987], [7899, 7901], [7834, 7900, 7902], [7901, 7903], [7902, 7904, 7988], [7903, 7905], [7835, 7904, 7906], [7905, 7907], [7906, 7908, 7989], [7907, 7909], [7836, 7908, 7910], [7909, 7911], [7910, 7912, 7990], [7911, 7913], [7837, 7912, 7914], [7913, 7915], [7914, 7916, 7991], [7915, 7917], [7838, 7916, 7918], [7917, 7919], [7918, 7920, 7992], [7919, 7921], [7839, 7920, 7922], [7921, 7923], [7922, 7924, 7993], [7923, 7925], [7840, 7924, 7926], [7925, 7927], [7926, 7928, 7994], [7927, 7929], [7841, 7928, 7930], [7929, 7931], [7930, 7932, 7995], [7931, 7933], [7842, 7932, 7934], [7933, 7935], [7934, 7936, 7996], [7935, 7937], [7843, 7936, 7938], [7937, 7939], [7938, 7940, 7997], [7939, 7941], [7844, 7940, 7942], [7941, 7943], [7942, 7944, 7998], [7943, 7945], [7845, 7944, 7946], [7945, 7947], [7946, 7948, 7999], [7947, 7949], [7846, 7948, 7950], [7949, 7951], [7950, 7952, 8000], [7951, 7953], [7847, 7952, 7954], [7953, 7955], [7954, 7956, 8001], [7955, 7957], [7848, 7956, 7958], [7957, 7959], [7958, 7960, 8002], [7959, 7961], [7849, 7960, 7962], [7961, 7963], [7962, 7964, 8003], [7963, 7965], [7850, 7964, 7966], [7965, 7967], [7966, 7968, 8004], [7967, 7969], [7851, 7968, 7970], [7969, 7971], [7970, 7972, 8005], [7971, 7973], [7852, 7972, 7974], [7973, 7975], [7974, 8006], [7855, 8009], [7859, 8013], [7863, 8017], [7867, 8021], [7871, 8025], [7875, 8029], [7879, 8033], [7883, 8037], [7887, 8041], [7891, 8045], [7895, 8049], [7899, 8053], [7903, 8057], [7907, 8061], [7911, 8065], [7915, 8069], [7919, 8073], [7923, 8077], [7927, 8081], [7931, 8085], [7935, 8089], [7939, 8093], [7943, 8097], [7947, 8101], [7951, 8105], [7955, 8109], [7959, 8113], [7963, 8117], [7967, 8121], [7971, 8125], [7975, 8129], [8008, 8130], [8007, 8009], [7976, 8008, 8010], [8009, 8011], [8010, 8012, 8131], [8011, 8013], [7977, 8012, 8014], [8013, 8015], [8014, 8016, 8132], [8015, 8017], [7978, 8016, 8018], [8017, 8019], [8018, 8020, 8133], [8019, 8021], [7979, 8020, 8022], [8021, 8023], [8022, 8024, 8134], [8023, 8025], [7980, 8024, 8026], [8025, 8027], [8026, 8028, 8135], [8027, 8029], [7981, 8028, 8030], [8029, 8031], [8030, 8032, 8136], [8031, 8033], [7982, 8032, 8034], [8033, 8035], [8034, 8036, 8137], [8035, 8037], [7983, 8036, 8038], [8037, 8039], [8038, 8040, 8138], [8039, 8041], [7984, 8040, 8042], [8041, 8043], [8042, 8044, 8139], [8043, 8045], [7985, 8044, 8046], [8045, 8047], [8046, 8048, 8140], [8047, 8049], [7986, 8048, 8050], [8049, 8051], [8050, 8052, 8141], [8051, 8053], [7987, 8052, 8054], [8053, 8055], [8054, 8056, 8142], [8055, 8057], [7988, 8056, 8058], [8057, 8059], [8058, 8060, 8143], [8059, 8061], [7989, 8060, 8062], [8061, 8063], [8062, 8064, 8144], [8063, 8065], [7990, 8064, 8066], [8065, 8067], [8066, 8068, 8145], [8067, 8069], [7991, 8068, 8070], [8069, 8071], [8070, 8072, 8146], [8071, 8073], [7992, 8072, 8074], [8073, 8075], [8074, 8076, 8147], [8075, 8077], [7993, 8076, 8078], [8077, 8079], [8078, 8080, 8148], [8079, 8081], [7994, 8080, 8082], [8081, 8083], [8082, 8084, 8149], [8083, 8085], [7995, 8084, 8086], [8085, 8087], [8086, 8088, 8150], [8087, 8089], [7996, 8088, 8090], [8089, 8091], [8090, 8092, 8151], [8091, 8093], [7997, 8092, 8094], [8093, 8095], [8094, 8096, 8152], [8095, 8097], [7998, 8096, 8098], [8097, 8099], [8098, 8100, 8153], [8099, 8101], [7999, 8100, 8102], [8101, 8103], [8102, 8104, 8154], [8103, 8105], [8000, 8104, 8106], [8105, 8107], [8106, 8108, 8155], [8107, 8109], [8001, 8108, 8110], [8109, 8111], [8110, 8112, 8156], [8111, 8113], [8002, 8112, 8114], [8113, 8115], [8114, 8116, 8157], [8115, 8117], [8003, 8116, 8118], [8117, 8119], [8118, 8120, 8158], [8119, 8121], [8004, 8120, 8122], [8121, 8123], [8122, 8124, 8159], [8123, 8125], [8005, 8124, 8126], [8125, 8127], [8126, 8128, 8160], [8127, 8129], [8006, 8128], [8007, 8161], [8011, 8165], [8015, 8169], [8019, 8173], [8023, 8177], [8027, 8181], [8031, 8185], [8035, 8189], [8039, 8193], [8043, 8197], [8047, 8201], [8051, 8205], [8055, 8209], [8059, 8213], [8063, 8217], [8067, 8221], [8071, 8225], [8075, 8229], [8079, 8233], [8083, 8237], [8087, 8241], [8091, 8245], [8095, 8249], [8099, 8253], [8103, 8257], [8107, 8261], [8111, 8265], [8115, 8269], [8119, 8273], [8123, 8277], [8127, 8281], [8130, 8162], [8161, 8163], [8162, 8164, 8284], [8163, 8165], [8131, 8164, 8166], [8165, 8167], [8166, 8168, 8285], [8167, 8169], [8132, 8168, 8170], [8169, 8171], [8170, 8172, 8286], [8171, 8173], [8133, 8172, 8174], [8173, 8175], [8174, 8176, 8287], [8175, 8177], [8134, 8176, 8178], [8177, 8179], [8178, 8180, 8288], [8179, 8181], [8135, 8180, 8182], [8181, 8183], [8182, 8184, 8289], [8183, 8185], [8136, 8184, 8186], [8185, 8187], [8186, 8188, 8290], [8187, 8189], [8137, 8188, 8190], [8189, 8191], [8190, 8192, 8291], [8191, 8193], [8138, 8192, 8194], [8193, 8195], [8194, 8196, 8292], [8195, 8197], [8139, 8196, 8198], [8197, 8199], [8198, 8200, 8293], [8199, 8201], [8140, 8200, 8202], [8201, 8203], [8202, 8204, 8294], [8203, 8205], [8141, 8204, 8206], [8205, 8207], [8206, 8208, 8295], [8207, 8209], [8142, 8208, 8210], [8209, 8211], [8210, 8212, 8296], [8211, 8213], [8143, 8212, 8214], [8213, 8215], [8214, 8216, 8297], [8215, 8217], [8144, 8216, 8218], [8217, 8219], [8218, 8220, 8298], [8219, 8221], [8145, 8220, 8222], [8221, 8223], [8222, 8224, 8299], [8223, 8225], [8146, 8224, 8226], [8225, 8227], [8226, 8228, 8300], [8227, 8229], [8147, 8228, 8230], [8229, 8231], [8230, 8232, 8301], [8231, 8233], [8148, 8232, 8234], [8233, 8235], [8234, 8236, 8302], [8235, 8237], [8149, 8236, 8238], [8237, 8239], [8238, 8240, 8303], [8239, 8241], [8150, 8240, 8242], [8241, 8243], [8242, 8244, 8304], [8243, 8245], [8151, 8244, 8246], [8245, 8247], [8246, 8248, 8305], [8247, 8249], [8152, 8248, 8250], [8249, 8251], [8250, 8252, 8306], [8251, 8253], [8153, 8252, 8254], [8253, 8255], [8254, 8256, 8307], [8255, 8257], [8154, 8256, 8258], [8257, 8259], [8258, 8260, 8308], [8259, 8261], [8155, 8260, 8262], [8261, 8263], [8262, 8264, 8309], [8263, 8265], [8156, 8264, 8266], [8265, 8267], [8266, 8268, 8310], [8267, 8269], [8157, 8268, 8270], [8269, 8271], [8270, 8272, 8311], [8271, 8273], [8158, 8272, 8274], [8273, 8275], [8274, 8276, 8312], [8275, 8277], [8159, 8276, 8278], [8277, 8279], [8278, 8280, 8313], [8279, 8281], [8160, 8280, 8282], [8281, 8283], [8282, 8314], [8163, 8317], [8167, 8321], [8171, 8325], [8175, 8329], [8179, 8333], [8183, 8337], [8187, 8341], [8191, 8345], [8195, 8349], [8199, 8353], [8203, 8357], [8207, 8361], [8211, 8365], [8215, 8369], [8219, 8373], [8223, 8377], [8227, 8381], [8231, 8385], [8235, 8389], [8239, 8393], [8243, 8397], [8247, 8401], [8251, 8405], [8255, 8409], [8259, 8413], [8263, 8417], [8267, 8421], [8271, 8425], [8275, 8429], [8279, 8433], [8283, 8437], [8316, 8438], [8315, 8317], [8284, 8316, 8318], [8317, 8319], [8318, 8320, 8439], [8319, 8321], [8285, 8320, 8322], [8321, 8323], [8322, 8324, 8440], [8323, 8325], [8286, 8324, 8326], [8325, 8327], [8326, 8328, 8441], [8327, 8329], [8287, 8328, 8330], [8329, 8331], [8330, 8332, 8442], [8331, 8333], [8288, 8332, 8334], [8333, 8335], [8334, 8336, 8443], [8335, 8337], [8289, 8336, 8338], [8337, 8339], [8338, 8340, 8444], [8339, 8341], [8290, 8340, 8342], [8341, 8343], [8342, 8344, 8445], [8343, 8345], [8291, 8344, 8346], [8345, 8347], [8346, 8348, 8446], [8347, 8349], [8292, 8348, 8350], [8349, 8351], [8350, 8352, 8447], [8351, 8353], [8293, 8352, 8354], [8353, 8355], [8354, 8356, 8448], [8355, 8357], [8294, 8356, 8358], [8357, 8359], [8358, 8360, 8449], [8359, 8361], [8295, 8360, 8362], [8361, 8363], [8362, 8364, 8450], [8363, 8365], [8296, 8364, 8366], [8365, 8367], [8366, 8368, 8451], [8367, 8369], [8297, 8368, 8370], [8369, 8371], [8370, 8372, 8452], [8371, 8373], [8298, 8372, 8374], [8373, 8375], [8374, 8376, 8453], [8375, 8377], [8299, 8376, 8378], [8377, 8379], [8378, 8380, 8454], [8379, 8381], [8300, 8380, 8382], [8381, 8383], [8382, 8384, 8455], [8383, 8385], [8301, 8384, 8386], [8385, 8387], [8386, 8388, 8456], [8387, 8389], [8302, 8388, 8390], [8389, 8391], [8390, 8392, 8457], [8391, 8393], [8303, 8392, 8394], [8393, 8395], [8394, 8396, 8458], [8395, 8397], [8304, 8396, 8398], [8397, 8399], [8398, 8400, 8459], [8399, 8401], [8305, 8400, 8402], [8401, 8403], [8402, 8404, 8460], [8403, 8405], [8306, 8404, 8406], [8405, 8407], [8406, 8408, 8461], [8407, 8409], [8307, 8408, 8410], [8409, 8411], [8410, 8412, 8462], [8411, 8413], [8308, 8412, 8414], [8413, 8415], [8414, 8416, 8463], [8415, 8417], [8309, 8416, 8418], [8417, 8419], [8418, 8420, 8464], [8419, 8421], [8310, 8420, 8422], [8421, 8423], [8422, 8424, 8465], [8423, 8425], [8311, 8424, 8426], [8425, 8427], [8426, 8428, 8466], [8427, 8429], [8312, 8428, 8430], [8429, 8431], [8430, 8432, 8467], [8431, 8433], [8313, 8432, 8434], [8433, 8435], [8434, 8436, 8468], [8435, 8437], [8314, 8436], [8315, 8469], [8319, 8473], [8323, 8477], [8327, 8481], [8331, 8485], [8335, 8489], [8339, 8493], [8343, 8497], [8347, 8501], [8351, 8505], [8355, 8509], [8359, 8513], [8363, 8517], [8367, 8521], [8371, 8525], [8375, 8529], [8379, 8533], [8383, 8537], [8387, 8541], [8391, 8545], [8395, 8549], [8399, 8553], [8403, 8557], [8407, 8561], [8411, 8565], [8415, 8569], [8419, 8573], [8423, 8577], [8427, 8581], [8431, 8585], [8435, 8589], [8438, 8470], [8469, 8471], [8470, 8472, 8592], [8471, 8473], [8439, 8472, 8474], [8473, 8475], [8474, 8476, 8593], [8475, 8477], [8440, 8476, 8478], [8477, 8479], [8478, 8480, 8594], [8479, 8481], [8441, 8480, 8482], [8481, 8483], [8482, 8484, 8595], [8483, 8485], [8442, 8484, 8486], [8485, 8487], [8486, 8488, 8596], [8487, 8489], [8443, 8488, 8490], [8489, 8491], [8490, 8492, 8597], [8491, 8493], [8444, 8492, 8494], [8493, 8495], [8494, 8496, 8598], [8495, 8497], [8445, 8496, 8498], [8497, 8499], [8498, 8500, 8599], [8499, 8501], [8446, 8500, 8502], [8501, 8503], [8502, 8504, 8600], [8503, 8505], [8447, 8504, 8506], [8505, 8507], [8506, 8508, 8601], [8507, 8509], [8448, 8508, 8510], [8509, 8511], [8510, 8512, 8602], [8511, 8513], [8449, 8512, 8514], [8513, 8515], [8514, 8516, 8603], [8515, 8517], [8450, 8516, 8518], [8517, 8519], [8518, 8520, 8604], [8519, 8521], [8451, 8520, 8522], [8521, 8523], [8522, 8524, 8605], [8523, 8525], [8452, 8524, 8526], [8525, 8527], [8526, 8528, 8606], [8527, 8529], [8453, 8528, 8530], [8529, 8531], [8530, 8532, 8607], [8531, 8533], [8454, 8532, 8534], [8533, 8535], [8534, 8536, 8608], [8535, 8537], [8455, 8536, 8538], [8537, 8539], [8538, 8540, 8609], [8539, 8541], [8456, 8540, 8542], [8541, 8543], [8542, 8544, 8610], [8543, 8545], [8457, 8544, 8546], [8545, 8547], [8546, 8548, 8611], [8547, 8549], [8458, 8548, 8550], [8549, 8551], [8550, 8552, 8612], [8551, 8553], [8459, 8552, 8554], [8553, 8555], [8554, 8556, 8613], [8555, 8557], [8460, 8556, 8558], [8557, 8559], [8558, 8560, 8614], [8559, 8561], [8461, 8560, 8562], [8561, 8563], [8562, 8564, 8615], [8563, 8565], [8462, 8564, 8566], [8565, 8567], [8566, 8568, 8616], [8567, 8569], [8463, 8568, 8570], [8569, 8571], [8570, 8572, 8617], [8571, 8573], [8464, 8572, 8574], [8573, 8575], [8574, 8576, 8618], [8575, 8577], [8465, 8576, 8578], [8577, 8579], [8578, 8580, 8619], [8579, 8581], [8466, 8580, 8582], [8581, 8583], [8582, 8584, 8620], [8583, 8585], [8467, 8584, 8586], [8585, 8587], [8586, 8588, 8621], [8587, 8589], [8468, 8588, 8590], [8589, 8591], [8590, 8622], [8471, 8625], [8475, 8629], [8479, 8633], [8483, 8637], [8487, 8641], [8491, 8645], [8495, 8649], [8499, 8653], [8503, 8657], [8507, 8661], [8511, 8665], [8515, 8669], [8519, 8673], [8523, 8677], [8527, 8681], [8531, 8685], [8535, 8689], [8539, 8693], [8543, 8697], [8547, 8701], [8551, 8705], [8555, 8709], [8559, 8713], [8563, 8717], [8567, 8721], [8571, 8725], [8575, 8729], [8579, 8733], [8583, 8737], [8587, 8741], [8591, 8745], [8624, 8746], [8623, 8625], [8592, 8624, 8626], [8625, 8627], [8626, 8628, 8747], [8627, 8629], [8593, 8628, 8630], [8629, 8631], [8630, 8632, 8748], [8631, 8633], [8594, 8632, 8634], [8633, 8635], [8634, 8636, 8749], [8635, 8637], [8595, 8636, 8638], [8637, 8639], [8638, 8640, 8750], [8639, 8641], [8596, 8640, 8642], [8641, 8643], [8642, 8644, 8751], [8643, 8645], [8597, 8644, 8646], [8645, 8647], [8646, 8648, 8752], [8647, 8649], [8598, 8648, 8650], [8649, 8651], [8650, 8652, 8753], [8651, 8653], [8599, 8652, 8654], [8653, 8655], [8654, 8656, 8754], [8655, 8657], [8600, 8656, 8658], [8657, 8659], [8658, 8660, 8755], [8659, 8661], [8601, 8660, 8662], [8661, 8663], [8662, 8664, 8756], [8663, 8665], [8602, 8664, 8666], [8665, 8667], [8666, 8668, 8757], [8667, 8669], [8603, 8668, 8670], [8669, 8671], [8670, 8672, 8758], [8671, 8673], [8604, 8672, 8674], [8673, 8675], [8674, 8676, 8759], [8675, 8677], [8605, 8676, 8678], [8677, 8679], [8678, 8680, 8760], [8679, 8681], [8606, 8680, 8682], [8681, 8683], [8682, 8684, 8761], [8683, 8685], [8607, 8684, 8686], [8685, 8687], [8686, 8688, 8762], [8687, 8689], [8608, 8688, 8690], [8689, 8691], [8690, 8692, 8763], [8691, 8693], [8609, 8692, 8694], [8693, 8695], [8694, 8696, 8764], [8695, 8697], [8610, 8696, 8698], [8697, 8699], [8698, 8700, 8765], [8699, 8701], [8611, 8700, 8702], [8701, 8703], [8702, 8704, 8766], [8703, 8705], [8612, 8704, 8706], [8705, 8707], [8706, 8708, 8767], [8707, 8709], [8613, 8708, 8710], [8709, 8711], [8710, 8712, 8768], [8711, 8713], [8614, 8712, 8714], [8713, 8715], [8714, 8716, 8769], [8715, 8717], [8615, 8716, 8718], [8717, 8719], [8718, 8720, 8770], [8719, 8721], [8616, 8720, 8722], [8721, 8723], [8722, 8724, 8771], [8723, 8725], [8617, 8724, 8726], [8725, 8727], [8726, 8728, 8772], [8727, 8729], [8618, 8728, 8730], [8729, 8731], [8730, 8732, 8773], [8731, 8733], [8619, 8732, 8734], [8733, 8735], [8734, 8736, 8774], [8735, 8737], [8620, 8736, 8738], [8737, 8739], [8738, 8740, 8775], [8739, 8741], [8621, 8740, 8742], [8741, 8743], [8742, 8744, 8776], [8743, 8745], [8622, 8744], [8623, 8777], [8627, 8781], [8631, 8785], [8635, 8789], [8639, 8793], [8643, 8797], [8647, 8801], [8651, 8805], [8655, 8809], [8659, 8813], [8663, 8817], [8667, 8821], [8671, 8825], [8675, 8829], [8679, 8833], [8683, 8837], [8687, 8841], [8691, 8845], [8695, 8849], [8699, 8853], [8703, 8857], [8707, 8861], [8711, 8865], [8715, 8869], [8719, 8873], [8723, 8877], [8727, 8881], [8731, 8885], [8735, 8889], [8739, 8893], [8743, 8897], [8746, 8778], [8777, 8779], [8778, 8780, 8900], [8779, 8781], [8747, 8780, 8782], [8781, 8783], [8782, 8784, 8901], [8783, 8785], [8748, 8784, 8786], [8785, 8787], [8786, 8788, 8902], [8787, 8789], [8749, 8788, 8790], [8789, 8791], [8790, 8792, 8903], [8791, 8793], [8750, 8792, 8794], [8793, 8795], [8794, 8796, 8904], [8795, 8797], [8751, 8796, 8798], [8797, 8799], [8798, 8800, 8905], [8799, 8801], [8752, 8800, 8802], [8801, 8803], [8802, 8804, 8906], [8803, 8805], [8753, 8804, 8806], [8805, 8807], [8806, 8808, 8907], [8807, 8809], [8754, 8808, 8810], [8809, 8811], [8810, 8812, 8908], [8811, 8813], [8755, 8812, 8814], [8813, 8815], [8814, 8816, 8909], [8815, 8817], [8756, 8816, 8818], [8817, 8819], [8818, 8820, 8910], [8819, 8821], [8757, 8820, 8822], [8821, 8823], [8822, 8824, 8911], [8823, 8825], [8758, 8824, 8826], [8825, 8827], [8826, 8828, 8912], [8827, 8829], [8759, 8828, 8830], [8829, 8831], [8830, 8832, 8913], [8831, 8833], [8760, 8832, 8834], [8833, 8835], [8834, 8836, 8914], [8835, 8837], [8761, 8836, 8838], [8837, 8839], [8838, 8840, 8915], [8839, 8841], [8762, 8840, 8842], [8841, 8843], [8842, 8844, 8916], [8843, 8845], [8763, 8844, 8846], [8845, 8847], [8846, 8848, 8917], [8847, 8849], [8764, 8848, 8850], [8849, 8851], [8850, 8852, 8918], [8851, 8853], [8765, 8852, 8854], [8853, 8855], [8854, 8856, 8919], [8855, 8857], [8766, 8856, 8858], [8857, 8859], [8858, 8860, 8920], [8859, 8861], [8767, 8860, 8862], [8861, 8863], [8862, 8864, 8921], [8863, 8865], [8768, 8864, 8866], [8865, 8867], [8866, 8868, 8922], [8867, 8869], [8769, 8868, 8870], [8869, 8871], [8870, 8872, 8923], [8871, 8873], [8770, 8872, 8874], [8873, 8875], [8874, 8876, 8924], [8875, 8877], [8771, 8876, 8878], [8877, 8879], [8878, 8880, 8925], [8879, 8881], [8772, 8880, 8882], [8881, 8883], [8882, 8884, 8926], [8883, 8885], [8773, 8884, 8886], [8885, 8887], [8886, 8888, 8927], [8887, 8889], [8774, 8888, 8890], [8889, 8891], [8890, 8892, 8928], [8891, 8893], [8775, 8892, 8894], [8893, 8895], [8894, 8896, 8929], [8895, 8897], [8776, 8896, 8898], [8897, 8899], [8898, 8930], [8779, 8933], [8783, 8937], [8787, 8941], [8791, 8945], [8795, 8949], [8799, 8953], [8803, 8957], [8807, 8961], [8811, 8965], [8815, 8969], [8819, 8973], [8823, 8977], [8827, 8981], [8831, 8985], [8835, 8989], [8839, 8993], [8843, 8997], [8847, 9001], [8851, 9005], [8855, 9009], [8859, 9013], [8863, 9017], [8867, 9021], [8871, 9025], [8875, 9029], [8879, 9033], [8883, 9037], [8887, 9041], [8891, 9045], [8895, 9049], [8899, 9053], [8932, 9054], [8931, 8933], [8900, 8932, 8934], [8933, 8935], [8934, 8936, 9055], [8935, 8937], [8901, 8936, 8938], [8937, 8939], [8938, 8940, 9056], [8939, 8941], [8902, 8940, 8942], [8941, 8943], [8942, 8944, 9057], [8943, 8945], [8903, 8944, 8946], [8945, 8947], [8946, 8948, 9058], [8947, 8949], [8904, 8948, 8950], [8949, 8951], [8950, 8952, 9059], [8951, 8953], [8905, 8952, 8954], [8953, 8955], [8954, 8956, 9060], [8955, 8957], [8906, 8956, 8958], [8957, 8959], [8958, 8960, 9061], [8959, 8961], [8907, 8960, 8962], [8961, 8963], [8962, 8964, 9062], [8963, 8965], [8908, 8964, 8966], [8965, 8967], [8966, 8968, 9063], [8967, 8969], [8909, 8968, 8970], [8969, 8971], [8970, 8972, 9064], [8971, 8973], [8910, 8972, 8974], [8973, 8975], [8974, 8976, 9065], [8975, 8977], [8911, 8976, 8978], [8977, 8979], [8978, 8980, 9066], [8979, 8981], [8912, 8980, 8982], [8981, 8983], [8982, 8984, 9067], [8983, 8985], [8913, 8984, 8986], [8985, 8987], [8986, 8988, 9068], [8987, 8989], [8914, 8988, 8990], [8989, 8991], [8990, 8992, 9069], [8991, 8993], [8915, 8992, 8994], [8993, 8995], [8994, 8996, 9070], [8995, 8997], [8916, 8996, 8998], [8997, 8999], [8998, 9000, 9071], [8999, 9001], [8917, 9000, 9002], [9001, 9003], [9002, 9004, 9072], [9003, 9005], [8918, 9004, 9006], [9005, 9007], [9006, 9008, 9073], [9007, 9009], [8919, 9008, 9010], [9009, 9011], [9010, 9012, 9074], [9011, 9013], [8920, 9012, 9014], [9013, 9015], [9014, 9016, 9075], [9015, 9017], [8921, 9016, 9018], [9017, 9019], [9018, 9020, 9076], [9019, 9021], [8922, 9020, 9022], [9021, 9023], [9022, 9024, 9077], [9023, 9025], [8923, 9024, 9026], [9025, 9027], [9026, 9028, 9078], [9027, 9029], [8924, 9028, 9030], [9029, 9031], [9030, 9032, 9079], [9031, 9033], [8925, 9032, 9034], [9033, 9035], [9034, 9036, 9080], [9035, 9037], [8926, 9036, 9038], [9037, 9039], [9038, 9040, 9081], [9039, 9041], [8927, 9040, 9042], [9041, 9043], [9042, 9044, 9082], [9043, 9045], [8928, 9044, 9046], [9045, 9047], [9046, 9048, 9083], [9047, 9049], [8929, 9048, 9050], [9049, 9051], [9050, 9052, 9084], [9051, 9053], [8930, 9052], [8931, 9085], [8935, 9089], [8939, 9093], [8943, 9097], [8947, 9101], [8951, 9105], [8955, 9109], [8959, 9113], [8963, 9117], [8967, 9121], [8971, 9125], [8975, 9129], [8979, 9133], [8983, 9137], [8987, 9141], [8991, 9145], [8995, 9149], [8999, 9153], [9003, 9157], [9007, 9161], [9011, 9165], [9015, 9169], [9019, 9173], [9023, 9177], [9027, 9181], [9031, 9185], [9035, 9189], [9039, 9193], [9043, 9197], [9047, 9201], [9051, 9205], [9054, 9086], [9085, 9087], [9086, 9088, 9208], [9087, 9089], [9055, 9088, 9090], [9089, 9091], [9090, 9092, 9209], [9091, 9093], [9056, 9092, 9094], [9093, 9095], [9094, 9096, 9210], [9095, 9097], [9057, 9096, 9098], [9097, 9099], [9098, 9100, 9211], [9099, 9101], [9058, 9100, 9102], [9101, 9103], [9102, 9104, 9212], [9103, 9105], [9059, 9104, 9106], [9105, 9107], [9106, 9108, 9213], [9107, 9109], [9060, 9108, 9110], [9109, 9111], [9110, 9112, 9214], [9111, 9113], [9061, 9112, 9114], [9113, 9115], [9114, 9116, 9215], [9115, 9117], [9062, 9116, 9118], [9117, 9119], [9118, 9120, 9216], [9119, 9121], [9063, 9120, 9122], [9121, 9123], [9122, 9124, 9217], [9123, 9125], [9064, 9124, 9126], [9125, 9127], [9126, 9128, 9218], [9127, 9129], [9065, 9128, 9130], [9129, 9131], [9130, 9132, 9219], [9131, 9133], [9066, 9132, 9134], [9133, 9135], [9134, 9136, 9220], [9135, 9137], [9067, 9136, 9138], [9137, 9139], [9138, 9140, 9221], [9139, 9141], [9068, 9140, 9142], [9141, 9143], [9142, 9144, 9222], [9143, 9145], [9069, 9144, 9146], [9145, 9147], [9146, 9148, 9223], [9147, 9149], [9070, 9148, 9150], [9149, 9151], [9150, 9152, 9224], [9151, 9153], [9071, 9152, 9154], [9153, 9155], [9154, 9156, 9225], [9155, 9157], [9072, 9156, 9158], [9157, 9159], [9158, 9160, 9226], [9159, 9161], [9073, 9160, 9162], [9161, 9163], [9162, 9164, 9227], [9163, 9165], [9074, 9164, 9166], [9165, 9167], [9166, 9168, 9228], [9167, 9169], [9075, 9168, 9170], [9169, 9171], [9170, 9172, 9229], [9171, 9173], [9076, 9172, 9174], [9173, 9175], [9174, 9176, 9230], [9175, 9177], [9077, 9176, 9178], [9177, 9179], [9178, 9180, 9231], [9179, 9181], [9078, 9180, 9182], [9181, 9183], [9182, 9184, 9232], [9183, 9185], [9079, 9184, 9186], [9185, 9187], [9186, 9188, 9233], [9187, 9189], [9080, 9188, 9190], [9189, 9191], [9190, 9192, 9234], [9191, 9193], [9081, 9192, 9194], [9193, 9195], [9194, 9196, 9235], [9195, 9197], [9082, 9196, 9198], [9197, 9199], [9198, 9200, 9236], [9199, 9201], [9083, 9200, 9202], [9201, 9203], [9202, 9204, 9237], [9203, 9205], [9084, 9204, 9206], [9205, 9207], [9206, 9238], [9087, 9240], [9091, 9244], [9095, 9248], [9099, 9252], [9103, 9256], [9107, 9260], [9111, 9264], [9115, 9268], [9119, 9272], [9123, 9276], [9127, 9280], [9131, 9284], [9135, 9288], [9139, 9292], [9143, 9296], [9147, 9300], [9151, 9304], [9155, 9308], [9159, 9312], [9163, 9316], [9167, 9320], [9171, 9324], [9175, 9328], [9179, 9332], [9183, 9336], [9187, 9340], [9191, 9344], [9195, 9348], [9199, 9352], [9203, 9356], [9207, 9360], [9240], [9208, 9239, 9241], [9240, 9242], [9241, 9243], [9242, 9244], [9209, 9243, 9245], [9244, 9246], [9245, 9247], [9246, 9248], [9210, 9247, 9249], [9248, 9250], [9249, 9251], [9250, 9252], [9211, 9251, 9253], [9252, 9254], [9253, 9255], [9254, 9256], [9212, 9255, 9257], [9256, 9258], [9257, 9259], [9258, 9260], [9213, 9259, 9261], [9260, 9262], [9261, 9263], [9262, 9264], [9214, 9263, 9265], [9264, 9266], [9265, 9267], [9266, 9268], [9215, 9267, 9269], [9268, 9270], [9269, 9271], [9270, 9272], [9216, 9271, 9273], [9272, 9274], [9273, 9275], [9274, 9276], [9217, 9275, 9277], [9276, 9278], [9277, 9279], [9278, 9280], [9218, 9279, 9281], [9280, 9282], [9281, 9283], [9282, 9284], [9219, 9283, 9285], [9284, 9286], [9285, 9287], [9286, 9288], [9220, 9287, 9289], [9288, 9290], [9289, 9291], [9290, 9292], [9221, 9291, 9293], [9292, 9294], [9293, 9295], [9294, 9296], [9222, 9295, 9297], [9296, 9298], [9297, 9299], [9298, 9300], [9223, 9299, 9301], [9300, 9302], [9301, 9303], [9302, 9304], [9224, 9303, 9305], [9304, 9306], [9305, 9307], [9306, 9308], [9225, 9307, 9309], [9308, 9310], [9309, 9311], [9310, 9312], [9226, 9311, 9313], [9312, 9314], [9313, 9315], [9314, 9316], [9227, 9315, 9317], [9316, 9318], [9317, 9319], [9318, 9320], [9228, 9319, 9321], [9320, 9322], [9321, 9323], [9322, 9324], [9229, 9323, 9325], [9324, 9326], [9325, 9327], [9326, 9328], [9230, 9327, 9329], [9328, 9330], [9329, 9331], [9330, 9332], [9231, 9331, 9333], [9332, 9334], [9333, 9335], [9334, 9336], [9232, 9335, 9337], [9336, 9338], [9337, 9339], [9338, 9340], [9233, 9339, 9341], [9340, 9342], [9341, 9343], [9342, 9344], [9234, 9343, 9345], [9344, 9346], [9345, 9347], [9346, 9348], [9235, 9347, 9349], [9348, 9350], [9349, 9351], [9350, 9352], [9236, 9351, 9353], [9352, 9354], [9353, 9355], [9354, 9356], [9237, 9355, 9357], [9356, 9358], [9357, 9359], [9358, 9360], [9238, 9359]] SGERROR: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1, 122], [0, 2], [1, 3], [2, 4], [3, 5, 123], [4, 6], [5, 7], [6, 8], [7, 9, 124], [8, 10], [9, 11], [10, 12], [11, 13, 125], [12, 14], [13, 15], [14, 16], [15, 17, 126], [16, 18], [17, 19], [18, 20], [19, 21, 127], [20, 22], [21, 23], [22, 24], [23, 25, 128], [24, 26], [25, 27], [26, 28], [27, 29, 129], [28, 30], [29, 31], [30, 32], [31, 33, 130], [32, 34], [33, 35], [34, 36], [35, 37, 131], [36, 38], [37, 39], [38, 40], [39, 41, 132], [40, 42], [41, 43], [42, 44], [43, 45, 133], [44, 46], [45, 47], [46, 48], [47, 49, 134], [48, 50], [49, 51], [50, 52], [51, 53, 135], [52, 54], [53, 55], [54, 56], [55, 57, 136], [56, 58], [57, 59], [58, 60], [59, 61, 137], [60, 62], [61, 63], [62, 64], [63, 65, 138], [64, 66], [65, 67], [66, 68], [67, 69, 139], [68, 70], [69, 71], [70, 72], [71, 73, 140], [72, 74], [73, 75], [74, 76], [75, 77, 141], [76, 78], [77, 79], [78, 80], [79, 81, 142], [80, 82], [81, 83], [82, 84], [83, 85, 143], [84, 86], [85, 87], [86, 88], [87, 89, 144], [88, 90], [89, 91], [90, 92], [91, 93, 145], [92, 94], [93, 95], [94, 96], [95, 97, 146], [96, 98], [97, 99], [98, 100], [99, 101, 147], [100, 102], [101, 103], [102, 104], [103, 105, 148], [104, 106], [105, 107], [106, 108], [107, 109, 149], [108, 110], [109, 111], [110, 112], [111, 113, 150], [112, 114], [113, 115], [114, 116], [115, 117, 151], [116, 118], [117, 119], [118, 120], [119, 121, 152], [120], [0, 153], [4, 157], [8, 161], [12, 165], [16, 169], [20, 173], [24, 177], [28, 181], [32, 185], [36, 189], [40, 193], [44, 197], [48, 201], [52, 205], [56, 209], [60, 213], [64, 217], [68, 221], [72, 225], [76, 229], [80, 233], [84, 237], [88, 241], [92, 245], [96, 249], [100, 253], [104, 257], [108, 261], [112, 265], [116, 269], [120, 273], [122, 154], [153, 155], [154, 156, 276], [155, 157], [123, 156, 158], [157, 159], [158, 160, 277], [159, 161], [124, 160, 162], [161, 163], [162, 164, 278], [163, 165], [125, 164, 166], [165, 167], [166, 168, 279], [167, 169], [126, 168, 170], [169, 171], [170, 172, 280], [171, 173], [127, 172, 174], [173, 175], [174, 176, 281], [175, 177], [128, 176, 178], [177, 179], [178, 180, 282], [179, 181], [129, 180, 182], [181, 183], [182, 184, 283], [183, 185], [130, 184, 186], [185, 187], [186, 188, 284], [187, 189], [131, 188, 190], [189, 191], [190, 192, 285], [191, 193], [132, 192, 194], [193, 195], [194, 196, 286], [195, 197], [133, 196, 198], [197, 199], [198, 200, 287], [199, 201], [134, 200, 202], [201, 203], [202, 204, 288], [203, 205], [135, 204, 206], [205, 207], [206, 208, 289], [207, 209], [136, 208, 210], [209, 211], [210, 212, 290], [211, 213], [137, 212, 214], [213, 215], [214, 216, 291], [215, 217], [138, 216, 218], [217, 219], [218, 220, 292], [219, 221], [139, 220, 222], [221, 223], [222, 224, 293], [223, 225], [140, 224, 226], [225, 227], [226, 228, 294], [227, 229], [141, 228, 230], [229, 231], [230, 232, 295], [231, 233], [142, 232, 234], [233, 235], [234, 236, 296], [235, 237], [143, 236, 238], [237, 239], [238, 240, 297], [239, 241], [144, 240, 242], [241, 243], [242, 244, 298], [243, 245], [145, 244, 246], [245, 247], [246, 248, 299], [247, 249], [146, 248, 250], [249, 251], [250, 252, 300], [251, 253], [147, 252, 254], [253, 255], [254, 256, 301], [255, 257], [148, 256, 258], [257, 259], [258, 260, 302], [259, 261], [149, 260, 262], [261, 263], [262, 264, 303], [263, 265], [150, 264, 266], [265, 267], [266, 268, 304], [267, 269], [151, 268, 270], [269, 271], [270, 272, 305], [271, 273], [152, 272, 274], [273, 275], [274, 306], [155, 309], [159, 313], [163, 317], [167, 321], [171, 325], [175, 329], [179, 333], [183, 337], [187, 341], [191, 345], [195, 349], [199, 353], [203, 357], [207, 361], [211, 365], [215, 369], [219, 373], [223, 377], [227, 381], [231, 385], [235, 389], [239, 393], [243, 397], [247, 401], [251, 405], [255, 409], [259, 413], [263, 417], [267, 421], [271, 425], [275, 429], [308, 430], [307, 309], [276, 308, 310], [309, 311], [310, 312, 431], [311, 313], [277, 312, 314], [313, 315], [314, 316, 432], [315, 317], [278, 316, 318], [317, 319], [318, 320, 433], [319, 321], [279, 320, 322], [321, 323], [322, 324, 434], [323, 325], [280, 324, 326], [325, 327], [326, 328, 435], [327, 329], [281, 328, 330], [329, 331], [330, 332, 436], [331, 333], [282, 332, 334], [333, 335], [334, 336, 437], [335, 337], [283, 336, 338], [337, 339], [338, 340, 438], [339, 341], [284, 340, 342], [341, 343], [342, 344, 439], [343, 345], [285, 344, 346], [345, 347], [346, 348, 440], [347, 349], [286, 348, 350], [349, 351], [350, 352, 441], [351, 353], [287, 352, 354], [353, 355], [354, 356, 442], [355, 357], [288, 356, 358], [357, 359], [358, 360, 443], [359, 361], [289, 360, 362], [361, 363], [362, 364, 444], [363, 365], [290, 364, 366], [365, 367], [366, 368, 445], [367, 369], [291, 368, 370], [369, 371], [370, 372, 446], [371, 373], [292, 372, 374], [373, 375], [374, 376, 447], [375, 377], [293, 376, 378], [377, 379], [378, 380, 448], [379, 381], [294, 380, 382], [381, 383], [382, 384, 449], [383, 385], [295, 384, 386], [385, 387], [386, 388, 450], [387, 389], [296, 388, 390], [389, 391], [390, 392, 451], [391, 393], [297, 392, 394], [393, 395], [394, 396, 452], [395, 397], [298, 396, 398], [397, 399], [398, 400, 453], [399, 401], [299, 400, 402], [401, 403], [402, 404, 454], [403, 405], [300, 404, 406], [405, 407], [406, 408, 455], [407, 409], [301, 408, 410], [409, 411], [410, 412, 456], [411, 413], [302, 412, 414], [413, 415], [414, 416, 457], [415, 417], [303, 416, 418], [417, 419], [418, 420, 458], [419, 421], [304, 420, 422], [421, 423], [422, 424, 459], [423, 425], [305, 424, 426], [425, 427], [426, 428, 460], [427, 429], [306, 428], [307, 461], [311, 465], [315, 469], [319, 473], [323, 477], [327, 481], [331, 485], [335, 489], [339, 493], [343, 497], [347, 501], [351, 505], [355, 509], [359, 513], [363, 517], [367, 521], [371, 525], [375, 529], [379, 533], [383, 537], [387, 541], [391, 545], [395, 549], [399, 553], [403, 557], [407, 561], [411, 565], [415, 569], [419, 573], [423, 577], [427, 581], [430, 462], [461, 463], [462, 464, 584], [463, 465], [431, 464, 466], [465, 467], [466, 468, 585], [467, 469], [432, 468, 470], [469, 471], [470, 472, 586], [471, 473], [433, 472, 474], [473, 475], [474, 476, 587], [475, 477], [434, 476, 478], [477, 479], [478, 480, 588], [479, 481], [435, 480, 482], [481, 483], [482, 484, 589], [483, 485], [436, 484, 486], [485, 487], [486, 488, 590], [487, 489], [437, 488, 490], [489, 491], [490, 492, 591], [491, 493], [438, 492, 494], [493, 495], [494, 496, 592], [495, 497], [439, 496, 498], [497, 499], [498, 500, 593], [499, 501], [440, 500, 502], [501, 503], [502, 504, 594], [503, 505], [441, 504, 506], [505, 507], [506, 508, 595], [507, 509], [442, 508, 510], [509, 511], [510, 512, 596], [511, 513], [443, 512, 514], [513, 515], [514, 516, 597], [515, 517], [444, 516, 518], [517, 519], [518, 520, 598], [519, 521], [445, 520, 522], [521, 523], [522, 524, 599], [523, 525], [446, 524, 526], [525, 527], [526, 528, 600], [527, 529], [447, 528, 530], [529, 531], [530, 532, 601], [531, 533], [448, 532, 534], [533, 535], [534, 536, 602], [535, 537], [449, 536, 538], [537, 539], [538, 540, 603], [539, 541], [450, 540, 542], [541, 543], [542, 544, 604], [543, 545], [451, 544, 546], [545, 547], [546, 548, 605], [547, 549], [452, 548, 550], [549, 551], [550, 552, 606], [551, 553], [453, 552, 554], [553, 555], [554, 556, 607], [555, 557], [454, 556, 558], [557, 559], [558, 560, 608], [559, 561], [455, 560, 562], [561, 563], [562, 564, 609], [563, 565], [456, 564, 566], [565, 567], [566, 568, 610], [567, 569], [457, 568, 570], [569, 571], [570, 572, 611], [571, 573], [458, 572, 574], [573, 575], [574, 576, 612], [575, 577], [459, 576, 578], [577, 579], [578, 580, 613], [579, 581], [460, 580, 582], [581, 583], [582, 614], [463, 617], [467, 621], [471, 625], [475, 629], [479, 633], [483, 637], [487, 641], [491, 645], [495, 649], [499, 653], [503, 657], [507, 661], [511, 665], [515, 669], [519, 673], [523, 677], [527, 681], [531, 685], [535, 689], [539, 693], [543, 697], [547, 701], [551, 705], [555, 709], [559, 713], [563, 717], [567, 721], [571, 725], [575, 729], [579, 733], [583, 737], [616, 738], [615, 617], [584, 616, 618], [617, 619], [618, 620, 739], [619, 621], [585, 620, 622], [621, 623], [622, 624, 740], [623, 625], [586, 624, 626], [625, 627], [626, 628, 741], [627, 629], [587, 628, 630], [629, 631], [630, 632, 742], [631, 633], [588, 632, 634], [633, 635], [634, 636, 743], [635, 637], [589, 636, 638], [637, 639], [638, 640, 744], [639, 641], [590, 640, 642], [641, 643], [642, 644, 745], [643, 645], [591, 644, 646], [645, 647], [646, 648, 746], [647, 649], [592, 648, 650], [649, 651], [650, 652, 747], [651, 653], [593, 652, 654], [653, 655], [654, 656, 748], [655, 657], [594, 656, 658], [657, 659], [658, 660, 749], [659, 661], [595, 660, 662], [661, 663], [662, 664, 750], [663, 665], [596, 664, 666], [665, 667], [666, 668, 751], [667, 669], [597, 668, 670], [669, 671], [670, 672, 752], [671, 673], [598, 672, 674], [673, 675], [674, 676, 753], [675, 677], [599, 676, 678], [677, 679], [678, 680, 754], [679, 681], [600, 680, 682], [681, 683], [682, 684, 755], [683, 685], [601, 684, 686], [685, 687], [686, 688, 756], [687, 689], [602, 688, 690], [689, 691], [690, 692, 757], [691, 693], [603, 692, 694], [693, 695], [694, 696, 758], [695, 697], [604, 696, 698], [697, 699], [698, 700, 759], [699, 701], [605, 700, 702], [701, 703], [702, 704, 760], [703, 705], [606, 704, 706], [705, 707], [706, 708, 761], [707, 709], [607, 708, 710], [709, 711], [710, 712, 762], [711, 713], [608, 712, 714], [713, 715], [714, 716, 763], [715, 717], [609, 716, 718], [717, 719], [718, 720, 764], [719, 721], [610, 720, 722], [721, 723], [722, 724, 765], [723, 725], [611, 724, 726], [725, 727], [726, 728, 766], [727, 729], [612, 728, 730], [729, 731], [730, 732, 767], [731, 733], [613, 732, 734], [733, 735], [734, 736, 768], [735, 737], [614, 736], [615, 769], [619, 773], [623, 777], [627, 781], [631, 785], [635, 789], [639, 793], [643, 797], [647, 801], [651, 805], [655, 809], [659, 813], [663, 817], [667, 821], [671, 825], [675, 829], [679, 833], [683, 837], [687, 841], [691, 845], [695, 849], [699, 853], [703, 857], [707, 861], [711, 865], [715, 869], [719, 873], [723, 877], [727, 881], [731, 885], [735, 889], [738, 770], [769, 771], [770, 772, 892], [771, 773], [739, 772, 774], [773, 775], [774, 776, 893], [775, 777], [740, 776, 778], [777, 779], [778, 780, 894], [779, 781], [741, 780, 782], [781, 783], [782, 784, 895], [783, 785], [742, 784, 786], [785, 787], [786, 788, 896], [787, 789], [743, 788, 790], [789, 791], [790, 792, 897], [791, 793], [744, 792, 794], [793, 795], [794, 796, 898], [795, 797], [745, 796, 798], [797, 799], [798, 800, 899], [799, 801], [746, 800, 802], [801, 803], [802, 804, 900], [803, 805], [747, 804, 806], [805, 807], [806, 808, 901], [807, 809], [748, 808, 810], [809, 811], [810, 812, 902], [811, 813], [749, 812, 814], [813, 815], [814, 816, 903], [815, 817], [750, 816, 818], [817, 819], [818, 820, 904], [819, 821], [751, 820, 822], [821, 823], [822, 824, 905], [823, 825], [752, 824, 826], [825, 827], [826, 828, 906], [827, 829], [753, 828, 830], [829, 831], [830, 832, 907], [831, 833], [754, 832, 834], [833, 835], [834, 836, 908], [835, 837], [755, 836, 838], [837, 839], [838, 840, 909], [839, 841], [756, 840, 842], [841, 843], [842, 844, 910], [843, 845], [757, 844, 846], [845, 847], [846, 848, 911], [847, 849], [758, 848, 850], [849, 851], [850, 852, 912], [851, 853], [759, 852, 854], [853, 855], [854, 856, 913], [855, 857], [760, 856, 858], [857, 859], [858, 860, 914], [859, 861], [761, 860, 862], [861, 863], [862, 864, 915], [863, 865], [762, 864, 866], [865, 867], [866, 868, 916], [867, 869], [763, 868, 870], [869, 871], [870, 872, 917], [871, 873], [764, 872, 874], [873, 875], [874, 876, 918], [875, 877], [765, 876, 878], [877, 879], [878, 880, 919], [879, 881], [766, 880, 882], [881, 883], [882, 884, 920], [883, 885], [767, 884, 886], [885, 887], [886, 888, 921], [887, 889], [768, 888, 890], [889, 891], [890, 922], [771, 925], [775, 929], [779, 933], [783, 937], [787, 941], [791, 945], [795, 949], [799, 953], [803, 957], [807, 961], [811, 965], [815, 969], [819, 973], [823, 977], [827, 981], [831, 985], [835, 989], [839, 993], [843, 997], [847, 1001], [851, 1005], [855, 1009], [859, 1013], [863, 1017], [867, 1021], [871, 1025], [875, 1029], [879, 1033], [883, 1037], [887, 1041], [891, 1045], [924, 1046], [923, 925], [892, 924, 926], [925, 927], [926, 928, 1047], [927, 929], [893, 928, 930], [929, 931], [930, 932, 1048], [931, 933], [894, 932, 934], [933, 935], [934, 936, 1049], [935, 937], [895, 936, 938], [937, 939], [938, 940, 1050], [939, 941], [896, 940, 942], [941, 943], [942, 944, 1051], [943, 945], [897, 944, 946], [945, 947], [946, 948, 1052], [947, 949], [898, 948, 950], [949, 951], [950, 952, 1053], [951, 953], [899, 952, 954], [953, 955], [954, 956, 1054], [955, 957], [900, 956, 958], [957, 959], [958, 960, 1055], [959, 961], [901, 960, 962], [961, 963], [962, 964, 1056], [963, 965], [902, 964, 966], [965, 967], [966, 968, 1057], [967, 969], [903, 968, 970], [969, 971], [970, 972, 1058], [971, 973], [904, 972, 974], [973, 975], [974, 976, 1059], [975, 977], [905, 976, 978], [977, 979], [978, 980, 1060], [979, 981], [906, 980, 982], [981, 983], [982, 984, 1061], [983, 985], [907, 984, 986], [985, 987], [986, 988, 1062], [987, 989], [908, 988, 990], [989, 991], [990, 992, 1063], [991, 993], [909, 992, 994], [993, 995], [994, 996, 1064], [995, 997], [910, 996, 998], [997, 999], [998, 1000, 1065], [999, 1001], [911, 1000, 1002], [1001, 1003], [1002, 1004, 1066], [1003, 1005], [912, 1004, 1006], [1005, 1007], [1006, 1008, 1067], [1007, 1009], [913, 1008, 1010], [1009, 1011], [1010, 1012, 1068], [1011, 1013], [914, 1012, 1014], [1013, 1015], [1014, 1016, 1069], [1015, 1017], [915, 1016, 1018], [1017, 1019], [1018, 1020, 1070], [1019, 1021], [916, 1020, 1022], [1021, 1023], [1022, 1024, 1071], [1023, 1025], [917, 1024, 1026], [1025, 1027], [1026, 1028, 1072], [1027, 1029], [918, 1028, 1030], [1029, 1031], [1030, 1032, 1073], [1031, 1033], [919, 1032, 1034], [1033, 1035], [1034, 1036, 1074], [1035, 1037], [920, 1036, 1038], [1037, 1039], [1038, 1040, 1075], [1039, 1041], [921, 1040, 1042], [1041, 1043], [1042, 1044, 1076], [1043, 1045], [922, 1044], [923, 1077], [927, 1081], [931, 1085], [935, 1089], [939, 1093], [943, 1097], [947, 1101], [951, 1105], [955, 1109], [959, 1113], [963, 1117], [967, 1121], [971, 1125], [975, 1129], [979, 1133], [983, 1137], [987, 1141], [991, 1145], [995, 1149], [999, 1153], [1003, 1157], [1007, 1161], [1011, 1165], [1015, 1169], [1019, 1173], [1023, 1177], [1027, 1181], [1031, 1185], [1035, 1189], [1039, 1193], [1043, 1197], [1046, 1078], [1077, 1079], [1078, 1080, 1200], [1079, 1081], [1047, 1080, 1082], [1081, 1083], [1082, 1084, 1201], [1083, 1085], [1048, 1084, 1086], [1085, 1087], [1086, 1088, 1202], [1087, 1089], [1049, 1088, 1090], [1089, 1091], [1090, 1092, 1203], [1091, 1093], [1050, 1092, 1094], [1093, 1095], [1094, 1096, 1204], [1095, 1097], [1051, 1096, 1098], [1097, 1099], [1098, 1100, 1205], [1099, 1101], [1052, 1100, 1102], [1101, 1103], [1102, 1104, 1206], [1103, 1105], [1053, 1104, 1106], [1105, 1107], [1106, 1108, 1207], [1107, 1109], [1054, 1108, 1110], [1109, 1111], [1110, 1112, 1208], [1111, 1113], [1055, 1112, 1114], [1113, 1115], [1114, 1116, 1209], [1115, 1117], [1056, 1116, 1118], [1117, 1119], [1118, 1120, 1210], [1119, 1121], [1057, 1120, 1122], [1121, 1123], [1122, 1124, 1211], [1123, 1125], [1058, 1124, 1126], [1125, 1127], [1126, 1128, 1212], [1127, 1129], [1059, 1128, 1130], [1129, 1131], [1130, 1132, 1213], [1131, 1133], [1060, 1132, 1134], [1133, 1135], [1134, 1136, 1214], [1135, 1137], [1061, 1136, 1138], [1137, 1139], [1138, 1140, 1215], [1139, 1141], [1062, 1140, 1142], [1141, 1143], [1142, 1144, 1216], [1143, 1145], [1063, 1144, 1146], [1145, 1147], [1146, 1148, 1217], [1147, 1149], [1064, 1148, 1150], [1149, 1151], [1150, 1152, 1218], [1151, 1153], [1065, 1152, 1154], [1153, 1155], [1154, 1156, 1219], [1155, 1157], [1066, 1156, 1158], [1157, 1159], [1158, 1160, 1220], [1159, 1161], [1067, 1160, 1162], [1161, 1163], [1162, 1164, 1221], [1163, 1165], [1068, 1164, 1166], [1165, 1167], [1166, 1168, 1222], [1167, 1169], [1069, 1168, 1170], [1169, 1171], [1170, 1172, 1223], [1171, 1173], [1070, 1172, 1174], [1173, 1175], [1174, 1176, 1224], [1175, 1177], [1071, 1176, 1178], [1177, 1179], [1178, 1180, 1225], [1179, 1181], [1072, 1180, 1182], [1181, 1183], [1182, 1184, 1226], [1183, 1185], [1073, 1184, 1186], [1185, 1187], [1186, 1188, 1227], [1187, 1189], [1074, 1188, 1190], [1189, 1191], [1190, 1192, 1228], [1191, 1193], [1075, 1192, 1194], [1193, 1195], [1194, 1196, 1229], [1195, 1197], [1076, 1196, 1198], [1197, 1199], [1198, 1230], [1079, 1233], [1083, 1237], [1087, 1241], [1091, 1245], [1095, 1249], [1099, 1253], [1103, 1257], [1107, 1261], [1111, 1265], [1115, 1269], [1119, 1273], [1123, 1277], [1127, 1281], [1131, 1285], [1135, 1289], [1139, 1293], [1143, 1297], [1147, 1301], [1151, 1305], [1155, 1309], [1159, 1313], [1163, 1317], [1167, 1321], [1171, 1325], [1175, 1329], [1179, 1333], [1183, 1337], [1187, 1341], [1191, 1345], [1195, 1349], [1199, 1353], [1232, 1354], [1231, 1233], [1200, 1232, 1234], [1233, 1235], [1234, 1236, 1355], [1235, 1237], [1201, 1236, 1238], [1237, 1239], [1238, 1240, 1356], [1239, 1241], [1202, 1240, 1242], [1241, 1243], [1242, 1244, 1357], [1243, 1245], [1203, 1244, 1246], [1245, 1247], [1246, 1248, 1358], [1247, 1249], [1204, 1248, 1250], [1249, 1251], [1250, 1252, 1359], [1251, 1253], [1205, 1252, 1254], [1253, 1255], [1254, 1256, 1360], [1255, 1257], [1206, 1256, 1258], [1257, 1259], [1258, 1260, 1361], [1259, 1261], [1207, 1260, 1262], [1261, 1263], [1262, 1264, 1362], [1263, 1265], [1208, 1264, 1266], [1265, 1267], [1266, 1268, 1363], [1267, 1269], [1209, 1268, 1270], [1269, 1271], [1270, 1272, 1364], [1271, 1273], [1210, 1272, 1274], [1273, 1275], [1274, 1276, 1365], [1275, 1277], [1211, 1276, 1278], [1277, 1279], [1278, 1280, 1366], [1279, 1281], [1212, 1280, 1282], [1281, 1283], [1282, 1284, 1367], [1283, 1285], [1213, 1284, 1286], [1285, 1287], [1286, 1288, 1368], [1287, 1289], [1214, 1288, 1290], [1289, 1291], [1290, 1292, 1369], [1291, 1293], [1215, 1292, 1294], [1293, 1295], [1294, 1296, 1370], [1295, 1297], [1216, 1296, 1298], [1297, 1299], [1298, 1300, 1371], [1299, 1301], [1217, 1300, 1302], [1301, 1303], [1302, 1304, 1372], [1303, 1305], [1218, 1304, 1306], [1305, 1307], [1306, 1308, 1373], [1307, 1309], [1219, 1308, 1310], [1309, 1311], [1310, 1312, 1374], [1311, 1313], [1220, 1312, 1314], [1313, 1315], [1314, 1316, 1375], [1315, 1317], [1221, 1316, 1318], [1317, 1319], [1318, 1320, 1376], [1319, 1321], [1222, 1320, 1322], [1321, 1323], [1322, 1324, 1377], [1323, 1325], [1223, 1324, 1326], [1325, 1327], [1326, 1328, 1378], [1327, 1329], [1224, 1328, 1330], [1329, 1331], [1330, 1332, 1379], [1331, 1333], [1225, 1332, 1334], [1333, 1335], [1334, 1336, 1380], [1335, 1337], [1226, 1336, 1338], [1337, 1339], [1338, 1340, 1381], [1339, 1341], [1227, 1340, 1342], [1341, 1343], [1342, 1344, 1382], [1343, 1345], [1228, 1344, 1346], [1345, 1347], [1346, 1348, 1383], [1347, 1349], [1229, 1348, 1350], [1349, 1351], [1350, 1352, 1384], [1351, 1353], [1230, 1352], [1231, 1385], [1235, 1389], [1239, 1393], [1243, 1397], [1247, 1401], [1251, 1405], [1255, 1409], [1259, 1413], [1263, 1417], [1267, 1421], [1271, 1425], [1275, 1429], [1279, 1433], [1283, 1437], [1287, 1441], [1291, 1445], [1295, 1449], [1299, 1453], [1303, 1457], [1307, 1461], [1311, 1465], [1315, 1469], [1319, 1473], [1323, 1477], [1327, 1481], [1331, 1485], [1335, 1489], [1339, 1493], [1343, 1497], [1347, 1501], [1351, 1505], [1354, 1386], [1385, 1387], [1386, 1388, 1508], [1387, 1389], [1355, 1388, 1390], [1389, 1391], [1390, 1392, 1509], [1391, 1393], [1356, 1392, 1394], [1393, 1395], [1394, 1396, 1510], [1395, 1397], [1357, 1396, 1398], [1397, 1399], [1398, 1400, 1511], [1399, 1401], [1358, 1400, 1402], [1401, 1403], [1402, 1404, 1512], [1403, 1405], [1359, 1404, 1406], [1405, 1407], [1406, 1408, 1513], [1407, 1409], [1360, 1408, 1410], [1409, 1411], [1410, 1412, 1514], [1411, 1413], [1361, 1412, 1414], [1413, 1415], [1414, 1416, 1515], [1415, 1417], [1362, 1416, 1418], [1417, 1419], [1418, 1420, 1516], [1419, 1421], [1363, 1420, 1422], [1421, 1423], [1422, 1424, 1517], [1423, 1425], [1364, 1424, 1426], [1425, 1427], [1426, 1428, 1518], [1427, 1429], [1365, 1428, 1430], [1429, 1431], [1430, 1432, 1519], [1431, 1433], [1366, 1432, 1434], [1433, 1435], [1434, 1436, 1520], [1435, 1437], [1367, 1436, 1438], [1437, 1439], [1438, 1440, 1521], [1439, 1441], [1368, 1440, 1442], [1441, 1443], [1442, 1444, 1522], [1443, 1445], [1369, 1444, 1446], [1445, 1447], [1446, 1448, 1523], [1447, 1449], [1370, 1448, 1450], [1449, 1451], [1450, 1452, 1524], [1451, 1453], [1371, 1452, 1454], [1453, 1455], [1454, 1456, 1525], [1455, 1457], [1372, 1456, 1458], [1457, 1459], [1458, 1460, 1526], [1459, 1461], [1373, 1460, 1462], [1461, 1463], [1462, 1464, 1527], [1463, 1465], [1374, 1464, 1466], [1465, 1467], [1466, 1468, 1528], [1467, 1469], [1375, 1468, 1470], [1469, 1471], [1470, 1472, 1529], [1471, 1473], [1376, 1472, 1474], [1473, 1475], [1474, 1476, 1530], [1475, 1477], [1377, 1476, 1478], [1477, 1479], [1478, 1480, 1531], [1479, 1481], [1378, 1480, 1482], [1481, 1483], [1482, 1484, 1532], [1483, 1485], [1379, 1484, 1486], [1485, 1487], [1486, 1488, 1533], [1487, 1489], [1380, 1488, 1490], [1489, 1491], [1490, 1492, 1534], [1491, 1493], [1381, 1492, 1494], [1493, 1495], [1494, 1496, 1535], [1495, 1497], [1382, 1496, 1498], [1497, 1499], [1498, 1500, 1536], [1499, 1501], [1383, 1500, 1502], [1501, 1503], [1502, 1504, 1537], [1503, 1505], [1384, 1504, 1506], [1505, 1507], [1506, 1538], [1387, 1541], [1391, 1545], [1395, 1549], [1399, 1553], [1403, 1557], [1407, 1561], [1411, 1565], [1415, 1569], [1419, 1573], [1423, 1577], [1427, 1581], [1431, 1585], [1435, 1589], [1439, 1593], [1443, 1597], [1447, 1601], [1451, 1605], [1455, 1609], [1459, 1613], [1463, 1617], [1467, 1621], [1471, 1625], [1475, 1629], [1479, 1633], [1483, 1637], [1487, 1641], [1491, 1645], [1495, 1649], [1499, 1653], [1503, 1657], [1507, 1661], [1540, 1662], [1539, 1541], [1508, 1540, 1542], [1541, 1543], [1542, 1544, 1663], [1543, 1545], [1509, 1544, 1546], [1545, 1547], [1546, 1548, 1664], [1547, 1549], [1510, 1548, 1550], [1549, 1551], [1550, 1552, 1665], [1551, 1553], [1511, 1552, 1554], [1553, 1555], [1554, 1556, 1666], [1555, 1557], [1512, 1556, 1558], [1557, 1559], [1558, 1560, 1667], [1559, 1561], [1513, 1560, 1562], [1561, 1563], [1562, 1564, 1668], [1563, 1565], [1514, 1564, 1566], [1565, 1567], [1566, 1568, 1669], [1567, 1569], [1515, 1568, 1570], [1569, 1571], [1570, 1572, 1670], [1571, 1573], [1516, 1572, 1574], [1573, 1575], [1574, 1576, 1671], [1575, 1577], [1517, 1576, 1578], [1577, 1579], [1578, 1580, 1672], [1579, 1581], [1518, 1580, 1582], [1581, 1583], [1582, 1584, 1673], [1583, 1585], [1519, 1584, 1586], [1585, 1587], [1586, 1588, 1674], [1587, 1589], [1520, 1588, 1590], [1589, 1591], [1590, 1592, 1675], [1591, 1593], [1521, 1592, 1594], [1593, 1595], [1594, 1596, 1676], [1595, 1597], [1522, 1596, 1598], [1597, 1599], [1598, 1600, 1677], [1599, 1601], [1523, 1600, 1602], [1601, 1603], [1602, 1604, 1678], [1603, 1605], [1524, 1604, 1606], [1605, 1607], [1606, 1608, 1679], [1607, 1609], [1525, 1608, 1610], [1609, 1611], [1610, 1612, 1680], [1611, 1613], [1526, 1612, 1614], [1613, 1615], [1614, 1616, 1681], [1615, 1617], [1527, 1616, 1618], [1617, 1619], [1618, 1620, 1682], [1619, 1621], [1528, 1620, 1622], [1621, 1623], [1622, 1624, 1683], [1623, 1625], [1529, 1624, 1626], [1625, 1627], [1626, 1628, 1684], [1627, 1629], [1530, 1628, 1630], [1629, 1631], [1630, 1632, 1685], [1631, 1633], [1531, 1632, 1634], [1633, 1635], [1634, 1636, 1686], [1635, 1637], [1532, 1636, 1638], [1637, 1639], [1638, 1640, 1687], [1639, 1641], [1533, 1640, 1642], [1641, 1643], [1642, 1644, 1688], [1643, 1645], [1534, 1644, 1646], [1645, 1647], [1646, 1648, 1689], [1647, 1649], [1535, 1648, 1650], [1649, 1651], [1650, 1652, 1690], [1651, 1653], [1536, 1652, 1654], [1653, 1655], [1654, 1656, 1691], [1655, 1657], [1537, 1656, 1658], [1657, 1659], [1658, 1660, 1692], [1659, 1661], [1538, 1660], [1539, 1693], [1543, 1697], [1547, 1701], [1551, 1705], [1555, 1709], [1559, 1713], [1563, 1717], [1567, 1721], [1571, 1725], [1575, 1729], [1579, 1733], [1583, 1737], [1587, 1741], [1591, 1745], [1595, 1749], [1599, 1753], [1603, 1757], [1607, 1761], [1611, 1765], [1615, 1769], [1619, 1773], [1623, 1777], [1627, 1781], [1631, 1785], [1635, 1789], [1639, 1793], [1643, 1797], [1647, 1801], [1651, 1805], [1655, 1809], [1659, 1813], [1662, 1694], [1693, 1695], [1694, 1696, 1816], [1695, 1697], [1663, 1696, 1698], [1697, 1699], [1698, 1700, 1817], [1699, 1701], [1664, 1700, 1702], [1701, 1703], [1702, 1704, 1818], [1703, 1705], [1665, 1704, 1706], [1705, 1707], [1706, 1708, 1819], [1707, 1709], [1666, 1708, 1710], [1709, 1711], [1710, 1712, 1820], [1711, 1713], [1667, 1712, 1714], [1713, 1715], [1714, 1716, 1821], [1715, 1717], [1668, 1716, 1718], [1717, 1719], [1718, 1720, 1822], [1719, 1721], [1669, 1720, 1722], [1721, 1723], [1722, 1724, 1823], [1723, 1725], [1670, 1724, 1726], [1725, 1727], [1726, 1728, 1824], [1727, 1729], [1671, 1728, 1730], [1729, 1731], [1730, 1732, 1825], [1731, 1733], [1672, 1732, 1734], [1733, 1735], [1734, 1736, 1826], [1735, 1737], [1673, 1736, 1738], [1737, 1739], [1738, 1740, 1827], [1739, 1741], [1674, 1740, 1742], [1741, 1743], [1742, 1744, 1828], [1743, 1745], [1675, 1744, 1746], [1745, 1747], [1746, 1748, 1829], [1747, 1749], [1676, 1748, 1750], [1749, 1751], [1750, 1752, 1830], [1751, 1753], [1677, 1752, 1754], [1753, 1755], [1754, 1756, 1831], [1755, 1757], [1678, 1756, 1758], [1757, 1759], [1758, 1760, 1832], [1759, 1761], [1679, 1760, 1762], [1761, 1763], [1762, 1764, 1833], [1763, 1765], [1680, 1764, 1766], [1765, 1767], [1766, 1768, 1834], [1767, 1769], [1681, 1768, 1770], [1769, 1771], [1770, 1772, 1835], [1771, 1773], [1682, 1772, 1774], [1773, 1775], [1774, 1776, 1836], [1775, 1777], [1683, 1776, 1778], [1777, 1779], [1778, 1780, 1837], [1779, 1781], [1684, 1780, 1782], [1781, 1783], [1782, 1784, 1838], [1783, 1785], [1685, 1784, 1786], [1785, 1787], [1786, 1788, 1839], [1787, 1789], [1686, 1788, 1790], [1789, 1791], [1790, 1792, 1840], [1791, 1793], [1687, 1792, 1794], [1793, 1795], [1794, 1796, 1841], [1795, 1797], [1688, 1796, 1798], [1797, 1799], [1798, 1800, 1842], [1799, 1801], [1689, 1800, 1802], [1801, 1803], [1802, 1804, 1843], [1803, 1805], [1690, 1804, 1806], [1805, 1807], [1806, 1808, 1844], [1807, 1809], [1691, 1808, 1810], [1809, 1811], [1810, 1812, 1845], [1811, 1813], [1692, 1812, 1814], [1813, 1815], [1814, 1846], [1695, 1849], [1699, 1853], [1703, 1857], [1707, 1861], [1711, 1865], [1715, 1869], [1719, 1873], [1723, 1877], [1727, 1881], [1731, 1885], [1735, 1889], [1739, 1893], [1743, 1897], [1747, 1901], [1751, 1905], [1755, 1909], [1759, 1913], [1763, 1917], [1767, 1921], [1771, 1925], [1775, 1929], [1779, 1933], [1783, 1937], [1787, 1941], [1791, 1945], [1795, 1949], [1799, 1953], [1803, 1957], [1807, 1961], [1811, 1965], [1815, 1969], [1848, 1970], [1847, 1849], [1816, 1848, 1850], [1849, 1851], [1850, 1852, 1971], [1851, 1853], [1817, 1852, 1854], [1853, 1855], [1854, 1856, 1972], [1855, 1857], [1818, 1856, 1858], [1857, 1859], [1858, 1860, 1973], [1859, 1861], [1819, 1860, 1862], [1861, 1863], [1862, 1864, 1974], [1863, 1865], [1820, 1864, 1866], [1865, 1867], [1866, 1868, 1975], [1867, 1869], [1821, 1868, 1870], [1869, 1871], [1870, 1872, 1976], [1871, 1873], [1822, 1872, 1874], [1873, 1875], [1874, 1876, 1977], [1875, 1877], [1823, 1876, 1878], [1877, 1879], [1878, 1880, 1978], [1879, 1881], [1824, 1880, 1882], [1881, 1883], [1882, 1884, 1979], [1883, 1885], [1825, 1884, 1886], [1885, 1887], [1886, 1888, 1980], [1887, 1889], [1826, 1888, 1890], [1889, 1891], [1890, 1892, 1981], [1891, 1893], [1827, 1892, 1894], [1893, 1895], [1894, 1896, 1982], [1895, 1897], [1828, 1896, 1898], [1897, 1899], [1898, 1900, 1983], [1899, 1901], [1829, 1900, 1902], [1901, 1903], [1902, 1904, 1984], [1903, 1905], [1830, 1904, 1906], [1905, 1907], [1906, 1908, 1985], [1907, 1909], [1831, 1908, 1910], [1909, 1911], [1910, 1912, 1986], [1911, 1913], [1832, 1912, 1914], [1913, 1915], [1914, 1916, 1987], [1915, 1917], [1833, 1916, 1918], [1917, 1919], [1918, 1920, 1988], [1919, 1921], [1834, 1920, 1922], [1921, 1923], [1922, 1924, 1989], [1923, 1925], [1835, 1924, 1926], [1925, 1927], [1926, 1928, 1990], [1927, 1929], [1836, 1928, 1930], [1929, 1931], [1930, 1932, 1991], [1931, 1933], [1837, 1932, 1934], [1933, 1935], [1934, 1936, 1992], [1935, 1937], [1838, 1936, 1938], [1937, 1939], [1938, 1940, 1993], [1939, 1941], [1839, 1940, 1942], [1941, 1943], [1942, 1944, 1994], [1943, 1945], [1840, 1944, 1946], [1945, 1947], [1946, 1948, 1995], [1947, 1949], [1841, 1948, 1950], [1949, 1951], [1950, 1952, 1996], [1951, 1953], [1842, 1952, 1954], [1953, 1955], [1954, 1956, 1997], [1955, 1957], [1843, 1956, 1958], [1957, 1959], [1958, 1960, 1998], [1959, 1961], [1844, 1960, 1962], [1961, 1963], [1962, 1964, 1999], [1963, 1965], [1845, 1964, 1966], [1965, 1967], [1966, 1968, 2000], [1967, 1969], [1846, 1968], [1847, 2001], [1851, 2005], [1855, 2009], [1859, 2013], [1863, 2017], [1867, 2021], [1871, 2025], [1875, 2029], [1879, 2033], [1883, 2037], [1887, 2041], [1891, 2045], [1895, 2049], [1899, 2053], [1903, 2057], [1907, 2061], [1911, 2065], [1915, 2069], [1919, 2073], [1923, 2077], [1927, 2081], [1931, 2085], [1935, 2089], [1939, 2093], [1943, 2097], [1947, 2101], [1951, 2105], [1955, 2109], [1959, 2113], [1963, 2117], [1967, 2121], [1970, 2002], [2001, 2003], [2002, 2004, 2124], [2003, 2005], [1971, 2004, 2006], [2005, 2007], [2006, 2008, 2125], [2007, 2009], [1972, 2008, 2010], [2009, 2011], [2010, 2012, 2126], [2011, 2013], [1973, 2012, 2014], [2013, 2015], [2014, 2016, 2127], [2015, 2017], [1974, 2016, 2018], [2017, 2019], [2018, 2020, 2128], [2019, 2021], [1975, 2020, 2022], [2021, 2023], [2022, 2024, 2129], [2023, 2025], [1976, 2024, 2026], [2025, 2027], [2026, 2028, 2130], [2027, 2029], [1977, 2028, 2030], [2029, 2031], [2030, 2032, 2131], [2031, 2033], [1978, 2032, 2034], [2033, 2035], [2034, 2036, 2132], [2035, 2037], [1979, 2036, 2038], [2037, 2039], [2038, 2040, 2133], [2039, 2041], [1980, 2040, 2042], [2041, 2043], [2042, 2044, 2134], [2043, 2045], [1981, 2044, 2046], [2045, 2047], [2046, 2048, 2135], [2047, 2049], [1982, 2048, 2050], [2049, 2051], [2050, 2052, 2136], [2051, 2053], [1983, 2052, 2054], [2053, 2055], [2054, 2056, 2137], [2055, 2057], [1984, 2056, 2058], [2057, 2059], [2058, 2060, 2138], [2059, 2061], [1985, 2060, 2062], [2061, 2063], [2062, 2064, 2139], [2063, 2065], [1986, 2064, 2066], [2065, 2067], [2066, 2068, 2140], [2067, 2069], [1987, 2068, 2070], [2069, 2071], [2070, 2072, 2141], [2071, 2073], [1988, 2072, 2074], [2073, 2075], [2074, 2076, 2142], [2075, 2077], [1989, 2076, 2078], [2077, 2079], [2078, 2080, 2143], [2079, 2081], [1990, 2080, 2082], [2081, 2083], [2082, 2084, 2144], [2083, 2085], [1991, 2084, 2086], [2085, 2087], [2086, 2088, 2145], [2087, 2089], [1992, 2088, 2090], [2089, 2091], [2090, 2092, 2146], [2091, 2093], [1993, 2092, 2094], [2093, 2095], [2094, 2096, 2147], [2095, 2097], [1994, 2096, 2098], [2097, 2099], [2098, 2100, 2148], [2099, 2101], [1995, 2100, 2102], [2101, 2103], [2102, 2104, 2149], [2103, 2105], [1996, 2104, 2106], [2105, 2107], [2106, 2108, 2150], [2107, 2109], [1997, 2108, 2110], [2109, 2111], [2110, 2112, 2151], [2111, 2113], [1998, 2112, 2114], [2113, 2115], [2114, 2116, 2152], [2115, 2117], [1999, 2116, 2118], [2117, 2119], [2118, 2120, 2153], [2119, 2121], [2000, 2120, 2122], [2121, 2123], [2122, 2154], [2003, 2157], [2007, 2161], [2011, 2165], [2015, 2169], [2019, 2173], [2023, 2177], [2027, 2181], [2031, 2185], [2035, 2189], [2039, 2193], [2043, 2197], [2047, 2201], [2051, 2205], [2055, 2209], [2059, 2213], [2063, 2217], [2067, 2221], [2071, 2225], [2075, 2229], [2079, 2233], [2083, 2237], [2087, 2241], [2091, 2245], [2095, 2249], [2099, 2253], [2103, 2257], [2107, 2261], [2111, 2265], [2115, 2269], [2119, 2273], [2123, 2277], [2156, 2278], [2155, 2157], [2124, 2156, 2158], [2157, 2159], [2158, 2160, 2279], [2159, 2161], [2125, 2160, 2162], [2161, 2163], [2162, 2164, 2280], [2163, 2165], [2126, 2164, 2166], [2165, 2167], [2166, 2168, 2281], [2167, 2169], [2127, 2168, 2170], [2169, 2171], [2170, 2172, 2282], [2171, 2173], [2128, 2172, 2174], [2173, 2175], [2174, 2176, 2283], [2175, 2177], [2129, 2176, 2178], [2177, 2179], [2178, 2180, 2284], [2179, 2181], [2130, 2180, 2182], [2181, 2183], [2182, 2184, 2285], [2183, 2185], [2131, 2184, 2186], [2185, 2187], [2186, 2188, 2286], [2187, 2189], [2132, 2188, 2190], [2189, 2191], [2190, 2192, 2287], [2191, 2193], [2133, 2192, 2194], [2193, 2195], [2194, 2196, 2288], [2195, 2197], [2134, 2196, 2198], [2197, 2199], [2198, 2200, 2289], [2199, 2201], [2135, 2200, 2202], [2201, 2203], [2202, 2204, 2290], [2203, 2205], [2136, 2204, 2206], [2205, 2207], [2206, 2208, 2291], [2207, 2209], [2137, 2208, 2210], [2209, 2211], [2210, 2212, 2292], [2211, 2213], [2138, 2212, 2214], [2213, 2215], [2214, 2216, 2293], [2215, 2217], [2139, 2216, 2218], [2217, 2219], [2218, 2220, 2294], [2219, 2221], [2140, 2220, 2222], [2221, 2223], [2222, 2224, 2295], [2223, 2225], [2141, 2224, 2226], [2225, 2227], [2226, 2228, 2296], [2227, 2229], [2142, 2228, 2230], [2229, 2231], [2230, 2232, 2297], [2231, 2233], [2143, 2232, 2234], [2233, 2235], [2234, 2236, 2298], [2235, 2237], [2144, 2236, 2238], [2237, 2239], [2238, 2240, 2299], [2239, 2241], [2145, 2240, 2242], [2241, 2243], [2242, 2244, 2300], [2243, 2245], [2146, 2244, 2246], [2245, 2247], [2246, 2248, 2301], [2247, 2249], [2147, 2248, 2250], [2249, 2251], [2250, 2252, 2302], [2251, 2253], [2148, 2252, 2254], [2253, 2255], [2254, 2256, 2303], [2255, 2257], [2149, 2256, 2258], [2257, 2259], [2258, 2260, 2304], [2259, 2261], [2150, 2260, 2262], [2261, 2263], [2262, 2264, 2305], [2263, 2265], [2151, 2264, 2266], [2265, 2267], [2266, 2268, 2306], [2267, 2269], [2152, 2268, 2270], [2269, 2271], [2270, 2272, 2307], [2271, 2273], [2153, 2272, 2274], [2273, 2275], [2274, 2276, 2308], [2275, 2277], [2154, 2276], [2155, 2309], [2159, 2313], [2163, 2317], [2167, 2321], [2171, 2325], [2175, 2329], [2179, 2333], [2183, 2337], [2187, 2341], [2191, 2345], [2195, 2349], [2199, 2353], [2203, 2357], [2207, 2361], [2211, 2365], [2215, 2369], [2219, 2373], [2223, 2377], [2227, 2381], [2231, 2385], [2235, 2389], [2239, 2393], [2243, 2397], [2247, 2401], [2251, 2405], [2255, 2409], [2259, 2413], [2263, 2417], [2267, 2421], [2271, 2425], [2275, 2429], [2278, 2310], [2309, 2311], [2310, 2312, 2432], [2311, 2313], [2279, 2312, 2314], [2313, 2315], [2314, 2316, 2433], [2315, 2317], [2280, 2316, 2318], [2317, 2319], [2318, 2320, 2434], [2319, 2321], [2281, 2320, 2322], [2321, 2323], [2322, 2324, 2435], [2323, 2325], [2282, 2324, 2326], [2325, 2327], [2326, 2328, 2436], [2327, 2329], [2283, 2328, 2330], [2329, 2331], [2330, 2332, 2437], [2331, 2333], [2284, 2332, 2334], [2333, 2335], [2334, 2336, 2438], [2335, 2337], [2285, 2336, 2338], [2337, 2339], [2338, 2340, 2439], [2339, 2341], [2286, 2340, 2342], [2341, 2343], [2342, 2344, 2440], [2343, 2345], [2287, 2344, 2346], [2345, 2347], [2346, 2348, 2441], [2347, 2349], [2288, 2348, 2350], [2349, 2351], [2350, 2352, 2442], [2351, 2353], [2289, 2352, 2354], [2353, 2355], [2354, 2356, 2443], [2355, 2357], [2290, 2356, 2358], [2357, 2359], [2358, 2360, 2444], [2359, 2361], [2291, 2360, 2362], [2361, 2363], [2362, 2364, 2445], [2363, 2365], [2292, 2364, 2366], [2365, 2367], [2366, 2368, 2446], [2367, 2369], [2293, 2368, 2370], [2369, 2371], [2370, 2372, 2447], [2371, 2373], [2294, 2372, 2374], [2373, 2375], [2374, 2376, 2448], [2375, 2377], [2295, 2376, 2378], [2377, 2379], [2378, 2380, 2449], [2379, 2381], [2296, 2380, 2382], [2381, 2383], [2382, 2384, 2450], [2383, 2385], [2297, 2384, 2386], [2385, 2387], [2386, 2388, 2451], [2387, 2389], [2298, 2388, 2390], [2389, 2391], [2390, 2392, 2452], [2391, 2393], [2299, 2392, 2394], [2393, 2395], [2394, 2396, 2453], [2395, 2397], [2300, 2396, 2398], [2397, 2399], [2398, 2400, 2454], [2399, 2401], [2301, 2400, 2402], [2401, 2403], [2402, 2404, 2455], [2403, 2405], [2302, 2404, 2406], [2405, 2407], [2406, 2408, 2456], [2407, 2409], [2303, 2408, 2410], [2409, 2411], [2410, 2412, 2457], [2411, 2413], [2304, 2412, 2414], [2413, 2415], [2414, 2416, 2458], [2415, 2417], [2305, 2416, 2418], [2417, 2419], [2418, 2420, 2459], [2419, 2421], [2306, 2420, 2422], [2421, 2423], [2422, 2424, 2460], [2423, 2425], [2307, 2424, 2426], [2425, 2427], [2426, 2428, 2461], [2427, 2429], [2308, 2428, 2430], [2429, 2431], [2430, 2462], [2311, 2465], [2315, 2469], [2319, 2473], [2323, 2477], [2327, 2481], [2331, 2485], [2335, 2489], [2339, 2493], [2343, 2497], [2347, 2501], [2351, 2505], [2355, 2509], [2359, 2513], [2363, 2517], [2367, 2521], [2371, 2525], [2375, 2529], [2379, 2533], [2383, 2537], [2387, 2541], [2391, 2545], [2395, 2549], [2399, 2553], [2403, 2557], [2407, 2561], [2411, 2565], [2415, 2569], [2419, 2573], [2423, 2577], [2427, 2581], [2431, 2585], [2464, 2586], [2463, 2465], [2432, 2464, 2466], [2465, 2467], [2466, 2468, 2587], [2467, 2469], [2433, 2468, 2470], [2469, 2471], [2470, 2472, 2588], [2471, 2473], [2434, 2472, 2474], [2473, 2475], [2474, 2476, 2589], [2475, 2477], [2435, 2476, 2478], [2477, 2479], [2478, 2480, 2590], [2479, 2481], [2436, 2480, 2482], [2481, 2483], [2482, 2484, 2591], [2483, 2485], [2437, 2484, 2486], [2485, 2487], [2486, 2488, 2592], [2487, 2489], [2438, 2488, 2490], [2489, 2491], [2490, 2492, 2593], [2491, 2493], [2439, 2492, 2494], [2493, 2495], [2494, 2496, 2594], [2495, 2497], [2440, 2496, 2498], [2497, 2499], [2498, 2500, 2595], [2499, 2501], [2441, 2500, 2502], [2501, 2503], [2502, 2504, 2596], [2503, 2505], [2442, 2504, 2506], [2505, 2507], [2506, 2508, 2597], [2507, 2509], [2443, 2508, 2510], [2509, 2511], [2510, 2512, 2598], [2511, 2513], [2444, 2512, 2514], [2513, 2515], [2514, 2516, 2599], [2515, 2517], [2445, 2516, 2518], [2517, 2519], [2518, 2520, 2600], [2519, 2521], [2446, 2520, 2522], [2521, 2523], [2522, 2524, 2601], [2523, 2525], [2447, 2524, 2526], [2525, 2527], [2526, 2528, 2602], [2527, 2529], [2448, 2528, 2530], [2529, 2531], [2530, 2532, 2603], [2531, 2533], [2449, 2532, 2534], [2533, 2535], [2534, 2536, 2604], [2535, 2537], [2450, 2536, 2538], [2537, 2539], [2538, 2540, 2605], [2539, 2541], [2451, 2540, 2542], [2541, 2543], [2542, 2544, 2606], [2543, 2545], [2452, 2544, 2546], [2545, 2547], [2546, 2548, 2607], [2547, 2549], [2453, 2548, 2550], [2549, 2551], [2550, 2552, 2608], [2551, 2553], [2454, 2552, 2554], [2553, 2555], [2554, 2556, 2609], [2555, 2557], [2455, 2556, 2558], [2557, 2559], [2558, 2560, 2610], [2559, 2561], [2456, 2560, 2562], [2561, 2563], [2562, 2564, 2611], [2563, 2565], [2457, 2564, 2566], [2565, 2567], [2566, 2568, 2612], [2567, 2569], [2458, 2568, 2570], [2569, 2571], [2570, 2572, 2613], [2571, 2573], [2459, 2572, 2574], [2573, 2575], [2574, 2576, 2614], [2575, 2577], [2460, 2576, 2578], [2577, 2579], [2578, 2580, 2615], [2579, 2581], [2461, 2580, 2582], [2581, 2583], [2582, 2584, 2616], [2583, 2585], [2462, 2584], [2463, 2617], [2467, 2621], [2471, 2625], [2475, 2629], [2479, 2633], [2483, 2637], [2487, 2641], [2491, 2645], [2495, 2649], [2499, 2653], [2503, 2657], [2507, 2661], [2511, 2665], [2515, 2669], [2519, 2673], [2523, 2677], [2527, 2681], [2531, 2685], [2535, 2689], [2539, 2693], [2543, 2697], [2547, 2701], [2551, 2705], [2555, 2709], [2559, 2713], [2563, 2717], [2567, 2721], [2571, 2725], [2575, 2729], [2579, 2733], [2583, 2737], [2586, 2618], [2617, 2619], [2618, 2620, 2740], [2619, 2621], [2587, 2620, 2622], [2621, 2623], [2622, 2624, 2741], [2623, 2625], [2588, 2624, 2626], [2625, 2627], [2626, 2628, 2742], [2627, 2629], [2589, 2628, 2630], [2629, 2631], [2630, 2632, 2743], [2631, 2633], [2590, 2632, 2634], [2633, 2635], [2634, 2636, 2744], [2635, 2637], [2591, 2636, 2638], [2637, 2639], [2638, 2640, 2745], [2639, 2641], [2592, 2640, 2642], [2641, 2643], [2642, 2644, 2746], [2643, 2645], [2593, 2644, 2646], [2645, 2647], [2646, 2648, 2747], [2647, 2649], [2594, 2648, 2650], [2649, 2651], [2650, 2652, 2748], [2651, 2653], [2595, 2652, 2654], [2653, 2655], [2654, 2656, 2749], [2655, 2657], [2596, 2656, 2658], [2657, 2659], [2658, 2660, 2750], [2659, 2661], [2597, 2660, 2662], [2661, 2663], [2662, 2664, 2751], [2663, 2665], [2598, 2664, 2666], [2665, 2667], [2666, 2668, 2752], [2667, 2669], [2599, 2668, 2670], [2669, 2671], [2670, 2672, 2753], [2671, 2673], [2600, 2672, 2674], [2673, 2675], [2674, 2676, 2754], [2675, 2677], [2601, 2676, 2678], [2677, 2679], [2678, 2680, 2755], [2679, 2681], [2602, 2680, 2682], [2681, 2683], [2682, 2684, 2756], [2683, 2685], [2603, 2684, 2686], [2685, 2687], [2686, 2688, 2757], [2687, 2689], [2604, 2688, 2690], [2689, 2691], [2690, 2692, 2758], [2691, 2693], [2605, 2692, 2694], [2693, 2695], [2694, 2696, 2759], [2695, 2697], [2606, 2696, 2698], [2697, 2699], [2698, 2700, 2760], [2699, 2701], [2607, 2700, 2702], [2701, 2703], [2702, 2704, 2761], [2703, 2705], [2608, 2704, 2706], [2705, 2707], [2706, 2708, 2762], [2707, 2709], [2609, 2708, 2710], [2709, 2711], [2710, 2712, 2763], [2711, 2713], [2610, 2712, 2714], [2713, 2715], [2714, 2716, 2764], [2715, 2717], [2611, 2716, 2718], [2717, 2719], [2718, 2720, 2765], [2719, 2721], [2612, 2720, 2722], [2721, 2723], [2722, 2724, 2766], [2723, 2725], [2613, 2724, 2726], [2725, 2727], [2726, 2728, 2767], [2727, 2729], [2614, 2728, 2730], [2729, 2731], [2730, 2732, 2768], [2731, 2733], [2615, 2732, 2734], [2733, 2735], [2734, 2736, 2769], [2735, 2737], [2616, 2736, 2738], [2737, 2739], [2738, 2770], [2619, 2773], [2623, 2777], [2627, 2781], [2631, 2785], [2635, 2789], [2639, 2793], [2643, 2797], [2647, 2801], [2651, 2805], [2655, 2809], [2659, 2813], [2663, 2817], [2667, 2821], [2671, 2825], [2675, 2829], [2679, 2833], [2683, 2837], [2687, 2841], [2691, 2845], [2695, 2849], [2699, 2853], [2703, 2857], [2707, 2861], [2711, 2865], [2715, 2869], [2719, 2873], [2723, 2877], [2727, 2881], [2731, 2885], [2735, 2889], [2739, 2893], [2772, 2894], [2771, 2773], [2740, 2772, 2774], [2773, 2775], [2774, 2776, 2895], [2775, 2777], [2741, 2776, 2778], [2777, 2779], [2778, 2780, 2896], [2779, 2781], [2742, 2780, 2782], [2781, 2783], [2782, 2784, 2897], [2783, 2785], [2743, 2784, 2786], [2785, 2787], [2786, 2788, 2898], [2787, 2789], [2744, 2788, 2790], [2789, 2791], [2790, 2792, 2899], [2791, 2793], [2745, 2792, 2794], [2793, 2795], [2794, 2796, 2900], [2795, 2797], [2746, 2796, 2798], [2797, 2799], [2798, 2800, 2901], [2799, 2801], [2747, 2800, 2802], [2801, 2803], [2802, 2804, 2902], [2803, 2805], [2748, 2804, 2806], [2805, 2807], [2806, 2808, 2903], [2807, 2809], [2749, 2808, 2810], [2809, 2811], [2810, 2812, 2904], [2811, 2813], [2750, 2812, 2814], [2813, 2815], [2814, 2816, 2905], [2815, 2817], [2751, 2816, 2818], [2817, 2819], [2818, 2820, 2906], [2819, 2821], [2752, 2820, 2822], [2821, 2823], [2822, 2824, 2907], [2823, 2825], [2753, 2824, 2826], [2825, 2827], [2826, 2828, 2908], [2827, 2829], [2754, 2828, 2830], [2829, 2831], [2830, 2832, 2909], [2831, 2833], [2755, 2832, 2834], [2833, 2835], [2834, 2836, 2910], [2835, 2837], [2756, 2836, 2838], [2837, 2839], [2838, 2840, 2911], [2839, 2841], [2757, 2840, 2842], [2841, 2843], [2842, 2844, 2912], [2843, 2845], [2758, 2844, 2846], [2845, 2847], [2846, 2848, 2913], [2847, 2849], [2759, 2848, 2850], [2849, 2851], [2850, 2852, 2914], [2851, 2853], [2760, 2852, 2854], [2853, 2855], [2854, 2856, 2915], [2855, 2857], [2761, 2856, 2858], [2857, 2859], [2858, 2860, 2916], [2859, 2861], [2762, 2860, 2862], [2861, 2863], [2862, 2864, 2917], [2863, 2865], [2763, 2864, 2866], [2865, 2867], [2866, 2868, 2918], [2867, 2869], [2764, 2868, 2870], [2869, 2871], [2870, 2872, 2919], [2871, 2873], [2765, 2872, 2874], [2873, 2875], [2874, 2876, 2920], [2875, 2877], [2766, 2876, 2878], [2877, 2879], [2878, 2880, 2921], [2879, 2881], [2767, 2880, 2882], [2881, 2883], [2882, 2884, 2922], [2883, 2885], [2768, 2884, 2886], [2885, 2887], [2886, 2888, 2923], [2887, 2889], [2769, 2888, 2890], [2889, 2891], [2890, 2892, 2924], [2891, 2893], [2770, 2892], [2771, 2925], [2775, 2929], [2779, 2933], [2783, 2937], [2787, 2941], [2791, 2945], [2795, 2949], [2799, 2953], [2803, 2957], [2807, 2961], [2811, 2965], [2815, 2969], [2819, 2973], [2823, 2977], [2827, 2981], [2831, 2985], [2835, 2989], [2839, 2993], [2843, 2997], [2847, 3001], [2851, 3005], [2855, 3009], [2859, 3013], [2863, 3017], [2867, 3021], [2871, 3025], [2875, 3029], [2879, 3033], [2883, 3037], [2887, 3041], [2891, 3045], [2894, 2926], [2925, 2927], [2926, 2928, 3048], [2927, 2929], [2895, 2928, 2930], [2929, 2931], [2930, 2932, 3049], [2931, 2933], [2896, 2932, 2934], [2933, 2935], [2934, 2936, 3050], [2935, 2937], [2897, 2936, 2938], [2937, 2939], [2938, 2940, 3051], [2939, 2941], [2898, 2940, 2942], [2941, 2943], [2942, 2944, 3052], [2943, 2945], [2899, 2944, 2946], [2945, 2947], [2946, 2948, 3053], [2947, 2949], [2900, 2948, 2950], [2949, 2951], [2950, 2952, 3054], [2951, 2953], [2901, 2952, 2954], [2953, 2955], [2954, 2956, 3055], [2955, 2957], [2902, 2956, 2958], [2957, 2959], [2958, 2960, 3056], [2959, 2961], [2903, 2960, 2962], [2961, 2963], [2962, 2964, 3057], [2963, 2965], [2904, 2964, 2966], [2965, 2967], [2966, 2968, 3058], [2967, 2969], [2905, 2968, 2970], [2969, 2971], [2970, 2972, 3059], [2971, 2973], [2906, 2972, 2974], [2973, 2975], [2974, 2976, 3060], [2975, 2977], [2907, 2976, 2978], [2977, 2979], [2978, 2980, 3061], [2979, 2981], [2908, 2980, 2982], [2981, 2983], [2982, 2984, 3062], [2983, 2985], [2909, 2984, 2986], [2985, 2987], [2986, 2988, 3063], [2987, 2989], [2910, 2988, 2990], [2989, 2991], [2990, 2992, 3064], [2991, 2993], [2911, 2992, 2994], [2993, 2995], [2994, 2996, 3065], [2995, 2997], [2912, 2996, 2998], [2997, 2999], [2998, 3000, 3066], [2999, 3001], [2913, 3000, 3002], [3001, 3003], [3002, 3004, 3067], [3003, 3005], [2914, 3004, 3006], [3005, 3007], [3006, 3008, 3068], [3007, 3009], [2915, 3008, 3010], [3009, 3011], [3010, 3012, 3069], [3011, 3013], [2916, 3012, 3014], [3013, 3015], [3014, 3016, 3070], [3015, 3017], [2917, 3016, 3018], [3017, 3019], [3018, 3020, 3071], [3019, 3021], [2918, 3020, 3022], [3021, 3023], [3022, 3024, 3072], [3023, 3025], [2919, 3024, 3026], [3025, 3027], [3026, 3028, 3073], [3027, 3029], [2920, 3028, 3030], [3029, 3031], [3030, 3032, 3074], [3031, 3033], [2921, 3032, 3034], [3033, 3035], [3034, 3036, 3075], [3035, 3037], [2922, 3036, 3038], [3037, 3039], [3038, 3040, 3076], [3039, 3041], [2923, 3040, 3042], [3041, 3043], [3042, 3044, 3077], [3043, 3045], [2924, 3044, 3046], [3045, 3047], [3046, 3078], [2927, 3081], [2931, 3085], [2935, 3089], [2939, 3093], [2943, 3097], [2947, 3101], [2951, 3105], [2955, 3109], [2959, 3113], [2963, 3117], [2967, 3121], [2971, 3125], [2975, 3129], [2979, 3133], [2983, 3137], [2987, 3141], [2991, 3145], [2995, 3149], [2999, 3153], [3003, 3157], [3007, 3161], [3011, 3165], [3015, 3169], [3019, 3173], [3023, 3177], [3027, 3181], [3031, 3185], [3035, 3189], [3039, 3193], [3043, 3197], [3047, 3201], [3080, 3202], [3079, 3081], [3048, 3080, 3082], [3081, 3083], [3082, 3084, 3203], [3083, 3085], [3049, 3084, 3086], [3085, 3087], [3086, 3088, 3204], [3087, 3089], [3050, 3088, 3090], [3089, 3091], [3090, 3092, 3205], [3091, 3093], [3051, 3092, 3094], [3093, 3095], [3094, 3096, 3206], [3095, 3097], [3052, 3096, 3098], [3097, 3099], [3098, 3100, 3207], [3099, 3101], [3053, 3100, 3102], [3101, 3103], [3102, 3104, 3208], [3103, 3105], [3054, 3104, 3106], [3105, 3107], [3106, 3108, 3209], [3107, 3109], [3055, 3108, 3110], [3109, 3111], [3110, 3112, 3210], [3111, 3113], [3056, 3112, 3114], [3113, 3115], [3114, 3116, 3211], [3115, 3117], [3057, 3116, 3118], [3117, 3119], [3118, 3120, 3212], [3119, 3121], [3058, 3120, 3122], [3121, 3123], [3122, 3124, 3213], [3123, 3125], [3059, 3124, 3126], [3125, 3127], [3126, 3128, 3214], [3127, 3129], [3060, 3128, 3130], [3129, 3131], [3130, 3132, 3215], [3131, 3133], [3061, 3132, 3134], [3133, 3135], [3134, 3136, 3216], [3135, 3137], [3062, 3136, 3138], [3137, 3139], [3138, 3140, 3217], [3139, 3141], [3063, 3140, 3142], [3141, 3143], [3142, 3144, 3218], [3143, 3145], [3064, 3144, 3146], [3145, 3147], [3146, 3148, 3219], [3147, 3149], [3065, 3148, 3150], [3149, 3151], [3150, 3152, 3220], [3151, 3153], [3066, 3152, 3154], [3153, 3155], [3154, 3156, 3221], [3155, 3157], [3067, 3156, 3158], [3157, 3159], [3158, 3160, 3222], [3159, 3161], [3068, 3160, 3162], [3161, 3163], [3162, 3164, 3223], [3163, 3165], [3069, 3164, 3166], [3165, 3167], [3166, 3168, 3224], [3167, 3169], [3070, 3168, 3170], [3169, 3171], [3170, 3172, 3225], [3171, 3173], [3071, 3172, 3174], [3173, 3175], [3174, 3176, 3226], [3175, 3177], [3072, 3176, 3178], [3177, 3179], [3178, 3180, 3227], [3179, 3181], [3073, 3180, 3182], [3181, 3183], [3182, 3184, 3228], [3183, 3185], [3074, 3184, 3186], [3185, 3187], [3186, 3188, 3229], [3187, 3189], [3075, 3188, 3190], [3189, 3191], [3190, 3192, 3230], [3191, 3193], [3076, 3192, 3194], [3193, 3195], [3194, 3196, 3231], [3195, 3197], [3077, 3196, 3198], [3197, 3199], [3198, 3200, 3232], [3199, 3201], [3078, 3200], [3079, 3233], [3083, 3237], [3087, 3241], [3091, 3245], [3095, 3249], [3099, 3253], [3103, 3257], [3107, 3261], [3111, 3265], [3115, 3269], [3119, 3273], [3123, 3277], [3127, 3281], [3131, 3285], [3135, 3289], [3139, 3293], [3143, 3297], [3147, 3301], [3151, 3305], [3155, 3309], [3159, 3313], [3163, 3317], [3167, 3321], [3171, 3325], [3175, 3329], [3179, 3333], [3183, 3337], [3187, 3341], [3191, 3345], [3195, 3349], [3199, 3353], [3202, 3234], [3233, 3235], [3234, 3236, 3356], [3235, 3237], [3203, 3236, 3238], [3237, 3239], [3238, 3240, 3357], [3239, 3241], [3204, 3240, 3242], [3241, 3243], [3242, 3244, 3358], [3243, 3245], [3205, 3244, 3246], [3245, 3247], [3246, 3248, 3359], [3247, 3249], [3206, 3248, 3250], [3249, 3251], [3250, 3252, 3360], [3251, 3253], [3207, 3252, 3254], [3253, 3255], [3254, 3256, 3361], [3255, 3257], [3208, 3256, 3258], [3257, 3259], [3258, 3260, 3362], [3259, 3261], [3209, 3260, 3262], [3261, 3263], [3262, 3264, 3363], [3263, 3265], [3210, 3264, 3266], [3265, 3267], [3266, 3268, 3364], [3267, 3269], [3211, 3268, 3270], [3269, 3271], [3270, 3272, 3365], [3271, 3273], [3212, 3272, 3274], [3273, 3275], [3274, 3276, 3366], [3275, 3277], [3213, 3276, 3278], [3277, 3279], [3278, 3280, 3367], [3279, 3281], [3214, 3280, 3282], [3281, 3283], [3282, 3284, 3368], [3283, 3285], [3215, 3284, 3286], [3285, 3287], [3286, 3288, 3369], [3287, 3289], [3216, 3288, 3290], [3289, 3291], [3290, 3292, 3370], [3291, 3293], [3217, 3292, 3294], [3293, 3295], [3294, 3296, 3371], [3295, 3297], [3218, 3296, 3298], [3297, 3299], [3298, 3300, 3372], [3299, 3301], [3219, 3300, 3302], [3301, 3303], [3302, 3304, 3373], [3303, 3305], [3220, 3304, 3306], [3305, 3307], [3306, 3308, 3374], [3307, 3309], [3221, 3308, 3310], [3309, 3311], [3310, 3312, 3375], [3311, 3313], [3222, 3312, 3314], [3313, 3315], [3314, 3316, 3376], [3315, 3317], [3223, 3316, 3318], [3317, 3319], [3318, 3320, 3377], [3319, 3321], [3224, 3320, 3322], [3321, 3323], [3322, 3324, 3378], [3323, 3325], [3225, 3324, 3326], [3325, 3327], [3326, 3328, 3379], [3327, 3329], [3226, 3328, 3330], [3329, 3331], [3330, 3332, 3380], [3331, 3333], [3227, 3332, 3334], [3333, 3335], [3334, 3336, 3381], [3335, 3337], [3228, 3336, 3338], [3337, 3339], [3338, 3340, 3382], [3339, 3341], [3229, 3340, 3342], [3341, 3343], [3342, 3344, 3383], [3343, 3345], [3230, 3344, 3346], [3345, 3347], [3346, 3348, 3384], [3347, 3349], [3231, 3348, 3350], [3349, 3351], [3350, 3352, 3385], [3351, 3353], [3232, 3352, 3354], [3353, 3355], [3354, 3386], [3235, 3389], [3239, 3393], [3243, 3397], [3247, 3401], [3251, 3405], [3255, 3409], [3259, 3413], [3263, 3417], [3267, 3421], [3271, 3425], [3275, 3429], [3279, 3433], [3283, 3437], [3287, 3441], [3291, 3445], [3295, 3449], [3299, 3453], [3303, 3457], [3307, 3461], [3311, 3465], [3315, 3469], [3319, 3473], [3323, 3477], [3327, 3481], [3331, 3485], [3335, 3489], [3339, 3493], [3343, 3497], [3347, 3501], [3351, 3505], [3355, 3509], [3388, 3510], [3387, 3389], [3356, 3388, 3390], [3389, 3391], [3390, 3392, 3511], [3391, 3393], [3357, 3392, 3394], [3393, 3395], [3394, 3396, 3512], [3395, 3397], [3358, 3396, 3398], [3397, 3399], [3398, 3400, 3513], [3399, 3401], [3359, 3400, 3402], [3401, 3403], [3402, 3404, 3514], [3403, 3405], [3360, 3404, 3406], [3405, 3407], [3406, 3408, 3515], [3407, 3409], [3361, 3408, 3410], [3409, 3411], [3410, 3412, 3516], [3411, 3413], [3362, 3412, 3414], [3413, 3415], [3414, 3416, 3517], [3415, 3417], [3363, 3416, 3418], [3417, 3419], [3418, 3420, 3518], [3419, 3421], [3364, 3420, 3422], [3421, 3423], [3422, 3424, 3519], [3423, 3425], [3365, 3424, 3426], [3425, 3427], [3426, 3428, 3520], [3427, 3429], [3366, 3428, 3430], [3429, 3431], [3430, 3432, 3521], [3431, 3433], [3367, 3432, 3434], [3433, 3435], [3434, 3436, 3522], [3435, 3437], [3368, 3436, 3438], [3437, 3439], [3438, 3440, 3523], [3439, 3441], [3369, 3440, 3442], [3441, 3443], [3442, 3444, 3524], [3443, 3445], [3370, 3444, 3446], [3445, 3447], [3446, 3448, 3525], [3447, 3449], [3371, 3448, 3450], [3449, 3451], [3450, 3452, 3526], [3451, 3453], [3372, 3452, 3454], [3453, 3455], [3454, 3456, 3527], [3455, 3457], [3373, 3456, 3458], [3457, 3459], [3458, 3460, 3528], [3459, 3461], [3374, 3460, 3462], [3461, 3463], [3462, 3464, 3529], [3463, 3465], [3375, 3464, 3466], [3465, 3467], [3466, 3468, 3530], [3467, 3469], [3376, 3468, 3470], [3469, 3471], [3470, 3472, 3531], [3471, 3473], [3377, 3472, 3474], [3473, 3475], [3474, 3476, 3532], [3475, 3477], [3378, 3476, 3478], [3477, 3479], [3478, 3480, 3533], [3479, 3481], [3379, 3480, 3482], [3481, 3483], [3482, 3484, 3534], [3483, 3485], [3380, 3484, 3486], [3485, 3487], [3486, 3488, 3535], [3487, 3489], [3381, 3488, 3490], [3489, 3491], [3490, 3492, 3536], [3491, 3493], [3382, 3492, 3494], [3493, 3495], [3494, 3496, 3537], [3495, 3497], [3383, 3496, 3498], [3497, 3499], [3498, 3500, 3538], [3499, 3501], [3384, 3500, 3502], [3501, 3503], [3502, 3504, 3539], [3503, 3505], [3385, 3504, 3506], [3505, 3507], [3506, 3508, 3540], [3507, 3509], [3386, 3508], [3387, 3541], [3391, 3545], [3395, 3549], [3399, 3553], [3403, 3557], [3407, 3561], [3411, 3565], [3415, 3569], [3419, 3573], [3423, 3577], [3427, 3581], [3431, 3585], [3435, 3589], [3439, 3593], [3443, 3597], [3447, 3601], [3451, 3605], [3455, 3609], [3459, 3613], [3463, 3617], [3467, 3621], [3471, 3625], [3475, 3629], [3479, 3633], [3483, 3637], [3487, 3641], [3491, 3645], [3495, 3649], [3499, 3653], [3503, 3657], [3507, 3661], [3510, 3542], [3541, 3543], [3542, 3544, 3664], [3543, 3545], [3511, 3544, 3546], [3545, 3547], [3546, 3548, 3665], [3547, 3549], [3512, 3548, 3550], [3549, 3551], [3550, 3552, 3666], [3551, 3553], [3513, 3552, 3554], [3553, 3555], [3554, 3556, 3667], [3555, 3557], [3514, 3556, 3558], [3557, 3559], [3558, 3560, 3668], [3559, 3561], [3515, 3560, 3562], [3561, 3563], [3562, 3564, 3669], [3563, 3565], [3516, 3564, 3566], [3565, 3567], [3566, 3568, 3670], [3567, 3569], [3517, 3568, 3570], [3569, 3571], [3570, 3572, 3671], [3571, 3573], [3518, 3572, 3574], [3573, 3575], [3574, 3576, 3672], [3575, 3577], [3519, 3576, 3578], [3577, 3579], [3578, 3580, 3673], [3579, 3581], [3520, 3580, 3582], [3581, 3583], [3582, 3584, 3674], [3583, 3585], [3521, 3584, 3586], [3585, 3587], [3586, 3588, 3675], [3587, 3589], [3522, 3588, 3590], [3589, 3591], [3590, 3592, 3676], [3591, 3593], [3523, 3592, 3594], [3593, 3595], [3594, 3596, 3677], [3595, 3597], [3524, 3596, 3598], [3597, 3599], [3598, 3600, 3678], [3599, 3601], [3525, 3600, 3602], [3601, 3603], [3602, 3604, 3679], [3603, 3605], [3526, 3604, 3606], [3605, 3607], [3606, 3608, 3680], [3607, 3609], [3527, 3608, 3610], [3609, 3611], [3610, 3612, 3681], [3611, 3613], [3528, 3612, 3614], [3613, 3615], [3614, 3616, 3682], [3615, 3617], [3529, 3616, 3618], [3617, 3619], [3618, 3620, 3683], [3619, 3621], [3530, 3620, 3622], [3621, 3623], [3622, 3624, 3684], [3623, 3625], [3531, 3624, 3626], [3625, 3627], [3626, 3628, 3685], [3627, 3629], [3532, 3628, 3630], [3629, 3631], [3630, 3632, 3686], [3631, 3633], [3533, 3632, 3634], [3633, 3635], [3634, 3636, 3687], [3635, 3637], [3534, 3636, 3638], [3637, 3639], [3638, 3640, 3688], [3639, 3641], [3535, 3640, 3642], [3641, 3643], [3642, 3644, 3689], [3643, 3645], [3536, 3644, 3646], [3645, 3647], [3646, 3648, 3690], [3647, 3649], [3537, 3648, 3650], [3649, 3651], [3650, 3652, 3691], [3651, 3653], [3538, 3652, 3654], [3653, 3655], [3654, 3656, 3692], [3655, 3657], [3539, 3656, 3658], [3657, 3659], [3658, 3660, 3693], [3659, 3661], [3540, 3660, 3662], [3661, 3663], [3662, 3694], [3543, 3697], [3547, 3701], [3551, 3705], [3555, 3709], [3559, 3713], [3563, 3717], [3567, 3721], [3571, 3725], [3575, 3729], [3579, 3733], [3583, 3737], [3587, 3741], [3591, 3745], [3595, 3749], [3599, 3753], [3603, 3757], [3607, 3761], [3611, 3765], [3615, 3769], [3619, 3773], [3623, 3777], [3627, 3781], [3631, 3785], [3635, 3789], [3639, 3793], [3643, 3797], [3647, 3801], [3651, 3805], [3655, 3809], [3659, 3813], [3663, 3817], [3696, 3818], [3695, 3697], [3664, 3696, 3698], [3697, 3699], [3698, 3700, 3819], [3699, 3701], [3665, 3700, 3702], [3701, 3703], [3702, 3704, 3820], [3703, 3705], [3666, 3704, 3706], [3705, 3707], [3706, 3708, 3821], [3707, 3709], [3667, 3708, 3710], [3709, 3711], [3710, 3712, 3822], [3711, 3713], [3668, 3712, 3714], [3713, 3715], [3714, 3716, 3823], [3715, 3717], [3669, 3716, 3718], [3717, 3719], [3718, 3720, 3824], [3719, 3721], [3670, 3720, 3722], [3721, 3723], [3722, 3724, 3825], [3723, 3725], [3671, 3724, 3726], [3725, 3727], [3726, 3728, 3826], [3727, 3729], [3672, 3728, 3730], [3729, 3731], [3730, 3732, 3827], [3731, 3733], [3673, 3732, 3734], [3733, 3735], [3734, 3736, 3828], [3735, 3737], [3674, 3736, 3738], [3737, 3739], [3738, 3740, 3829], [3739, 3741], [3675, 3740, 3742], [3741, 3743], [3742, 3744, 3830], [3743, 3745], [3676, 3744, 3746], [3745, 3747], [3746, 3748, 3831], [3747, 3749], [3677, 3748, 3750], [3749, 3751], [3750, 3752, 3832], [3751, 3753], [3678, 3752, 3754], [3753, 3755], [3754, 3756, 3833], [3755, 3757], [3679, 3756, 3758], [3757, 3759], [3758, 3760, 3834], [3759, 3761], [3680, 3760, 3762], [3761, 3763], [3762, 3764, 3835], [3763, 3765], [3681, 3764, 3766], [3765, 3767], [3766, 3768, 3836], [3767, 3769], [3682, 3768, 3770], [3769, 3771], [3770, 3772, 3837], [3771, 3773], [3683, 3772, 3774], [3773, 3775], [3774, 3776, 3838], [3775, 3777], [3684, 3776, 3778], [3777, 3779], [3778, 3780, 3839], [3779, 3781], [3685, 3780, 3782], [3781, 3783], [3782, 3784, 3840], [3783, 3785], [3686, 3784, 3786], [3785, 3787], [3786, 3788, 3841], [3787, 3789], [3687, 3788, 3790], [3789, 3791], [3790, 3792, 3842], [3791, 3793], [3688, 3792, 3794], [3793, 3795], [3794, 3796, 3843], [3795, 3797], [3689, 3796, 3798], [3797, 3799], [3798, 3800, 3844], [3799, 3801], [3690, 3800, 3802], [3801, 3803], [3802, 3804, 3845], [3803, 3805], [3691, 3804, 3806], [3805, 3807], [3806, 3808, 3846], [3807, 3809], [3692, 3808, 3810], [3809, 3811], [3810, 3812, 3847], [3811, 3813], [3693, 3812, 3814], [3813, 3815], [3814, 3816, 3848], [3815, 3817], [3694, 3816], [3695, 3849], [3699, 3853], [3703, 3857], [3707, 3861], [3711, 3865], [3715, 3869], [3719, 3873], [3723, 3877], [3727, 3881], [3731, 3885], [3735, 3889], [3739, 3893], [3743, 3897], [3747, 3901], [3751, 3905], [3755, 3909], [3759, 3913], [3763, 3917], [3767, 3921], [3771, 3925], [3775, 3929], [3779, 3933], [3783, 3937], [3787, 3941], [3791, 3945], [3795, 3949], [3799, 3953], [3803, 3957], [3807, 3961], [3811, 3965], [3815, 3969], [3818, 3850], [3849, 3851], [3850, 3852, 3972], [3851, 3853], [3819, 3852, 3854], [3853, 3855], [3854, 3856, 3973], [3855, 3857], [3820, 3856, 3858], [3857, 3859], [3858, 3860, 3974], [3859, 3861], [3821, 3860, 3862], [3861, 3863], [3862, 3864, 3975], [3863, 3865], [3822, 3864, 3866], [3865, 3867], [3866, 3868, 3976], [3867, 3869], [3823, 3868, 3870], [3869, 3871], [3870, 3872, 3977], [3871, 3873], [3824, 3872, 3874], [3873, 3875], [3874, 3876, 3978], [3875, 3877], [3825, 3876, 3878], [3877, 3879], [3878, 3880, 3979], [3879, 3881], [3826, 3880, 3882], [3881, 3883], [3882, 3884, 3980], [3883, 3885], [3827, 3884, 3886], [3885, 3887], [3886, 3888, 3981], [3887, 3889], [3828, 3888, 3890], [3889, 3891], [3890, 3892, 3982], [3891, 3893], [3829, 3892, 3894], [3893, 3895], [3894, 3896, 3983], [3895, 3897], [3830, 3896, 3898], [3897, 3899], [3898, 3900, 3984], [3899, 3901], [3831, 3900, 3902], [3901, 3903], [3902, 3904, 3985], [3903, 3905], [3832, 3904, 3906], [3905, 3907], [3906, 3908, 3986], [3907, 3909], [3833, 3908, 3910], [3909, 3911], [3910, 3912, 3987], [3911, 3913], [3834, 3912, 3914], [3913, 3915], [3914, 3916, 3988], [3915, 3917], [3835, 3916, 3918], [3917, 3919], [3918, 3920, 3989], [3919, 3921], [3836, 3920, 3922], [3921, 3923], [3922, 3924, 3990], [3923, 3925], [3837, 3924, 3926], [3925, 3927], [3926, 3928, 3991], [3927, 3929], [3838, 3928, 3930], [3929, 3931], [3930, 3932, 3992], [3931, 3933], [3839, 3932, 3934], [3933, 3935], [3934, 3936, 3993], [3935, 3937], [3840, 3936, 3938], [3937, 3939], [3938, 3940, 3994], [3939, 3941], [3841, 3940, 3942], [3941, 3943], [3942, 3944, 3995], [3943, 3945], [3842, 3944, 3946], [3945, 3947], [3946, 3948, 3996], [3947, 3949], [3843, 3948, 3950], [3949, 3951], [3950, 3952, 3997], [3951, 3953], [3844, 3952, 3954], [3953, 3955], [3954, 3956, 3998], [3955, 3957], [3845, 3956, 3958], [3957, 3959], [3958, 3960, 3999], [3959, 3961], [3846, 3960, 3962], [3961, 3963], [3962, 3964, 4000], [3963, 3965], [3847, 3964, 3966], [3965, 3967], [3966, 3968, 4001], [3967, 3969], [3848, 3968, 3970], [3969, 3971], [3970, 4002], [3851, 4005], [3855, 4009], [3859, 4013], [3863, 4017], [3867, 4021], [3871, 4025], [3875, 4029], [3879, 4033], [3883, 4037], [3887, 4041], [3891, 4045], [3895, 4049], [3899, 4053], [3903, 4057], [3907, 4061], [3911, 4065], [3915, 4069], [3919, 4073], [3923, 4077], [3927, 4081], [3931, 4085], [3935, 4089], [3939, 4093], [3943, 4097], [3947, 4101], [3951, 4105], [3955, 4109], [3959, 4113], [3963, 4117], [3967, 4121], [3971, 4125], [4004, 4126], [4003, 4005], [3972, 4004, 4006], [4005, 4007], [4006, 4008, 4127], [4007, 4009], [3973, 4008, 4010], [4009, 4011], [4010, 4012, 4128], [4011, 4013], [3974, 4012, 4014], [4013, 4015], [4014, 4016, 4129], [4015, 4017], [3975, 4016, 4018], [4017, 4019], [4018, 4020, 4130], [4019, 4021], [3976, 4020, 4022], [4021, 4023], [4022, 4024, 4131], [4023, 4025], [3977, 4024, 4026], [4025, 4027], [4026, 4028, 4132], [4027, 4029], [3978, 4028, 4030], [4029, 4031], [4030, 4032, 4133], [4031, 4033], [3979, 4032, 4034], [4033, 4035], [4034, 4036, 4134], [4035, 4037], [3980, 4036, 4038], [4037, 4039], [4038, 4040, 4135], [4039, 4041], [3981, 4040, 4042], [4041, 4043], [4042, 4044, 4136], [4043, 4045], [3982, 4044, 4046], [4045, 4047], [4046, 4048, 4137], [4047, 4049], [3983, 4048, 4050], [4049, 4051], [4050, 4052, 4138], [4051, 4053], [3984, 4052, 4054], [4053, 4055], [4054, 4056, 4139], [4055, 4057], [3985, 4056, 4058], [4057, 4059], [4058, 4060, 4140], [4059, 4061], [3986, 4060, 4062], [4061, 4063], [4062, 4064, 4141], [4063, 4065], [3987, 4064, 4066], [4065, 4067], [4066, 4068, 4142], [4067, 4069], [3988, 4068, 4070], [4069, 4071], [4070, 4072, 4143], [4071, 4073], [3989, 4072, 4074], [4073, 4075], [4074, 4076, 4144], [4075, 4077], [3990, 4076, 4078], [4077, 4079], [4078, 4080, 4145], [4079, 4081], [3991, 4080, 4082], [4081, 4083], [4082, 4084, 4146], [4083, 4085], [3992, 4084, 4086], [4085, 4087], [4086, 4088, 4147], [4087, 4089], [3993, 4088, 4090], [4089, 4091], [4090, 4092, 4148], [4091, 4093], [3994, 4092, 4094], [4093, 4095], [4094, 4096, 4149], [4095, 4097], [3995, 4096, 4098], [4097, 4099], [4098, 4100, 4150], [4099, 4101], [3996, 4100, 4102], [4101, 4103], [4102, 4104, 4151], [4103, 4105], [3997, 4104, 4106], [4105, 4107], [4106, 4108, 4152], [4107, 4109], [3998, 4108, 4110], [4109, 4111], [4110, 4112, 4153], [4111, 4113], [3999, 4112, 4114], [4113, 4115], [4114, 4116, 4154], [4115, 4117], [4000, 4116, 4118], [4117, 4119], [4118, 4120, 4155], [4119, 4121], [4001, 4120, 4122], [4121, 4123], [4122, 4124, 4156], [4123, 4125], [4002, 4124], [4003, 4157], [4007, 4161], [4011, 4165], [4015, 4169], [4019, 4173], [4023, 4177], [4027, 4181], [4031, 4185], [4035, 4189], [4039, 4193], [4043, 4197], [4047, 4201], [4051, 4205], [4055, 4209], [4059, 4213], [4063, 4217], [4067, 4221], [4071, 4225], [4075, 4229], [4079, 4233], [4083, 4237], [4087, 4241], [4091, 4245], [4095, 4249], [4099, 4253], [4103, 4257], [4107, 4261], [4111, 4265], [4115, 4269], [4119, 4273], [4123, 4277], [4126, 4158], [4157, 4159], [4158, 4160, 4280], [4159, 4161], [4127, 4160, 4162], [4161, 4163], [4162, 4164, 4281], [4163, 4165], [4128, 4164, 4166], [4165, 4167], [4166, 4168, 4282], [4167, 4169], [4129, 4168, 4170], [4169, 4171], [4170, 4172, 4283], [4171, 4173], [4130, 4172, 4174], [4173, 4175], [4174, 4176, 4284], [4175, 4177], [4131, 4176, 4178], [4177, 4179], [4178, 4180, 4285], [4179, 4181], [4132, 4180, 4182], [4181, 4183], [4182, 4184, 4286], [4183, 4185], [4133, 4184, 4186], [4185, 4187], [4186, 4188, 4287], [4187, 4189], [4134, 4188, 4190], [4189, 4191], [4190, 4192, 4288], [4191, 4193], [4135, 4192, 4194], [4193, 4195], [4194, 4196, 4289], [4195, 4197], [4136, 4196, 4198], [4197, 4199], [4198, 4200, 4290], [4199, 4201], [4137, 4200, 4202], [4201, 4203], [4202, 4204, 4291], [4203, 4205], [4138, 4204, 4206], [4205, 4207], [4206, 4208, 4292], [4207, 4209], [4139, 4208, 4210], [4209, 4211], [4210, 4212, 4293], [4211, 4213], [4140, 4212, 4214], [4213, 4215], [4214, 4216, 4294], [4215, 4217], [4141, 4216, 4218], [4217, 4219], [4218, 4220, 4295], [4219, 4221], [4142, 4220, 4222], [4221, 4223], [4222, 4224, 4296], [4223, 4225], [4143, 4224, 4226], [4225, 4227], [4226, 4228, 4297], [4227, 4229], [4144, 4228, 4230], [4229, 4231], [4230, 4232, 4298], [4231, 4233], [4145, 4232, 4234], [4233, 4235], [4234, 4236, 4299], [4235, 4237], [4146, 4236, 4238], [4237, 4239], [4238, 4240, 4300], [4239, 4241], [4147, 4240, 4242], [4241, 4243], [4242, 4244, 4301], [4243, 4245], [4148, 4244, 4246], [4245, 4247], [4246, 4248, 4302], [4247, 4249], [4149, 4248, 4250], [4249, 4251], [4250, 4252, 4303], [4251, 4253], [4150, 4252, 4254], [4253, 4255], [4254, 4256, 4304], [4255, 4257], [4151, 4256, 4258], [4257, 4259], [4258, 4260, 4305], [4259, 4261], [4152, 4260, 4262], [4261, 4263], [4262, 4264, 4306], [4263, 4265], [4153, 4264, 4266], [4265, 4267], [4266, 4268, 4307], [4267, 4269], [4154, 4268, 4270], [4269, 4271], [4270, 4272, 4308], [4271, 4273], [4155, 4272, 4274], [4273, 4275], [4274, 4276, 4309], [4275, 4277], [4156, 4276, 4278], [4277, 4279], [4278, 4310], [4159, 4313], [4163, 4317], [4167, 4321], [4171, 4325], [4175, 4329], [4179, 4333], [4183, 4337], [4187, 4341], [4191, 4345], [4195, 4349], [4199, 4353], [4203, 4357], [4207, 4361], [4211, 4365], [4215, 4369], [4219, 4373], [4223, 4377], [4227, 4381], [4231, 4385], [4235, 4389], [4239, 4393], [4243, 4397], [4247, 4401], [4251, 4405], [4255, 4409], [4259, 4413], [4263, 4417], [4267, 4421], [4271, 4425], [4275, 4429], [4279, 4433], [4312, 4434], [4311, 4313], [4280, 4312, 4314], [4313, 4315], [4314, 4316, 4435], [4315, 4317], [4281, 4316, 4318], [4317, 4319], [4318, 4320, 4436], [4319, 4321], [4282, 4320, 4322], [4321, 4323], [4322, 4324, 4437], [4323, 4325], [4283, 4324, 4326], [4325, 4327], [4326, 4328, 4438], [4327, 4329], [4284, 4328, 4330], [4329, 4331], [4330, 4332, 4439], [4331, 4333], [4285, 4332, 4334], [4333, 4335], [4334, 4336, 4440], [4335, 4337], [4286, 4336, 4338], [4337, 4339], [4338, 4340, 4441], [4339, 4341], [4287, 4340, 4342], [4341, 4343], [4342, 4344, 4442], [4343, 4345], [4288, 4344, 4346], [4345, 4347], [4346, 4348, 4443], [4347, 4349], [4289, 4348, 4350], [4349, 4351], [4350, 4352, 4444], [4351, 4353], [4290, 4352, 4354], [4353, 4355], [4354, 4356, 4445], [4355, 4357], [4291, 4356, 4358], [4357, 4359], [4358, 4360, 4446], [4359, 4361], [4292, 4360, 4362], [4361, 4363], [4362, 4364, 4447], [4363, 4365], [4293, 4364, 4366], [4365, 4367], [4366, 4368, 4448], [4367, 4369], [4294, 4368, 4370], [4369, 4371], [4370, 4372, 4449], [4371, 4373], [4295, 4372, 4374], [4373, 4375], [4374, 4376, 4450], [4375, 4377], [4296, 4376, 4378], [4377, 4379], [4378, 4380, 4451], [4379, 4381], [4297, 4380, 4382], [4381, 4383], [4382, 4384, 4452], [4383, 4385], [4298, 4384, 4386], [4385, 4387], [4386, 4388, 4453], [4387, 4389], [4299, 4388, 4390], [4389, 4391], [4390, 4392, 4454], [4391, 4393], [4300, 4392, 4394], [4393, 4395], [4394, 4396, 4455], [4395, 4397], [4301, 4396, 4398], [4397, 4399], [4398, 4400, 4456], [4399, 4401], [4302, 4400, 4402], [4401, 4403], [4402, 4404, 4457], [4403, 4405], [4303, 4404, 4406], [4405, 4407], [4406, 4408, 4458], [4407, 4409], [4304, 4408, 4410], [4409, 4411], [4410, 4412, 4459], [4411, 4413], [4305, 4412, 4414], [4413, 4415], [4414, 4416, 4460], [4415, 4417], [4306, 4416, 4418], [4417, 4419], [4418, 4420, 4461], [4419, 4421], [4307, 4420, 4422], [4421, 4423], [4422, 4424, 4462], [4423, 4425], [4308, 4424, 4426], [4425, 4427], [4426, 4428, 4463], [4427, 4429], [4309, 4428, 4430], [4429, 4431], [4430, 4432, 4464], [4431, 4433], [4310, 4432], [4311, 4465], [4315, 4469], [4319, 4473], [4323, 4477], [4327, 4481], [4331, 4485], [4335, 4489], [4339, 4493], [4343, 4497], [4347, 4501], [4351, 4505], [4355, 4509], [4359, 4513], [4363, 4517], [4367, 4521], [4371, 4525], [4375, 4529], [4379, 4533], [4383, 4537], [4387, 4541], [4391, 4545], [4395, 4549], [4399, 4553], [4403, 4557], [4407, 4561], [4411, 4565], [4415, 4569], [4419, 4573], [4423, 4577], [4427, 4581], [4431, 4585], [4434, 4466], [4465, 4467], [4466, 4468, 4588], [4467, 4469], [4435, 4468, 4470], [4469, 4471], [4470, 4472, 4589], [4471, 4473], [4436, 4472, 4474], [4473, 4475], [4474, 4476, 4590], [4475, 4477], [4437, 4476, 4478], [4477, 4479], [4478, 4480, 4591], [4479, 4481], [4438, 4480, 4482], [4481, 4483], [4482, 4484, 4592], [4483, 4485], [4439, 4484, 4486], [4485, 4487], [4486, 4488, 4593], [4487, 4489], [4440, 4488, 4490], [4489, 4491], [4490, 4492, 4594], [4491, 4493], [4441, 4492, 4494], [4493, 4495], [4494, 4496, 4595], [4495, 4497], [4442, 4496, 4498], [4497, 4499], [4498, 4500, 4596], [4499, 4501], [4443, 4500, 4502], [4501, 4503], [4502, 4504, 4597], [4503, 4505], [4444, 4504, 4506], [4505, 4507], [4506, 4508, 4598], [4507, 4509], [4445, 4508, 4510], [4509, 4511], [4510, 4512, 4599], [4511, 4513], [4446, 4512, 4514], [4513, 4515], [4514, 4516, 4600], [4515, 4517], [4447, 4516, 4518], [4517, 4519], [4518, 4520, 4601], [4519, 4521], [4448, 4520, 4522], [4521, 4523], [4522, 4524, 4602], [4523, 4525], [4449, 4524, 4526], [4525, 4527], [4526, 4528, 4603], [4527, 4529], [4450, 4528, 4530], [4529, 4531], [4530, 4532, 4604], [4531, 4533], [4451, 4532, 4534], [4533, 4535], [4534, 4536, 4605], [4535, 4537], [4452, 4536, 4538], [4537, 4539], [4538, 4540, 4606], [4539, 4541], [4453, 4540, 4542], [4541, 4543], [4542, 4544, 4607], [4543, 4545], [4454, 4544, 4546], [4545, 4547], [4546, 4548, 4608], [4547, 4549], [4455, 4548, 4550], [4549, 4551], [4550, 4552, 4609], [4551, 4553], [4456, 4552, 4554], [4553, 4555], [4554, 4556, 4610], [4555, 4557], [4457, 4556, 4558], [4557, 4559], [4558, 4560, 4611], [4559, 4561], [4458, 4560, 4562], [4561, 4563], [4562, 4564, 4612], [4563, 4565], [4459, 4564, 4566], [4565, 4567], [4566, 4568, 4613], [4567, 4569], [4460, 4568, 4570], [4569, 4571], [4570, 4572, 4614], [4571, 4573], [4461, 4572, 4574], [4573, 4575], [4574, 4576, 4615], [4575, 4577], [4462, 4576, 4578], [4577, 4579], [4578, 4580, 4616], [4579, 4581], [4463, 4580, 4582], [4581, 4583], [4582, 4584, 4617], [4583, 4585], [4464, 4584, 4586], [4585, 4587], [4586, 4618], [4467, 4621], [4471, 4625], [4475, 4629], [4479, 4633], [4483, 4637], [4487, 4641], [4491, 4645], [4495, 4649], [4499, 4653], [4503, 4657], [4507, 4661], [4511, 4665], [4515, 4669], [4519, 4673], [4523, 4677], [4527, 4681], [4531, 4685], [4535, 4689], [4539, 4693], [4543, 4697], [4547, 4701], [4551, 4705], [4555, 4709], [4559, 4713], [4563, 4717], [4567, 4721], [4571, 4725], [4575, 4729], [4579, 4733], [4583, 4737], [4587, 4741], [4620, 4742], [4619, 4621], [4588, 4620, 4622], [4621, 4623], [4622, 4624, 4743], [4623, 4625], [4589, 4624, 4626], [4625, 4627], [4626, 4628, 4744], [4627, 4629], [4590, 4628, 4630], [4629, 4631], [4630, 4632, 4745], [4631, 4633], [4591, 4632, 4634], [4633, 4635], [4634, 4636, 4746], [4635, 4637], [4592, 4636, 4638], [4637, 4639], [4638, 4640, 4747], [4639, 4641], [4593, 4640, 4642], [4641, 4643], [4642, 4644, 4748], [4643, 4645], [4594, 4644, 4646], [4645, 4647], [4646, 4648, 4749], [4647, 4649], [4595, 4648, 4650], [4649, 4651], [4650, 4652, 4750], [4651, 4653], [4596, 4652, 4654], [4653, 4655], [4654, 4656, 4751], [4655, 4657], [4597, 4656, 4658], [4657, 4659], [4658, 4660, 4752], [4659, 4661], [4598, 4660, 4662], [4661, 4663], [4662, 4664, 4753], [4663, 4665], [4599, 4664, 4666], [4665, 4667], [4666, 4668, 4754], [4667, 4669], [4600, 4668, 4670], [4669, 4671], [4670, 4672, 4755], [4671, 4673], [4601, 4672, 4674], [4673, 4675], [4674, 4676, 4756], [4675, 4677], [4602, 4676, 4678], [4677, 4679], [4678, 4680, 4757], [4679, 4681], [4603, 4680, 4682], [4681, 4683], [4682, 4684, 4758], [4683, 4685], [4604, 4684, 4686], [4685, 4687], [4686, 4688, 4759], [4687, 4689], [4605, 4688, 4690], [4689, 4691], [4690, 4692, 4760], [4691, 4693], [4606, 4692, 4694], [4693, 4695], [4694, 4696, 4761], [4695, 4697], [4607, 4696, 4698], [4697, 4699], [4698, 4700, 4762], [4699, 4701], [4608, 4700, 4702], [4701, 4703], [4702, 4704, 4763], [4703, 4705], [4609, 4704, 4706], [4705, 4707], [4706, 4708, 4764], [4707, 4709], [4610, 4708, 4710], [4709, 4711], [4710, 4712, 4765], [4711, 4713], [4611, 4712, 4714], [4713, 4715], [4714, 4716, 4766], [4715, 4717], [4612, 4716, 4718], [4717, 4719], [4718, 4720, 4767], [4719, 4721], [4613, 4720, 4722], [4721, 4723], [4722, 4724, 4768], [4723, 4725], [4614, 4724, 4726], [4725, 4727], [4726, 4728, 4769], [4727, 4729], [4615, 4728, 4730], [4729, 4731], [4730, 4732, 4770], [4731, 4733], [4616, 4732, 4734], [4733, 4735], [4734, 4736, 4771], [4735, 4737], [4617, 4736, 4738], [4737, 4739], [4738, 4740, 4772], [4739, 4741], [4618, 4740], [4619, 4773], [4623, 4777], [4627, 4781], [4631, 4785], [4635, 4789], [4639, 4793], [4643, 4797], [4647, 4801], [4651, 4805], [4655, 4809], [4659, 4813], [4663, 4817], [4667, 4821], [4671, 4825], [4675, 4829], [4679, 4833], [4683, 4837], [4687, 4841], [4691, 4845], [4695, 4849], [4699, 4853], [4703, 4857], [4707, 4861], [4711, 4865], [4715, 4869], [4719, 4873], [4723, 4877], [4727, 4881], [4731, 4885], [4735, 4889], [4739, 4893], [4742, 4774], [4773, 4775], [4774, 4776, 4896], [4775, 4777], [4743, 4776, 4778], [4777, 4779], [4778, 4780, 4897], [4779, 4781], [4744, 4780, 4782], [4781, 4783], [4782, 4784, 4898], [4783, 4785], [4745, 4784, 4786], [4785, 4787], [4786, 4788, 4899], [4787, 4789], [4746, 4788, 4790], [4789, 4791], [4790, 4792, 4900], [4791, 4793], [4747, 4792, 4794], [4793, 4795], [4794, 4796, 4901], [4795, 4797], [4748, 4796, 4798], [4797, 4799], [4798, 4800, 4902], [4799, 4801], [4749, 4800, 4802], [4801, 4803], [4802, 4804, 4903], [4803, 4805], [4750, 4804, 4806], [4805, 4807], [4806, 4808, 4904], [4807, 4809], [4751, 4808, 4810], [4809, 4811], [4810, 4812, 4905], [4811, 4813], [4752, 4812, 4814], [4813, 4815], [4814, 4816, 4906], [4815, 4817], [4753, 4816, 4818], [4817, 4819], [4818, 4820, 4907], [4819, 4821], [4754, 4820, 4822], [4821, 4823], [4822, 4824, 4908], [4823, 4825], [4755, 4824, 4826], [4825, 4827], [4826, 4828, 4909], [4827, 4829], [4756, 4828, 4830], [4829, 4831], [4830, 4832, 4910], [4831, 4833], [4757, 4832, 4834], [4833, 4835], [4834, 4836, 4911], [4835, 4837], [4758, 4836, 4838], [4837, 4839], [4838, 4840, 4912], [4839, 4841], [4759, 4840, 4842], [4841, 4843], [4842, 4844, 4913], [4843, 4845], [4760, 4844, 4846], [4845, 4847], [4846, 4848, 4914], [4847, 4849], [4761, 4848, 4850], [4849, 4851], [4850, 4852, 4915], [4851, 4853], [4762, 4852, 4854], [4853, 4855], [4854, 4856, 4916], [4855, 4857], [4763, 4856, 4858], [4857, 4859], [4858, 4860, 4917], [4859, 4861], [4764, 4860, 4862], [4861, 4863], [4862, 4864, 4918], [4863, 4865], [4765, 4864, 4866], [4865, 4867], [4866, 4868, 4919], [4867, 4869], [4766, 4868, 4870], [4869, 4871], [4870, 4872, 4920], [4871, 4873], [4767, 4872, 4874], [4873, 4875], [4874, 4876, 4921], [4875, 4877], [4768, 4876, 4878], [4877, 4879], [4878, 4880, 4922], [4879, 4881], [4769, 4880, 4882], [4881, 4883], [4882, 4884, 4923], [4883, 4885], [4770, 4884, 4886], [4885, 4887], [4886, 4888, 4924], [4887, 4889], [4771, 4888, 4890], [4889, 4891], [4890, 4892, 4925], [4891, 4893], [4772, 4892, 4894], [4893, 4895], [4894, 4926], [4775, 4929], [4779, 4933], [4783, 4937], [4787, 4941], [4791, 4945], [4795, 4949], [4799, 4953], [4803, 4957], [4807, 4961], [4811, 4965], [4815, 4969], [4819, 4973], [4823, 4977], [4827, 4981], [4831, 4985], [4835, 4989], [4839, 4993], [4843, 4997], [4847, 5001], [4851, 5005], [4855, 5009], [4859, 5013], [4863, 5017], [4867, 5021], [4871, 5025], [4875, 5029], [4879, 5033], [4883, 5037], [4887, 5041], [4891, 5045], [4895, 5049], [4928, 5050], [4927, 4929], [4896, 4928, 4930], [4929, 4931], [4930, 4932, 5051], [4931, 4933], [4897, 4932, 4934], [4933, 4935], [4934, 4936, 5052], [4935, 4937], [4898, 4936, 4938], [4937, 4939], [4938, 4940, 5053], [4939, 4941], [4899, 4940, 4942], [4941, 4943], [4942, 4944, 5054], [4943, 4945], [4900, 4944, 4946], [4945, 4947], [4946, 4948, 5055], [4947, 4949], [4901, 4948, 4950], [4949, 4951], [4950, 4952, 5056], [4951, 4953], [4902, 4952, 4954], [4953, 4955], [4954, 4956, 5057], [4955, 4957], [4903, 4956, 4958], [4957, 4959], [4958, 4960, 5058], [4959, 4961], [4904, 4960, 4962], [4961, 4963], [4962, 4964, 5059], [4963, 4965], [4905, 4964, 4966], [4965, 4967], [4966, 4968, 5060], [4967, 4969], [4906, 4968, 4970], [4969, 4971], [4970, 4972, 5061], [4971, 4973], [4907, 4972, 4974], [4973, 4975], [4974, 4976, 5062], [4975, 4977], [4908, 4976, 4978], [4977, 4979], [4978, 4980, 5063], [4979, 4981], [4909, 4980, 4982], [4981, 4983], [4982, 4984, 5064], [4983, 4985], [4910, 4984, 4986], [4985, 4987], [4986, 4988, 5065], [4987, 4989], [4911, 4988, 4990], [4989, 4991], [4990, 4992, 5066], [4991, 4993], [4912, 4992, 4994], [4993, 4995], [4994, 4996, 5067], [4995, 4997], [4913, 4996, 4998], [4997, 4999], [4998, 5000, 5068], [4999, 5001], [4914, 5000, 5002], [5001, 5003], [5002, 5004, 5069], [5003, 5005], [4915, 5004, 5006], [5005, 5007], [5006, 5008, 5070], [5007, 5009], [4916, 5008, 5010], [5009, 5011], [5010, 5012, 5071], [5011, 5013], [4917, 5012, 5014], [5013, 5015], [5014, 5016, 5072], [5015, 5017], [4918, 5016, 5018], [5017, 5019], [5018, 5020, 5073], [5019, 5021], [4919, 5020, 5022], [5021, 5023], [5022, 5024, 5074], [5023, 5025], [4920, 5024, 5026], [5025, 5027], [5026, 5028, 5075], [5027, 5029], [4921, 5028, 5030], [5029, 5031], [5030, 5032, 5076], [5031, 5033], [4922, 5032, 5034], [5033, 5035], [5034, 5036, 5077], [5035, 5037], [4923, 5036, 5038], [5037, 5039], [5038, 5040, 5078], [5039, 5041], [4924, 5040, 5042], [5041, 5043], [5042, 5044, 5079], [5043, 5045], [4925, 5044, 5046], [5045, 5047], [5046, 5048, 5080], [5047, 5049], [4926, 5048], [4927, 5081], [4931, 5085], [4935, 5089], [4939, 5093], [4943, 5097], [4947, 5101], [4951, 5105], [4955, 5109], [4959, 5113], [4963, 5117], [4967, 5121], [4971, 5125], [4975, 5129], [4979, 5133], [4983, 5137], [4987, 5141], [4991, 5145], [4995, 5149], [4999, 5153], [5003, 5157], [5007, 5161], [5011, 5165], [5015, 5169], [5019, 5173], [5023, 5177], [5027, 5181], [5031, 5185], [5035, 5189], [5039, 5193], [5043, 5197], [5047, 5201], [5050, 5082], [5081, 5083], [5082, 5084, 5204], [5083, 5085], [5051, 5084, 5086], [5085, 5087], [5086, 5088, 5205], [5087, 5089], [5052, 5088, 5090], [5089, 5091], [5090, 5092, 5206], [5091, 5093], [5053, 5092, 5094], [5093, 5095], [5094, 5096, 5207], [5095, 5097], [5054, 5096, 5098], [5097, 5099], [5098, 5100, 5208], [5099, 5101], [5055, 5100, 5102], [5101, 5103], [5102, 5104, 5209], [5103, 5105], [5056, 5104, 5106], [5105, 5107], [5106, 5108, 5210], [5107, 5109], [5057, 5108, 5110], [5109, 5111], [5110, 5112, 5211], [5111, 5113], [5058, 5112, 5114], [5113, 5115], [5114, 5116, 5212], [5115, 5117], [5059, 5116, 5118], [5117, 5119], [5118, 5120, 5213], [5119, 5121], [5060, 5120, 5122], [5121, 5123], [5122, 5124, 5214], [5123, 5125], [5061, 5124, 5126], [5125, 5127], [5126, 5128, 5215], [5127, 5129], [5062, 5128, 5130], [5129, 5131], [5130, 5132, 5216], [5131, 5133], [5063, 5132, 5134], [5133, 5135], [5134, 5136, 5217], [5135, 5137], [5064, 5136, 5138], [5137, 5139], [5138, 5140, 5218], [5139, 5141], [5065, 5140, 5142], [5141, 5143], [5142, 5144, 5219], [5143, 5145], [5066, 5144, 5146], [5145, 5147], [5146, 5148, 5220], [5147, 5149], [5067, 5148, 5150], [5149, 5151], [5150, 5152, 5221], [5151, 5153], [5068, 5152, 5154], [5153, 5155], [5154, 5156, 5222], [5155, 5157], [5069, 5156, 5158], [5157, 5159], [5158, 5160, 5223], [5159, 5161], [5070, 5160, 5162], [5161, 5163], [5162, 5164, 5224], [5163, 5165], [5071, 5164, 5166], [5165, 5167], [5166, 5168, 5225], [5167, 5169], [5072, 5168, 5170], [5169, 5171], [5170, 5172, 5226], [5171, 5173], [5073, 5172, 5174], [5173, 5175], [5174, 5176, 5227], [5175, 5177], [5074, 5176, 5178], [5177, 5179], [5178, 5180, 5228], [5179, 5181], [5075, 5180, 5182], [5181, 5183], [5182, 5184, 5229], [5183, 5185], [5076, 5184, 5186], [5185, 5187], [5186, 5188, 5230], [5187, 5189], [5077, 5188, 5190], [5189, 5191], [5190, 5192, 5231], [5191, 5193], [5078, 5192, 5194], [5193, 5195], [5194, 5196, 5232], [5195, 5197], [5079, 5196, 5198], [5197, 5199], [5198, 5200, 5233], [5199, 5201], [5080, 5200, 5202], [5201, 5203], [5202, 5234], [5083, 5237], [5087, 5241], [5091, 5245], [5095, 5249], [5099, 5253], [5103, 5257], [5107, 5261], [5111, 5265], [5115, 5269], [5119, 5273], [5123, 5277], [5127, 5281], [5131, 5285], [5135, 5289], [5139, 5293], [5143, 5297], [5147, 5301], [5151, 5305], [5155, 5309], [5159, 5313], [5163, 5317], [5167, 5321], [5171, 5325], [5175, 5329], [5179, 5333], [5183, 5337], [5187, 5341], [5191, 5345], [5195, 5349], [5199, 5353], [5203, 5357], [5236, 5358], [5235, 5237], [5204, 5236, 5238], [5237, 5239], [5238, 5240, 5359], [5239, 5241], [5205, 5240, 5242], [5241, 5243], [5242, 5244, 5360], [5243, 5245], [5206, 5244, 5246], [5245, 5247], [5246, 5248, 5361], [5247, 5249], [5207, 5248, 5250], [5249, 5251], [5250, 5252, 5362], [5251, 5253], [5208, 5252, 5254], [5253, 5255], [5254, 5256, 5363], [5255, 5257], [5209, 5256, 5258], [5257, 5259], [5258, 5260, 5364], [5259, 5261], [5210, 5260, 5262], [5261, 5263], [5262, 5264, 5365], [5263, 5265], [5211, 5264, 5266], [5265, 5267], [5266, 5268, 5366], [5267, 5269], [5212, 5268, 5270], [5269, 5271], [5270, 5272, 5367], [5271, 5273], [5213, 5272, 5274], [5273, 5275], [5274, 5276, 5368], [5275, 5277], [5214, 5276, 5278], [5277, 5279], [5278, 5280, 5369], [5279, 5281], [5215, 5280, 5282], [5281, 5283], [5282, 5284, 5370], [5283, 5285], [5216, 5284, 5286], [5285, 5287], [5286, 5288, 5371], [5287, 5289], [5217, 5288, 5290], [5289, 5291], [5290, 5292, 5372], [5291, 5293], [5218, 5292, 5294], [5293, 5295], [5294, 5296, 5373], [5295, 5297], [5219, 5296, 5298], [5297, 5299], [5298, 5300, 5374], [5299, 5301], [5220, 5300, 5302], [5301, 5303], [5302, 5304, 5375], [5303, 5305], [5221, 5304, 5306], [5305, 5307], [5306, 5308, 5376], [5307, 5309], [5222, 5308, 5310], [5309, 5311], [5310, 5312, 5377], [5311, 5313], [5223, 5312, 5314], [5313, 5315], [5314, 5316, 5378], [5315, 5317], [5224, 5316, 5318], [5317, 5319], [5318, 5320, 5379], [5319, 5321], [5225, 5320, 5322], [5321, 5323], [5322, 5324, 5380], [5323, 5325], [5226, 5324, 5326], [5325, 5327], [5326, 5328, 5381], [5327, 5329], [5227, 5328, 5330], [5329, 5331], [5330, 5332, 5382], [5331, 5333], [5228, 5332, 5334], [5333, 5335], [5334, 5336, 5383], [5335, 5337], [5229, 5336, 5338], [5337, 5339], [5338, 5340, 5384], [5339, 5341], [5230, 5340, 5342], [5341, 5343], [5342, 5344, 5385], [5343, 5345], [5231, 5344, 5346], [5345, 5347], [5346, 5348, 5386], [5347, 5349], [5232, 5348, 5350], [5349, 5351], [5350, 5352, 5387], [5351, 5353], [5233, 5352, 5354], [5353, 5355], [5354, 5356, 5388], [5355, 5357], [5234, 5356], [5235, 5389], [5239, 5393], [5243, 5397], [5247, 5401], [5251, 5405], [5255, 5409], [5259, 5413], [5263, 5417], [5267, 5421], [5271, 5425], [5275, 5429], [5279, 5433], [5283, 5437], [5287, 5441], [5291, 5445], [5295, 5449], [5299, 5453], [5303, 5457], [5307, 5461], [5311, 5465], [5315, 5469], [5319, 5473], [5323, 5477], [5327, 5481], [5331, 5485], [5335, 5489], [5339, 5493], [5343, 5497], [5347, 5501], [5351, 5505], [5355, 5509], [5358, 5390], [5389, 5391], [5390, 5392, 5512], [5391, 5393], [5359, 5392, 5394], [5393, 5395], [5394, 5396, 5513], [5395, 5397], [5360, 5396, 5398], [5397, 5399], [5398, 5400, 5514], [5399, 5401], [5361, 5400, 5402], [5401, 5403], [5402, 5404, 5515], [5403, 5405], [5362, 5404, 5406], [5405, 5407], [5406, 5408, 5516], [5407, 5409], [5363, 5408, 5410], [5409, 5411], [5410, 5412, 5517], [5411, 5413], [5364, 5412, 5414], [5413, 5415], [5414, 5416, 5518], [5415, 5417], [5365, 5416, 5418], [5417, 5419], [5418, 5420, 5519], [5419, 5421], [5366, 5420, 5422], [5421, 5423], [5422, 5424, 5520], [5423, 5425], [5367, 5424, 5426], [5425, 5427], [5426, 5428, 5521], [5427, 5429], [5368, 5428, 5430], [5429, 5431], [5430, 5432, 5522], [5431, 5433], [5369, 5432, 5434], [5433, 5435], [5434, 5436, 5523], [5435, 5437], [5370, 5436, 5438], [5437, 5439], [5438, 5440, 5524], [5439, 5441], [5371, 5440, 5442], [5441, 5443], [5442, 5444, 5525], [5443, 5445], [5372, 5444, 5446], [5445, 5447], [5446, 5448, 5526], [5447, 5449], [5373, 5448, 5450], [5449, 5451], [5450, 5452, 5527], [5451, 5453], [5374, 5452, 5454], [5453, 5455], [5454, 5456, 5528], [5455, 5457], [5375, 5456, 5458], [5457, 5459], [5458, 5460, 5529], [5459, 5461], [5376, 5460, 5462], [5461, 5463], [5462, 5464, 5530], [5463, 5465], [5377, 5464, 5466], [5465, 5467], [5466, 5468, 5531], [5467, 5469], [5378, 5468, 5470], [5469, 5471], [5470, 5472, 5532], [5471, 5473], [5379, 5472, 5474], [5473, 5475], [5474, 5476, 5533], [5475, 5477], [5380, 5476, 5478], [5477, 5479], [5478, 5480, 5534], [5479, 5481], [5381, 5480, 5482], [5481, 5483], [5482, 5484, 5535], [5483, 5485], [5382, 5484, 5486], [5485, 5487], [5486, 5488, 5536], [5487, 5489], [5383, 5488, 5490], [5489, 5491], [5490, 5492, 5537], [5491, 5493], [5384, 5492, 5494], [5493, 5495], [5494, 5496, 5538], [5495, 5497], [5385, 5496, 5498], [5497, 5499], [5498, 5500, 5539], [5499, 5501], [5386, 5500, 5502], [5501, 5503], [5502, 5504, 5540], [5503, 5505], [5387, 5504, 5506], [5505, 5507], [5506, 5508, 5541], [5507, 5509], [5388, 5508, 5510], [5509, 5511], [5510, 5542], [5391, 5545], [5395, 5549], [5399, 5553], [5403, 5557], [5407, 5561], [5411, 5565], [5415, 5569], [5419, 5573], [5423, 5577], [5427, 5581], [5431, 5585], [5435, 5589], [5439, 5593], [5443, 5597], [5447, 5601], [5451, 5605], [5455, 5609], [5459, 5613], [5463, 5617], [5467, 5621], [5471, 5625], [5475, 5629], [5479, 5633], [5483, 5637], [5487, 5641], [5491, 5645], [5495, 5649], [5499, 5653], [5503, 5657], [5507, 5661], [5511, 5665], [5544, 5666], [5543, 5545], [5512, 5544, 5546], [5545, 5547], [5546, 5548, 5667], [5547, 5549], [5513, 5548, 5550], [5549, 5551], [5550, 5552, 5668], [5551, 5553], [5514, 5552, 5554], [5553, 5555], [5554, 5556, 5669], [5555, 5557], [5515, 5556, 5558], [5557, 5559], [5558, 5560, 5670], [5559, 5561], [5516, 5560, 5562], [5561, 5563], [5562, 5564, 5671], [5563, 5565], [5517, 5564, 5566], [5565, 5567], [5566, 5568, 5672], [5567, 5569], [5518, 5568, 5570], [5569, 5571], [5570, 5572, 5673], [5571, 5573], [5519, 5572, 5574], [5573, 5575], [5574, 5576, 5674], [5575, 5577], [5520, 5576, 5578], [5577, 5579], [5578, 5580, 5675], [5579, 5581], [5521, 5580, 5582], [5581, 5583], [5582, 5584, 5676], [5583, 5585], [5522, 5584, 5586], [5585, 5587], [5586, 5588, 5677], [5587, 5589], [5523, 5588, 5590], [5589, 5591], [5590, 5592, 5678], [5591, 5593], [5524, 5592, 5594], [5593, 5595], [5594, 5596, 5679], [5595, 5597], [5525, 5596, 5598], [5597, 5599], [5598, 5600, 5680], [5599, 5601], [5526, 5600, 5602], [5601, 5603], [5602, 5604, 5681], [5603, 5605], [5527, 5604, 5606], [5605, 5607], [5606, 5608, 5682], [5607, 5609], [5528, 5608, 5610], [5609, 5611], [5610, 5612, 5683], [5611, 5613], [5529, 5612, 5614], [5613, 5615], [5614, 5616, 5684], [5615, 5617], [5530, 5616, 5618], [5617, 5619], [5618, 5620, 5685], [5619, 5621], [5531, 5620, 5622], [5621, 5623], [5622, 5624, 5686], [5623, 5625], [5532, 5624, 5626], [5625, 5627], [5626, 5628, 5687], [5627, 5629], [5533, 5628, 5630], [5629, 5631], [5630, 5632, 5688], [5631, 5633], [5534, 5632, 5634], [5633, 5635], [5634, 5636, 5689], [5635, 5637], [5535, 5636, 5638], [5637, 5639], [5638, 5640, 5690], [5639, 5641], [5536, 5640, 5642], [5641, 5643], [5642, 5644, 5691], [5643, 5645], [5537, 5644, 5646], [5645, 5647], [5646, 5648, 5692], [5647, 5649], [5538, 5648, 5650], [5649, 5651], [5650, 5652, 5693], [5651, 5653], [5539, 5652, 5654], [5653, 5655], [5654, 5656, 5694], [5655, 5657], [5540, 5656, 5658], [5657, 5659], [5658, 5660, 5695], [5659, 5661], [5541, 5660, 5662], [5661, 5663], [5662, 5664, 5696], [5663, 5665], [5542, 5664], [5543, 5697], [5547, 5701], [5551, 5705], [5555, 5709], [5559, 5713], [5563, 5717], [5567, 5721], [5571, 5725], [5575, 5729], [5579, 5733], [5583, 5737], [5587, 5741], [5591, 5745], [5595, 5749], [5599, 5753], [5603, 5757], [5607, 5761], [5611, 5765], [5615, 5769], [5619, 5773], [5623, 5777], [5627, 5781], [5631, 5785], [5635, 5789], [5639, 5793], [5643, 5797], [5647, 5801], [5651, 5805], [5655, 5809], [5659, 5813], [5663, 5817], [5666, 5698], [5697, 5699], [5698, 5700, 5820], [5699, 5701], [5667, 5700, 5702], [5701, 5703], [5702, 5704, 5821], [5703, 5705], [5668, 5704, 5706], [5705, 5707], [5706, 5708, 5822], [5707, 5709], [5669, 5708, 5710], [5709, 5711], [5710, 5712, 5823], [5711, 5713], [5670, 5712, 5714], [5713, 5715], [5714, 5716, 5824], [5715, 5717], [5671, 5716, 5718], [5717, 5719], [5718, 5720, 5825], [5719, 5721], [5672, 5720, 5722], [5721, 5723], [5722, 5724, 5826], [5723, 5725], [5673, 5724, 5726], [5725, 5727], [5726, 5728, 5827], [5727, 5729], [5674, 5728, 5730], [5729, 5731], [5730, 5732, 5828], [5731, 5733], [5675, 5732, 5734], [5733, 5735], [5734, 5736, 5829], [5735, 5737], [5676, 5736, 5738], [5737, 5739], [5738, 5740, 5830], [5739, 5741], [5677, 5740, 5742], [5741, 5743], [5742, 5744, 5831], [5743, 5745], [5678, 5744, 5746], [5745, 5747], [5746, 5748, 5832], [5747, 5749], [5679, 5748, 5750], [5749, 5751], [5750, 5752, 5833], [5751, 5753], [5680, 5752, 5754], [5753, 5755], [5754, 5756, 5834], [5755, 5757], [5681, 5756, 5758], [5757, 5759], [5758, 5760, 5835], [5759, 5761], [5682, 5760, 5762], [5761, 5763], [5762, 5764, 5836], [5763, 5765], [5683, 5764, 5766], [5765, 5767], [5766, 5768, 5837], [5767, 5769], [5684, 5768, 5770], [5769, 5771], [5770, 5772, 5838], [5771, 5773], [5685, 5772, 5774], [5773, 5775], [5774, 5776, 5839], [5775, 5777], [5686, 5776, 5778], [5777, 5779], [5778, 5780, 5840], [5779, 5781], [5687, 5780, 5782], [5781, 5783], [5782, 5784, 5841], [5783, 5785], [5688, 5784, 5786], [5785, 5787], [5786, 5788, 5842], [5787, 5789], [5689, 5788, 5790], [5789, 5791], [5790, 5792, 5843], [5791, 5793], [5690, 5792, 5794], [5793, 5795], [5794, 5796, 5844], [5795, 5797], [5691, 5796, 5798], [5797, 5799], [5798, 5800, 5845], [5799, 5801], [5692, 5800, 5802], [5801, 5803], [5802, 5804, 5846], [5803, 5805], [5693, 5804, 5806], [5805, 5807], [5806, 5808, 5847], [5807, 5809], [5694, 5808, 5810], [5809, 5811], [5810, 5812, 5848], [5811, 5813], [5695, 5812, 5814], [5813, 5815], [5814, 5816, 5849], [5815, 5817], [5696, 5816, 5818], [5817, 5819], [5818, 5850], [5699, 5853], [5703, 5857], [5707, 5861], [5711, 5865], [5715, 5869], [5719, 5873], [5723, 5877], [5727, 5881], [5731, 5885], [5735, 5889], [5739, 5893], [5743, 5897], [5747, 5901], [5751, 5905], [5755, 5909], [5759, 5913], [5763, 5917], [5767, 5921], [5771, 5925], [5775, 5929], [5779, 5933], [5783, 5937], [5787, 5941], [5791, 5945], [5795, 5949], [5799, 5953], [5803, 5957], [5807, 5961], [5811, 5965], [5815, 5969], [5819, 5973], [5852, 5974], [5851, 5853], [5820, 5852, 5854], [5853, 5855], [5854, 5856, 5975], [5855, 5857], [5821, 5856, 5858], [5857, 5859], [5858, 5860, 5976], [5859, 5861], [5822, 5860, 5862], [5861, 5863], [5862, 5864, 5977], [5863, 5865], [5823, 5864, 5866], [5865, 5867], [5866, 5868, 5978], [5867, 5869], [5824, 5868, 5870], [5869, 5871], [5870, 5872, 5979], [5871, 5873], [5825, 5872, 5874], [5873, 5875], [5874, 5876, 5980], [5875, 5877], [5826, 5876, 5878], [5877, 5879], [5878, 5880, 5981], [5879, 5881], [5827, 5880, 5882], [5881, 5883], [5882, 5884, 5982], [5883, 5885], [5828, 5884, 5886], [5885, 5887], [5886, 5888, 5983], [5887, 5889], [5829, 5888, 5890], [5889, 5891], [5890, 5892, 5984], [5891, 5893], [5830, 5892, 5894], [5893, 5895], [5894, 5896, 5985], [5895, 5897], [5831, 5896, 5898], [5897, 5899], [5898, 5900, 5986], [5899, 5901], [5832, 5900, 5902], [5901, 5903], [5902, 5904, 5987], [5903, 5905], [5833, 5904, 5906], [5905, 5907], [5906, 5908, 5988], [5907, 5909], [5834, 5908, 5910], [5909, 5911], [5910, 5912, 5989], [5911, 5913], [5835, 5912, 5914], [5913, 5915], [5914, 5916, 5990], [5915, 5917], [5836, 5916, 5918], [5917, 5919], [5918, 5920, 5991], [5919, 5921], [5837, 5920, 5922], [5921, 5923], [5922, 5924, 5992], [5923, 5925], [5838, 5924, 5926], [5925, 5927], [5926, 5928, 5993], [5927, 5929], [5839, 5928, 5930], [5929, 5931], [5930, 5932, 5994], [5931, 5933], [5840, 5932, 5934], [5933, 5935], [5934, 5936, 5995], [5935, 5937], [5841, 5936, 5938], [5937, 5939], [5938, 5940, 5996], [5939, 5941], [5842, 5940, 5942], [5941, 5943], [5942, 5944, 5997], [5943, 5945], [5843, 5944, 5946], [5945, 5947], [5946, 5948, 5998], [5947, 5949], [5844, 5948, 5950], [5949, 5951], [5950, 5952, 5999], [5951, 5953], [5845, 5952, 5954], [5953, 5955], [5954, 5956, 6000], [5955, 5957], [5846, 5956, 5958], [5957, 5959], [5958, 5960, 6001], [5959, 5961], [5847, 5960, 5962], [5961, 5963], [5962, 5964, 6002], [5963, 5965], [5848, 5964, 5966], [5965, 5967], [5966, 5968, 6003], [5967, 5969], [5849, 5968, 5970], [5969, 5971], [5970, 5972, 6004], [5971, 5973], [5850, 5972], [5851, 6005], [5855, 6009], [5859, 6013], [5863, 6017], [5867, 6021], [5871, 6025], [5875, 6029], [5879, 6033], [5883, 6037], [5887, 6041], [5891, 6045], [5895, 6049], [5899, 6053], [5903, 6057], [5907, 6061], [5911, 6065], [5915, 6069], [5919, 6073], [5923, 6077], [5927, 6081], [5931, 6085], [5935, 6089], [5939, 6093], [5943, 6097], [5947, 6101], [5951, 6105], [5955, 6109], [5959, 6113], [5963, 6117], [5967, 6121], [5971, 6125], [5974, 6006], [6005, 6007], [6006, 6008, 6128], [6007, 6009], [5975, 6008, 6010], [6009, 6011], [6010, 6012, 6129], [6011, 6013], [5976, 6012, 6014], [6013, 6015], [6014, 6016, 6130], [6015, 6017], [5977, 6016, 6018], [6017, 6019], [6018, 6020, 6131], [6019, 6021], [5978, 6020, 6022], [6021, 6023], [6022, 6024, 6132], [6023, 6025], [5979, 6024, 6026], [6025, 6027], [6026, 6028, 6133], [6027, 6029], [5980, 6028, 6030], [6029, 6031], [6030, 6032, 6134], [6031, 6033], [5981, 6032, 6034], [6033, 6035], [6034, 6036, 6135], [6035, 6037], [5982, 6036, 6038], [6037, 6039], [6038, 6040, 6136], [6039, 6041], [5983, 6040, 6042], [6041, 6043], [6042, 6044, 6137], [6043, 6045], [5984, 6044, 6046], [6045, 6047], [6046, 6048, 6138], [6047, 6049], [5985, 6048, 6050], [6049, 6051], [6050, 6052, 6139], [6051, 6053], [5986, 6052, 6054], [6053, 6055], [6054, 6056, 6140], [6055, 6057], [5987, 6056, 6058], [6057, 6059], [6058, 6060, 6141], [6059, 6061], [5988, 6060, 6062], [6061, 6063], [6062, 6064, 6142], [6063, 6065], [5989, 6064, 6066], [6065, 6067], [6066, 6068, 6143], [6067, 6069], [5990, 6068, 6070], [6069, 6071], [6070, 6072, 6144], [6071, 6073], [5991, 6072, 6074], [6073, 6075], [6074, 6076, 6145], [6075, 6077], [5992, 6076, 6078], [6077, 6079], [6078, 6080, 6146], [6079, 6081], [5993, 6080, 6082], [6081, 6083], [6082, 6084, 6147], [6083, 6085], [5994, 6084, 6086], [6085, 6087], [6086, 6088, 6148], [6087, 6089], [5995, 6088, 6090], [6089, 6091], [6090, 6092, 6149], [6091, 6093], [5996, 6092, 6094], [6093, 6095], [6094, 6096, 6150], [6095, 6097], [5997, 6096, 6098], [6097, 6099], [6098, 6100, 6151], [6099, 6101], [5998, 6100, 6102], [6101, 6103], [6102, 6104, 6152], [6103, 6105], [5999, 6104, 6106], [6105, 6107], [6106, 6108, 6153], [6107, 6109], [6000, 6108, 6110], [6109, 6111], [6110, 6112, 6154], [6111, 6113], [6001, 6112, 6114], [6113, 6115], [6114, 6116, 6155], [6115, 6117], [6002, 6116, 6118], [6117, 6119], [6118, 6120, 6156], [6119, 6121], [6003, 6120, 6122], [6121, 6123], [6122, 6124, 6157], [6123, 6125], [6004, 6124, 6126], [6125, 6127], [6126, 6158], [6007, 6161], [6011, 6165], [6015, 6169], [6019, 6173], [6023, 6177], [6027, 6181], [6031, 6185], [6035, 6189], [6039, 6193], [6043, 6197], [6047, 6201], [6051, 6205], [6055, 6209], [6059, 6213], [6063, 6217], [6067, 6221], [6071, 6225], [6075, 6229], [6079, 6233], [6083, 6237], [6087, 6241], [6091, 6245], [6095, 6249], [6099, 6253], [6103, 6257], [6107, 6261], [6111, 6265], [6115, 6269], [6119, 6273], [6123, 6277], [6127, 6281], [6160, 6282], [6159, 6161], [6128, 6160, 6162], [6161, 6163], [6162, 6164, 6283], [6163, 6165], [6129, 6164, 6166], [6165, 6167], [6166, 6168, 6284], [6167, 6169], [6130, 6168, 6170], [6169, 6171], [6170, 6172, 6285], [6171, 6173], [6131, 6172, 6174], [6173, 6175], [6174, 6176, 6286], [6175, 6177], [6132, 6176, 6178], [6177, 6179], [6178, 6180, 6287], [6179, 6181], [6133, 6180, 6182], [6181, 6183], [6182, 6184, 6288], [6183, 6185], [6134, 6184, 6186], [6185, 6187], [6186, 6188, 6289], [6187, 6189], [6135, 6188, 6190], [6189, 6191], [6190, 6192, 6290], [6191, 6193], [6136, 6192, 6194], [6193, 6195], [6194, 6196, 6291], [6195, 6197], [6137, 6196, 6198], [6197, 6199], [6198, 6200, 6292], [6199, 6201], [6138, 6200, 6202], [6201, 6203], [6202, 6204, 6293], [6203, 6205], [6139, 6204, 6206], [6205, 6207], [6206, 6208, 6294], [6207, 6209], [6140, 6208, 6210], [6209, 6211], [6210, 6212, 6295], [6211, 6213], [6141, 6212, 6214], [6213, 6215], [6214, 6216, 6296], [6215, 6217], [6142, 6216, 6218], [6217, 6219], [6218, 6220, 6297], [6219, 6221], [6143, 6220, 6222], [6221, 6223], [6222, 6224, 6298], [6223, 6225], [6144, 6224, 6226], [6225, 6227], [6226, 6228, 6299], [6227, 6229], [6145, 6228, 6230], [6229, 6231], [6230, 6232, 6300], [6231, 6233], [6146, 6232, 6234], [6233, 6235], [6234, 6236, 6301], [6235, 6237], [6147, 6236, 6238], [6237, 6239], [6238, 6240, 6302], [6239, 6241], [6148, 6240, 6242], [6241, 6243], [6242, 6244, 6303], [6243, 6245], [6149, 6244, 6246], [6245, 6247], [6246, 6248, 6304], [6247, 6249], [6150, 6248, 6250], [6249, 6251], [6250, 6252, 6305], [6251, 6253], [6151, 6252, 6254], [6253, 6255], [6254, 6256, 6306], [6255, 6257], [6152, 6256, 6258], [6257, 6259], [6258, 6260, 6307], [6259, 6261], [6153, 6260, 6262], [6261, 6263], [6262, 6264, 6308], [6263, 6265], [6154, 6264, 6266], [6265, 6267], [6266, 6268, 6309], [6267, 6269], [6155, 6268, 6270], [6269, 6271], [6270, 6272, 6310], [6271, 6273], [6156, 6272, 6274], [6273, 6275], [6274, 6276, 6311], [6275, 6277], [6157, 6276, 6278], [6277, 6279], [6278, 6280, 6312], [6279, 6281], [6158, 6280], [6159, 6313], [6163, 6317], [6167, 6321], [6171, 6325], [6175, 6329], [6179, 6333], [6183, 6337], [6187, 6341], [6191, 6345], [6195, 6349], [6199, 6353], [6203, 6357], [6207, 6361], [6211, 6365], [6215, 6369], [6219, 6373], [6223, 6377], [6227, 6381], [6231, 6385], [6235, 6389], [6239, 6393], [6243, 6397], [6247, 6401], [6251, 6405], [6255, 6409], [6259, 6413], [6263, 6417], [6267, 6421], [6271, 6425], [6275, 6429], [6279, 6433], [6282, 6314], [6313, 6315], [6314, 6316, 6436], [6315, 6317], [6283, 6316, 6318], [6317, 6319], [6318, 6320, 6437], [6319, 6321], [6284, 6320, 6322], [6321, 6323], [6322, 6324, 6438], [6323, 6325], [6285, 6324, 6326], [6325, 6327], [6326, 6328, 6439], [6327, 6329], [6286, 6328, 6330], [6329, 6331], [6330, 6332, 6440], [6331, 6333], [6287, 6332, 6334], [6333, 6335], [6334, 6336, 6441], [6335, 6337], [6288, 6336, 6338], [6337, 6339], [6338, 6340, 6442], [6339, 6341], [6289, 6340, 6342], [6341, 6343], [6342, 6344, 6443], [6343, 6345], [6290, 6344, 6346], [6345, 6347], [6346, 6348, 6444], [6347, 6349], [6291, 6348, 6350], [6349, 6351], [6350, 6352, 6445], [6351, 6353], [6292, 6352, 6354], [6353, 6355], [6354, 6356, 6446], [6355, 6357], [6293, 6356, 6358], [6357, 6359], [6358, 6360, 6447], [6359, 6361], [6294, 6360, 6362], [6361, 6363], [6362, 6364, 6448], [6363, 6365], [6295, 6364, 6366], [6365, 6367], [6366, 6368, 6449], [6367, 6369], [6296, 6368, 6370], [6369, 6371], [6370, 6372, 6450], [6371, 6373], [6297, 6372, 6374], [6373, 6375], [6374, 6376, 6451], [6375, 6377], [6298, 6376, 6378], [6377, 6379], [6378, 6380, 6452], [6379, 6381], [6299, 6380, 6382], [6381, 6383], [6382, 6384, 6453], [6383, 6385], [6300, 6384, 6386], [6385, 6387], [6386, 6388, 6454], [6387, 6389], [6301, 6388, 6390], [6389, 6391], [6390, 6392, 6455], [6391, 6393], [6302, 6392, 6394], [6393, 6395], [6394, 6396, 6456], [6395, 6397], [6303, 6396, 6398], [6397, 6399], [6398, 6400, 6457], [6399, 6401], [6304, 6400, 6402], [6401, 6403], [6402, 6404, 6458], [6403, 6405], [6305, 6404, 6406], [6405, 6407], [6406, 6408, 6459], [6407, 6409], [6306, 6408, 6410], [6409, 6411], [6410, 6412, 6460], [6411, 6413], [6307, 6412, 6414], [6413, 6415], [6414, 6416, 6461], [6415, 6417], [6308, 6416, 6418], [6417, 6419], [6418, 6420, 6462], [6419, 6421], [6309, 6420, 6422], [6421, 6423], [6422, 6424, 6463], [6423, 6425], [6310, 6424, 6426], [6425, 6427], [6426, 6428, 6464], [6427, 6429], [6311, 6428, 6430], [6429, 6431], [6430, 6432, 6465], [6431, 6433], [6312, 6432, 6434], [6433, 6435], [6434, 6466], [6315, 6469], [6319, 6473], [6323, 6477], [6327, 6481], [6331, 6485], [6335, 6489], [6339, 6493], [6343, 6497], [6347, 6501], [6351, 6505], [6355, 6509], [6359, 6513], [6363, 6517], [6367, 6521], [6371, 6525], [6375, 6529], [6379, 6533], [6383, 6537], [6387, 6541], [6391, 6545], [6395, 6549], [6399, 6553], [6403, 6557], [6407, 6561], [6411, 6565], [6415, 6569], [6419, 6573], [6423, 6577], [6427, 6581], [6431, 6585], [6435, 6589], [6468, 6590], [6467, 6469], [6436, 6468, 6470], [6469, 6471], [6470, 6472, 6591], [6471, 6473], [6437, 6472, 6474], [6473, 6475], [6474, 6476, 6592], [6475, 6477], [6438, 6476, 6478], [6477, 6479], [6478, 6480, 6593], [6479, 6481], [6439, 6480, 6482], [6481, 6483], [6482, 6484, 6594], [6483, 6485], [6440, 6484, 6486], [6485, 6487], [6486, 6488, 6595], [6487, 6489], [6441, 6488, 6490], [6489, 6491], [6490, 6492, 6596], [6491, 6493], [6442, 6492, 6494], [6493, 6495], [6494, 6496, 6597], [6495, 6497], [6443, 6496, 6498], [6497, 6499], [6498, 6500, 6598], [6499, 6501], [6444, 6500, 6502], [6501, 6503], [6502, 6504, 6599], [6503, 6505], [6445, 6504, 6506], [6505, 6507], [6506, 6508, 6600], [6507, 6509], [6446, 6508, 6510], [6509, 6511], [6510, 6512, 6601], [6511, 6513], [6447, 6512, 6514], [6513, 6515], [6514, 6516, 6602], [6515, 6517], [6448, 6516, 6518], [6517, 6519], [6518, 6520, 6603], [6519, 6521], [6449, 6520, 6522], [6521, 6523], [6522, 6524, 6604], [6523, 6525], [6450, 6524, 6526], [6525, 6527], [6526, 6528, 6605], [6527, 6529], [6451, 6528, 6530], [6529, 6531], [6530, 6532, 6606], [6531, 6533], [6452, 6532, 6534], [6533, 6535], [6534, 6536, 6607], [6535, 6537], [6453, 6536, 6538], [6537, 6539], [6538, 6540, 6608], [6539, 6541], [6454, 6540, 6542], [6541, 6543], [6542, 6544, 6609], [6543, 6545], [6455, 6544, 6546], [6545, 6547], [6546, 6548, 6610], [6547, 6549], [6456, 6548, 6550], [6549, 6551], [6550, 6552, 6611], [6551, 6553], [6457, 6552, 6554], [6553, 6555], [6554, 6556, 6612], [6555, 6557], [6458, 6556, 6558], [6557, 6559], [6558, 6560, 6613], [6559, 6561], [6459, 6560, 6562], [6561, 6563], [6562, 6564, 6614], [6563, 6565], [6460, 6564, 6566], [6565, 6567], [6566, 6568, 6615], [6567, 6569], [6461, 6568, 6570], [6569, 6571], [6570, 6572, 6616], [6571, 6573], [6462, 6572, 6574], [6573, 6575], [6574, 6576, 6617], [6575, 6577], [6463, 6576, 6578], [6577, 6579], [6578, 6580, 6618], [6579, 6581], [6464, 6580, 6582], [6581, 6583], [6582, 6584, 6619], [6583, 6585], [6465, 6584, 6586], [6585, 6587], [6586, 6588, 6620], [6587, 6589], [6466, 6588], [6467, 6621], [6471, 6625], [6475, 6629], [6479, 6633], [6483, 6637], [6487, 6641], [6491, 6645], [6495, 6649], [6499, 6653], [6503, 6657], [6507, 6661], [6511, 6665], [6515, 6669], [6519, 6673], [6523, 6677], [6527, 6681], [6531, 6685], [6535, 6689], [6539, 6693], [6543, 6697], [6547, 6701], [6551, 6705], [6555, 6709], [6559, 6713], [6563, 6717], [6567, 6721], [6571, 6725], [6575, 6729], [6579, 6733], [6583, 6737], [6587, 6741], [6590, 6622], [6621, 6623], [6622, 6624, 6744], [6623, 6625], [6591, 6624, 6626], [6625, 6627], [6626, 6628, 6745], [6627, 6629], [6592, 6628, 6630], [6629, 6631], [6630, 6632, 6746], [6631, 6633], [6593, 6632, 6634], [6633, 6635], [6634, 6636, 6747], [6635, 6637], [6594, 6636, 6638], [6637, 6639], [6638, 6640, 6748], [6639, 6641], [6595, 6640, 6642], [6641, 6643], [6642, 6644, 6749], [6643, 6645], [6596, 6644, 6646], [6645, 6647], [6646, 6648, 6750], [6647, 6649], [6597, 6648, 6650], [6649, 6651], [6650, 6652, 6751], [6651, 6653], [6598, 6652, 6654], [6653, 6655], [6654, 6656, 6752], [6655, 6657], [6599, 6656, 6658], [6657, 6659], [6658, 6660, 6753], [6659, 6661], [6600, 6660, 6662], [6661, 6663], [6662, 6664, 6754], [6663, 6665], [6601, 6664, 6666], [6665, 6667], [6666, 6668, 6755], [6667, 6669], [6602, 6668, 6670], [6669, 6671], [6670, 6672, 6756], [6671, 6673], [6603, 6672, 6674], [6673, 6675], [6674, 6676, 6757], [6675, 6677], [6604, 6676, 6678], [6677, 6679], [6678, 6680, 6758], [6679, 6681], [6605, 6680, 6682], [6681, 6683], [6682, 6684, 6759], [6683, 6685], [6606, 6684, 6686], [6685, 6687], [6686, 6688, 6760], [6687, 6689], [6607, 6688, 6690], [6689, 6691], [6690, 6692, 6761], [6691, 6693], [6608, 6692, 6694], [6693, 6695], [6694, 6696, 6762], [6695, 6697], [6609, 6696, 6698], [6697, 6699], [6698, 6700, 6763], [6699, 6701], [6610, 6700, 6702], [6701, 6703], [6702, 6704, 6764], [6703, 6705], [6611, 6704, 6706], [6705, 6707], [6706, 6708, 6765], [6707, 6709], [6612, 6708, 6710], [6709, 6711], [6710, 6712, 6766], [6711, 6713], [6613, 6712, 6714], [6713, 6715], [6714, 6716, 6767], [6715, 6717], [6614, 6716, 6718], [6717, 6719], [6718, 6720, 6768], [6719, 6721], [6615, 6720, 6722], [6721, 6723], [6722, 6724, 6769], [6723, 6725], [6616, 6724, 6726], [6725, 6727], [6726, 6728, 6770], [6727, 6729], [6617, 6728, 6730], [6729, 6731], [6730, 6732, 6771], [6731, 6733], [6618, 6732, 6734], [6733, 6735], [6734, 6736, 6772], [6735, 6737], [6619, 6736, 6738], [6737, 6739], [6738, 6740, 6773], [6739, 6741], [6620, 6740, 6742], [6741, 6743], [6742, 6774], [6623, 6777], [6627, 6781], [6631, 6785], [6635, 6789], [6639, 6793], [6643, 6797], [6647, 6801], [6651, 6805], [6655, 6809], [6659, 6813], [6663, 6817], [6667, 6821], [6671, 6825], [6675, 6829], [6679, 6833], [6683, 6837], [6687, 6841], [6691, 6845], [6695, 6849], [6699, 6853], [6703, 6857], [6707, 6861], [6711, 6865], [6715, 6869], [6719, 6873], [6723, 6877], [6727, 6881], [6731, 6885], [6735, 6889], [6739, 6893], [6743, 6897], [6776, 6898], [6775, 6777], [6744, 6776, 6778], [6777, 6779], [6778, 6780, 6899], [6779, 6781], [6745, 6780, 6782], [6781, 6783], [6782, 6784, 6900], [6783, 6785], [6746, 6784, 6786], [6785, 6787], [6786, 6788, 6901], [6787, 6789], [6747, 6788, 6790], [6789, 6791], [6790, 6792, 6902], [6791, 6793], [6748, 6792, 6794], [6793, 6795], [6794, 6796, 6903], [6795, 6797], [6749, 6796, 6798], [6797, 6799], [6798, 6800, 6904], [6799, 6801], [6750, 6800, 6802], [6801, 6803], [6802, 6804, 6905], [6803, 6805], [6751, 6804, 6806], [6805, 6807], [6806, 6808, 6906], [6807, 6809], [6752, 6808, 6810], [6809, 6811], [6810, 6812, 6907], [6811, 6813], [6753, 6812, 6814], [6813, 6815], [6814, 6816, 6908], [6815, 6817], [6754, 6816, 6818], [6817, 6819], [6818, 6820, 6909], [6819, 6821], [6755, 6820, 6822], [6821, 6823], [6822, 6824, 6910], [6823, 6825], [6756, 6824, 6826], [6825, 6827], [6826, 6828, 6911], [6827, 6829], [6757, 6828, 6830], [6829, 6831], [6830, 6832, 6912], [6831, 6833], [6758, 6832, 6834], [6833, 6835], [6834, 6836, 6913], [6835, 6837], [6759, 6836, 6838], [6837, 6839], [6838, 6840, 6914], [6839, 6841], [6760, 6840, 6842], [6841, 6843], [6842, 6844, 6915], [6843, 6845], [6761, 6844, 6846], [6845, 6847], [6846, 6848, 6916], [6847, 6849], [6762, 6848, 6850], [6849, 6851], [6850, 6852, 6917], [6851, 6853], [6763, 6852, 6854], [6853, 6855], [6854, 6856, 6918], [6855, 6857], [6764, 6856, 6858], [6857, 6859], [6858, 6860, 6919], [6859, 6861], [6765, 6860, 6862], [6861, 6863], [6862, 6864, 6920], [6863, 6865], [6766, 6864, 6866], [6865, 6867], [6866, 6868, 6921], [6867, 6869], [6767, 6868, 6870], [6869, 6871], [6870, 6872, 6922], [6871, 6873], [6768, 6872, 6874], [6873, 6875], [6874, 6876, 6923], [6875, 6877], [6769, 6876, 6878], [6877, 6879], [6878, 6880, 6924], [6879, 6881], [6770, 6880, 6882], [6881, 6883], [6882, 6884, 6925], [6883, 6885], [6771, 6884, 6886], [6885, 6887], [6886, 6888, 6926], [6887, 6889], [6772, 6888, 6890], [6889, 6891], [6890, 6892, 6927], [6891, 6893], [6773, 6892, 6894], [6893, 6895], [6894, 6896, 6928], [6895, 6897], [6774, 6896], [6775, 6929], [6779, 6933], [6783, 6937], [6787, 6941], [6791, 6945], [6795, 6949], [6799, 6953], [6803, 6957], [6807, 6961], [6811, 6965], [6815, 6969], [6819, 6973], [6823, 6977], [6827, 6981], [6831, 6985], [6835, 6989], [6839, 6993], [6843, 6997], [6847, 7001], [6851, 7005], [6855, 7009], [6859, 7013], [6863, 7017], [6867, 7021], [6871, 7025], [6875, 7029], [6879, 7033], [6883, 7037], [6887, 7041], [6891, 7045], [6895, 7049], [6898, 6930], [6929, 6931], [6930, 6932, 7052], [6931, 6933], [6899, 6932, 6934], [6933, 6935], [6934, 6936, 7053], [6935, 6937], [6900, 6936, 6938], [6937, 6939], [6938, 6940, 7054], [6939, 6941], [6901, 6940, 6942], [6941, 6943], [6942, 6944, 7055], [6943, 6945], [6902, 6944, 6946], [6945, 6947], [6946, 6948, 7056], [6947, 6949], [6903, 6948, 6950], [6949, 6951], [6950, 6952, 7057], [6951, 6953], [6904, 6952, 6954], [6953, 6955], [6954, 6956, 7058], [6955, 6957], [6905, 6956, 6958], [6957, 6959], [6958, 6960, 7059], [6959, 6961], [6906, 6960, 6962], [6961, 6963], [6962, 6964, 7060], [6963, 6965], [6907, 6964, 6966], [6965, 6967], [6966, 6968, 7061], [6967, 6969], [6908, 6968, 6970], [6969, 6971], [6970, 6972, 7062], [6971, 6973], [6909, 6972, 6974], [6973, 6975], [6974, 6976, 7063], [6975, 6977], [6910, 6976, 6978], [6977, 6979], [6978, 6980, 7064], [6979, 6981], [6911, 6980, 6982], [6981, 6983], [6982, 6984, 7065], [6983, 6985], [6912, 6984, 6986], [6985, 6987], [6986, 6988, 7066], [6987, 6989], [6913, 6988, 6990], [6989, 6991], [6990, 6992, 7067], [6991, 6993], [6914, 6992, 6994], [6993, 6995], [6994, 6996, 7068], [6995, 6997], [6915, 6996, 6998], [6997, 6999], [6998, 7000, 7069], [6999, 7001], [6916, 7000, 7002], [7001, 7003], [7002, 7004, 7070], [7003, 7005], [6917, 7004, 7006], [7005, 7007], [7006, 7008, 7071], [7007, 7009], [6918, 7008, 7010], [7009, 7011], [7010, 7012, 7072], [7011, 7013], [6919, 7012, 7014], [7013, 7015], [7014, 7016, 7073], [7015, 7017], [6920, 7016, 7018], [7017, 7019], [7018, 7020, 7074], [7019, 7021], [6921, 7020, 7022], [7021, 7023], [7022, 7024, 7075], [7023, 7025], [6922, 7024, 7026], [7025, 7027], [7026, 7028, 7076], [7027, 7029], [6923, 7028, 7030], [7029, 7031], [7030, 7032, 7077], [7031, 7033], [6924, 7032, 7034], [7033, 7035], [7034, 7036, 7078], [7035, 7037], [6925, 7036, 7038], [7037, 7039], [7038, 7040, 7079], [7039, 7041], [6926, 7040, 7042], [7041, 7043], [7042, 7044, 7080], [7043, 7045], [6927, 7044, 7046], [7045, 7047], [7046, 7048, 7081], [7047, 7049], [6928, 7048, 7050], [7049, 7051], [7050, 7082], [6931, 7085], [6935, 7089], [6939, 7093], [6943, 7097], [6947, 7101], [6951, 7105], [6955, 7109], [6959, 7113], [6963, 7117], [6967, 7121], [6971, 7125], [6975, 7129], [6979, 7133], [6983, 7137], [6987, 7141], [6991, 7145], [6995, 7149], [6999, 7153], [7003, 7157], [7007, 7161], [7011, 7165], [7015, 7169], [7019, 7173], [7023, 7177], [7027, 7181], [7031, 7185], [7035, 7189], [7039, 7193], [7043, 7197], [7047, 7201], [7051, 7205], [7084, 7206], [7083, 7085], [7052, 7084, 7086], [7085, 7087], [7086, 7088, 7207], [7087, 7089], [7053, 7088, 7090], [7089, 7091], [7090, 7092, 7208], [7091, 7093], [7054, 7092, 7094], [7093, 7095], [7094, 7096, 7209], [7095, 7097], [7055, 7096, 7098], [7097, 7099], [7098, 7100, 7210], [7099, 7101], [7056, 7100, 7102], [7101, 7103], [7102, 7104, 7211], [7103, 7105], [7057, 7104, 7106], [7105, 7107], [7106, 7108, 7212], [7107, 7109], [7058, 7108, 7110], [7109, 7111], [7110, 7112, 7213], [7111, 7113], [7059, 7112, 7114], [7113, 7115], [7114, 7116, 7214], [7115, 7117], [7060, 7116, 7118], [7117, 7119], [7118, 7120, 7215], [7119, 7121], [7061, 7120, 7122], [7121, 7123], [7122, 7124, 7216], [7123, 7125], [7062, 7124, 7126], [7125, 7127], [7126, 7128, 7217], [7127, 7129], [7063, 7128, 7130], [7129, 7131], [7130, 7132, 7218], [7131, 7133], [7064, 7132, 7134], [7133, 7135], [7134, 7136, 7219], [7135, 7137], [7065, 7136, 7138], [7137, 7139], [7138, 7140, 7220], [7139, 7141], [7066, 7140, 7142], [7141, 7143], [7142, 7144, 7221], [7143, 7145], [7067, 7144, 7146], [7145, 7147], [7146, 7148, 7222], [7147, 7149], [7068, 7148, 7150], [7149, 7151], [7150, 7152, 7223], [7151, 7153], [7069, 7152, 7154], [7153, 7155], [7154, 7156, 7224], [7155, 7157], [7070, 7156, 7158], [7157, 7159], [7158, 7160, 7225], [7159, 7161], [7071, 7160, 7162], [7161, 7163], [7162, 7164, 7226], [7163, 7165], [7072, 7164, 7166], [7165, 7167], [7166, 7168, 7227], [7167, 7169], [7073, 7168, 7170], [7169, 7171], [7170, 7172, 7228], [7171, 7173], [7074, 7172, 7174], [7173, 7175], [7174, 7176, 7229], [7175, 7177], [7075, 7176, 7178], [7177, 7179], [7178, 7180, 7230], [7179, 7181], [7076, 7180, 7182], [7181, 7183], [7182, 7184, 7231], [7183, 7185], [7077, 7184, 7186], [7185, 7187], [7186, 7188, 7232], [7187, 7189], [7078, 7188, 7190], [7189, 7191], [7190, 7192, 7233], [7191, 7193], [7079, 7192, 7194], [7193, 7195], [7194, 7196, 7234], [7195, 7197], [7080, 7196, 7198], [7197, 7199], [7198, 7200, 7235], [7199, 7201], [7081, 7200, 7202], [7201, 7203], [7202, 7204, 7236], [7203, 7205], [7082, 7204], [7083, 7237], [7087, 7241], [7091, 7245], [7095, 7249], [7099, 7253], [7103, 7257], [7107, 7261], [7111, 7265], [7115, 7269], [7119, 7273], [7123, 7277], [7127, 7281], [7131, 7285], [7135, 7289], [7139, 7293], [7143, 7297], [7147, 7301], [7151, 7305], [7155, 7309], [7159, 7313], [7163, 7317], [7167, 7321], [7171, 7325], [7175, 7329], [7179, 7333], [7183, 7337], [7187, 7341], [7191, 7345], [7195, 7349], [7199, 7353], [7203, 7357], [7206, 7238], [7237, 7239], [7238, 7240, 7360], [7239, 7241], [7207, 7240, 7242], [7241, 7243], [7242, 7244, 7361], [7243, 7245], [7208, 7244, 7246], [7245, 7247], [7246, 7248, 7362], [7247, 7249], [7209, 7248, 7250], [7249, 7251], [7250, 7252, 7363], [7251, 7253], [7210, 7252, 7254], [7253, 7255], [7254, 7256, 7364], [7255, 7257], [7211, 7256, 7258], [7257, 7259], [7258, 7260, 7365], [7259, 7261], [7212, 7260, 7262], [7261, 7263], [7262, 7264, 7366], [7263, 7265], [7213, 7264, 7266], [7265, 7267], [7266, 7268, 7367], [7267, 7269], [7214, 7268, 7270], [7269, 7271], [7270, 7272, 7368], [7271, 7273], [7215, 7272, 7274], [7273, 7275], [7274, 7276, 7369], [7275, 7277], [7216, 7276, 7278], [7277, 7279], [7278, 7280, 7370], [7279, 7281], [7217, 7280, 7282], [7281, 7283], [7282, 7284, 7371], [7283, 7285], [7218, 7284, 7286], [7285, 7287], [7286, 7288, 7372], [7287, 7289], [7219, 7288, 7290], [7289, 7291], [7290, 7292, 7373], [7291, 7293], [7220, 7292, 7294], [7293, 7295], [7294, 7296, 7374], [7295, 7297], [7221, 7296, 7298], [7297, 7299], [7298, 7300, 7375], [7299, 7301], [7222, 7300, 7302], [7301, 7303], [7302, 7304, 7376], [7303, 7305], [7223, 7304, 7306], [7305, 7307], [7306, 7308, 7377], [7307, 7309], [7224, 7308, 7310], [7309, 7311], [7310, 7312, 7378], [7311, 7313], [7225, 7312, 7314], [7313, 7315], [7314, 7316, 7379], [7315, 7317], [7226, 7316, 7318], [7317, 7319], [7318, 7320, 7380], [7319, 7321], [7227, 7320, 7322], [7321, 7323], [7322, 7324, 7381], [7323, 7325], [7228, 7324, 7326], [7325, 7327], [7326, 7328, 7382], [7327, 7329], [7229, 7328, 7330], [7329, 7331], [7330, 7332, 7383], [7331, 7333], [7230, 7332, 7334], [7333, 7335], [7334, 7336, 7384], [7335, 7337], [7231, 7336, 7338], [7337, 7339], [7338, 7340, 7385], [7339, 7341], [7232, 7340, 7342], [7341, 7343], [7342, 7344, 7386], [7343, 7345], [7233, 7344, 7346], [7345, 7347], [7346, 7348, 7387], [7347, 7349], [7234, 7348, 7350], [7349, 7351], [7350, 7352, 7388], [7351, 7353], [7235, 7352, 7354], [7353, 7355], [7354, 7356, 7389], [7355, 7357], [7236, 7356, 7358], [7357, 7359], [7358, 7390], [7239, 7393], [7243, 7397], [7247, 7401], [7251, 7405], [7255, 7409], [7259, 7413], [7263, 7417], [7267, 7421], [7271, 7425], [7275, 7429], [7279, 7433], [7283, 7437], [7287, 7441], [7291, 7445], [7295, 7449], [7299, 7453], [7303, 7457], [7307, 7461], [7311, 7465], [7315, 7469], [7319, 7473], [7323, 7477], [7327, 7481], [7331, 7485], [7335, 7489], [7339, 7493], [7343, 7497], [7347, 7501], [7351, 7505], [7355, 7509], [7359, 7513], [7392, 7514], [7391, 7393], [7360, 7392, 7394], [7393, 7395], [7394, 7396, 7515], [7395, 7397], [7361, 7396, 7398], [7397, 7399], [7398, 7400, 7516], [7399, 7401], [7362, 7400, 7402], [7401, 7403], [7402, 7404, 7517], [7403, 7405], [7363, 7404, 7406], [7405, 7407], [7406, 7408, 7518], [7407, 7409], [7364, 7408, 7410], [7409, 7411], [7410, 7412, 7519], [7411, 7413], [7365, 7412, 7414], [7413, 7415], [7414, 7416, 7520], [7415, 7417], [7366, 7416, 7418], [7417, 7419], [7418, 7420, 7521], [7419, 7421], [7367, 7420, 7422], [7421, 7423], [7422, 7424, 7522], [7423, 7425], [7368, 7424, 7426], [7425, 7427], [7426, 7428, 7523], [7427, 7429], [7369, 7428, 7430], [7429, 7431], [7430, 7432, 7524], [7431, 7433], [7370, 7432, 7434], [7433, 7435], [7434, 7436, 7525], [7435, 7437], [7371, 7436, 7438], [7437, 7439], [7438, 7440, 7526], [7439, 7441], [7372, 7440, 7442], [7441, 7443], [7442, 7444, 7527], [7443, 7445], [7373, 7444, 7446], [7445, 7447], [7446, 7448, 7528], [7447, 7449], [7374, 7448, 7450], [7449, 7451], [7450, 7452, 7529], [7451, 7453], [7375, 7452, 7454], [7453, 7455], [7454, 7456, 7530], [7455, 7457], [7376, 7456, 7458], [7457, 7459], [7458, 7460, 7531], [7459, 7461], [7377, 7460, 7462], [7461, 7463], [7462, 7464, 7532], [7463, 7465], [7378, 7464, 7466], [7465, 7467], [7466, 7468, 7533], [7467, 7469], [7379, 7468, 7470], [7469, 7471], [7470, 7472, 7534], [7471, 7473], [7380, 7472, 7474], [7473, 7475], [7474, 7476, 7535], [7475, 7477], [7381, 7476, 7478], [7477, 7479], [7478, 7480, 7536], [7479, 7481], [7382, 7480, 7482], [7481, 7483], [7482, 7484, 7537], [7483, 7485], [7383, 7484, 7486], [7485, 7487], [7486, 7488, 7538], [7487, 7489], [7384, 7488, 7490], [7489, 7491], [7490, 7492, 7539], [7491, 7493], [7385, 7492, 7494], [7493, 7495], [7494, 7496, 7540], [7495, 7497], [7386, 7496, 7498], [7497, 7499], [7498, 7500, 7541], [7499, 7501], [7387, 7500, 7502], [7501, 7503], [7502, 7504, 7542], [7503, 7505], [7388, 7504, 7506], [7505, 7507], [7506, 7508, 7543], [7507, 7509], [7389, 7508, 7510], [7509, 7511], [7510, 7512, 7544], [7511, 7513], [7390, 7512], [7391, 7545], [7395, 7549], [7399, 7553], [7403, 7557], [7407, 7561], [7411, 7565], [7415, 7569], [7419, 7573], [7423, 7577], [7427, 7581], [7431, 7585], [7435, 7589], [7439, 7593], [7443, 7597], [7447, 7601], [7451, 7605], [7455, 7609], [7459, 7613], [7463, 7617], [7467, 7621], [7471, 7625], [7475, 7629], [7479, 7633], [7483, 7637], [7487, 7641], [7491, 7645], [7495, 7649], [7499, 7653], [7503, 7657], [7507, 7661], [7511, 7665], [7514, 7546], [7545, 7547], [7546, 7548, 7668], [7547, 7549], [7515, 7548, 7550], [7549, 7551], [7550, 7552, 7669], [7551, 7553], [7516, 7552, 7554], [7553, 7555], [7554, 7556, 7670], [7555, 7557], [7517, 7556, 7558], [7557, 7559], [7558, 7560, 7671], [7559, 7561], [7518, 7560, 7562], [7561, 7563], [7562, 7564, 7672], [7563, 7565], [7519, 7564, 7566], [7565, 7567], [7566, 7568, 7673], [7567, 7569], [7520, 7568, 7570], [7569, 7571], [7570, 7572, 7674], [7571, 7573], [7521, 7572, 7574], [7573, 7575], [7574, 7576, 7675], [7575, 7577], [7522, 7576, 7578], [7577, 7579], [7578, 7580, 7676], [7579, 7581], [7523, 7580, 7582], [7581, 7583], [7582, 7584, 7677], [7583, 7585], [7524, 7584, 7586], [7585, 7587], [7586, 7588, 7678], [7587, 7589], [7525, 7588, 7590], [7589, 7591], [7590, 7592, 7679], [7591, 7593], [7526, 7592, 7594], [7593, 7595], [7594, 7596, 7680], [7595, 7597], [7527, 7596, 7598], [7597, 7599], [7598, 7600, 7681], [7599, 7601], [7528, 7600, 7602], [7601, 7603], [7602, 7604, 7682], [7603, 7605], [7529, 7604, 7606], [7605, 7607], [7606, 7608, 7683], [7607, 7609], [7530, 7608, 7610], [7609, 7611], [7610, 7612, 7684], [7611, 7613], [7531, 7612, 7614], [7613, 7615], [7614, 7616, 7685], [7615, 7617], [7532, 7616, 7618], [7617, 7619], [7618, 7620, 7686], [7619, 7621], [7533, 7620, 7622], [7621, 7623], [7622, 7624, 7687], [7623, 7625], [7534, 7624, 7626], [7625, 7627], [7626, 7628, 7688], [7627, 7629], [7535, 7628, 7630], [7629, 7631], [7630, 7632, 7689], [7631, 7633], [7536, 7632, 7634], [7633, 7635], [7634, 7636, 7690], [7635, 7637], [7537, 7636, 7638], [7637, 7639], [7638, 7640, 7691], [7639, 7641], [7538, 7640, 7642], [7641, 7643], [7642, 7644, 7692], [7643, 7645], [7539, 7644, 7646], [7645, 7647], [7646, 7648, 7693], [7647, 7649], [7540, 7648, 7650], [7649, 7651], [7650, 7652, 7694], [7651, 7653], [7541, 7652, 7654], [7653, 7655], [7654, 7656, 7695], [7655, 7657], [7542, 7656, 7658], [7657, 7659], [7658, 7660, 7696], [7659, 7661], [7543, 7660, 7662], [7661, 7663], [7662, 7664, 7697], [7663, 7665], [7544, 7664, 7666], [7665, 7667], [7666, 7698], [7547, 7701], [7551, 7705], [7555, 7709], [7559, 7713], [7563, 7717], [7567, 7721], [7571, 7725], [7575, 7729], [7579, 7733], [7583, 7737], [7587, 7741], [7591, 7745], [7595, 7749], [7599, 7753], [7603, 7757], [7607, 7761], [7611, 7765], [7615, 7769], [7619, 7773], [7623, 7777], [7627, 7781], [7631, 7785], [7635, 7789], [7639, 7793], [7643, 7797], [7647, 7801], [7651, 7805], [7655, 7809], [7659, 7813], [7663, 7817], [7667, 7821], [7700, 7822], [7699, 7701], [7668, 7700, 7702], [7701, 7703], [7702, 7704, 7823], [7703, 7705], [7669, 7704, 7706], [7705, 7707], [7706, 7708, 7824], [7707, 7709], [7670, 7708, 7710], [7709, 7711], [7710, 7712, 7825], [7711, 7713], [7671, 7712, 7714], [7713, 7715], [7714, 7716, 7826], [7715, 7717], [7672, 7716, 7718], [7717, 7719], [7718, 7720, 7827], [7719, 7721], [7673, 7720, 7722], [7721, 7723], [7722, 7724, 7828], [7723, 7725], [7674, 7724, 7726], [7725, 7727], [7726, 7728, 7829], [7727, 7729], [7675, 7728, 7730], [7729, 7731], [7730, 7732, 7830], [7731, 7733], [7676, 7732, 7734], [7733, 7735], [7734, 7736, 7831], [7735, 7737], [7677, 7736, 7738], [7737, 7739], [7738, 7740, 7832], [7739, 7741], [7678, 7740, 7742], [7741, 7743], [7742, 7744, 7833], [7743, 7745], [7679, 7744, 7746], [7745, 7747], [7746, 7748, 7834], [7747, 7749], [7680, 7748, 7750], [7749, 7751], [7750, 7752, 7835], [7751, 7753], [7681, 7752, 7754], [7753, 7755], [7754, 7756, 7836], [7755, 7757], [7682, 7756, 7758], [7757, 7759], [7758, 7760, 7837], [7759, 7761], [7683, 7760, 7762], [7761, 7763], [7762, 7764, 7838], [7763, 7765], [7684, 7764, 7766], [7765, 7767], [7766, 7768, 7839], [7767, 7769], [7685, 7768, 7770], [7769, 7771], [7770, 7772, 7840], [7771, 7773], [7686, 7772, 7774], [7773, 7775], [7774, 7776, 7841], [7775, 7777], [7687, 7776, 7778], [7777, 7779], [7778, 7780, 7842], [7779, 7781], [7688, 7780, 7782], [7781, 7783], [7782, 7784, 7843], [7783, 7785], [7689, 7784, 7786], [7785, 7787], [7786, 7788, 7844], [7787, 7789], [7690, 7788, 7790], [7789, 7791], [7790, 7792, 7845], [7791, 7793], [7691, 7792, 7794], [7793, 7795], [7794, 7796, 7846], [7795, 7797], [7692, 7796, 7798], [7797, 7799], [7798, 7800, 7847], [7799, 7801], [7693, 7800, 7802], [7801, 7803], [7802, 7804, 7848], [7803, 7805], [7694, 7804, 7806], [7805, 7807], [7806, 7808, 7849], [7807, 7809], [7695, 7808, 7810], [7809, 7811], [7810, 7812, 7850], [7811, 7813], [7696, 7812, 7814], [7813, 7815], [7814, 7816, 7851], [7815, 7817], [7697, 7816, 7818], [7817, 7819], [7818, 7820, 7852], [7819, 7821], [7698, 7820], [7699, 7853], [7703, 7857], [7707, 7861], [7711, 7865], [7715, 7869], [7719, 7873], [7723, 7877], [7727, 7881], [7731, 7885], [7735, 7889], [7739, 7893], [7743, 7897], [7747, 7901], [7751, 7905], [7755, 7909], [7759, 7913], [7763, 7917], [7767, 7921], [7771, 7925], [7775, 7929], [7779, 7933], [7783, 7937], [7787, 7941], [7791, 7945], [7795, 7949], [7799, 7953], [7803, 7957], [7807, 7961], [7811, 7965], [7815, 7969], [7819, 7973], [7822, 7854], [7853, 7855], [7854, 7856, 7976], [7855, 7857], [7823, 7856, 7858], [7857, 7859], [7858, 7860, 7977], [7859, 7861], [7824, 7860, 7862], [7861, 7863], [7862, 7864, 7978], [7863, 7865], [7825, 7864, 7866], [7865, 7867], [7866, 7868, 7979], [7867, 7869], [7826, 7868, 7870], [7869, 7871], [7870, 7872, 7980], [7871, 7873], [7827, 7872, 7874], [7873, 7875], [7874, 7876, 7981], [7875, 7877], [7828, 7876, 7878], [7877, 7879], [7878, 7880, 7982], [7879, 7881], [7829, 7880, 7882], [7881, 7883], [7882, 7884, 7983], [7883, 7885], [7830, 7884, 7886], [7885, 7887], [7886, 7888, 7984], [7887, 7889], [7831, 7888, 7890], [7889, 7891], [7890, 7892, 7985], [7891, 7893], [7832, 7892, 7894], [7893, 7895], [7894, 7896, 7986], [7895, 7897], [7833, 7896, 7898], [7897, 7899], [7898, 7900, 7987], [7899, 7901], [7834, 7900, 7902], [7901, 7903], [7902, 7904, 7988], [7903, 7905], [7835, 7904, 7906], [7905, 7907], [7906, 7908, 7989], [7907, 7909], [7836, 7908, 7910], [7909, 7911], [7910, 7912, 7990], [7911, 7913], [7837, 7912, 7914], [7913, 7915], [7914, 7916, 7991], [7915, 7917], [7838, 7916, 7918], [7917, 7919], [7918, 7920, 7992], [7919, 7921], [7839, 7920, 7922], [7921, 7923], [7922, 7924, 7993], [7923, 7925], [7840, 7924, 7926], [7925, 7927], [7926, 7928, 7994], [7927, 7929], [7841, 7928, 7930], [7929, 7931], [7930, 7932, 7995], [7931, 7933], [7842, 7932, 7934], [7933, 7935], [7934, 7936, 7996], [7935, 7937], [7843, 7936, 7938], [7937, 7939], [7938, 7940, 7997], [7939, 7941], [7844, 7940, 7942], [7941, 7943], [7942, 7944, 7998], [7943, 7945], [7845, 7944, 7946], [7945, 7947], [7946, 7948, 7999], [7947, 7949], [7846, 7948, 7950], [7949, 7951], [7950, 7952, 8000], [7951, 7953], [7847, 7952, 7954], [7953, 7955], [7954, 7956, 8001], [7955, 7957], [7848, 7956, 7958], [7957, 7959], [7958, 7960, 8002], [7959, 7961], [7849, 7960, 7962], [7961, 7963], [7962, 7964, 8003], [7963, 7965], [7850, 7964, 7966], [7965, 7967], [7966, 7968, 8004], [7967, 7969], [7851, 7968, 7970], [7969, 7971], [7970, 7972, 8005], [7971, 7973], [7852, 7972, 7974], [7973, 7975], [7974, 8006], [7855, 8009], [7859, 8013], [7863, 8017], [7867, 8021], [7871, 8025], [7875, 8029], [7879, 8033], [7883, 8037], [7887, 8041], [7891, 8045], [7895, 8049], [7899, 8053], [7903, 8057], [7907, 8061], [7911, 8065], [7915, 8069], [7919, 8073], [7923, 8077], [7927, 8081], [7931, 8085], [7935, 8089], [7939, 8093], [7943, 8097], [7947, 8101], [7951, 8105], [7955, 8109], [7959, 8113], [7963, 8117], [7967, 8121], [7971, 8125], [7975, 8129], [8008, 8130], [8007, 8009], [7976, 8008, 8010], [8009, 8011], [8010, 8012, 8131], [8011, 8013], [7977, 8012, 8014], [8013, 8015], [8014, 8016, 8132], [8015, 8017], [7978, 8016, 8018], [8017, 8019], [8018, 8020, 8133], [8019, 8021], [7979, 8020, 8022], [8021, 8023], [8022, 8024, 8134], [8023, 8025], [7980, 8024, 8026], [8025, 8027], [8026, 8028, 8135], [8027, 8029], [7981, 8028, 8030], [8029, 8031], [8030, 8032, 8136], [8031, 8033], [7982, 8032, 8034], [8033, 8035], [8034, 8036, 8137], [8035, 8037], [7983, 8036, 8038], [8037, 8039], [8038, 8040, 8138], [8039, 8041], [7984, 8040, 8042], [8041, 8043], [8042, 8044, 8139], [8043, 8045], [7985, 8044, 8046], [8045, 8047], [8046, 8048, 8140], [8047, 8049], [7986, 8048, 8050], [8049, 8051], [8050, 8052, 8141], [8051, 8053], [7987, 8052, 8054], [8053, 8055], [8054, 8056, 8142], [8055, 8057], [7988, 8056, 8058], [8057, 8059], [8058, 8060, 8143], [8059, 8061], [7989, 8060, 8062], [8061, 8063], [8062, 8064, 8144], [8063, 8065], [7990, 8064, 8066], [8065, 8067], [8066, 8068, 8145], [8067, 8069], [7991, 8068, 8070], [8069, 8071], [8070, 8072, 8146], [8071, 8073], [7992, 8072, 8074], [8073, 8075], [8074, 8076, 8147], [8075, 8077], [7993, 8076, 8078], [8077, 8079], [8078, 8080, 8148], [8079, 8081], [7994, 8080, 8082], [8081, 8083], [8082, 8084, 8149], [8083, 8085], [7995, 8084, 8086], [8085, 8087], [8086, 8088, 8150], [8087, 8089], [7996, 8088, 8090], [8089, 8091], [8090, 8092, 8151], [8091, 8093], [7997, 8092, 8094], [8093, 8095], [8094, 8096, 8152], [8095, 8097], [7998, 8096, 8098], [8097, 8099], [8098, 8100, 8153], [8099, 8101], [7999, 8100, 8102], [8101, 8103], [8102, 8104, 8154], [8103, 8105], [8000, 8104, 8106], [8105, 8107], [8106, 8108, 8155], [8107, 8109], [8001, 8108, 8110], [8109, 8111], [8110, 8112, 8156], [8111, 8113], [8002, 8112, 8114], [8113, 8115], [8114, 8116, 8157], [8115, 8117], [8003, 8116, 8118], [8117, 8119], [8118, 8120, 8158], [8119, 8121], [8004, 8120, 8122], [8121, 8123], [8122, 8124, 8159], [8123, 8125], [8005, 8124, 8126], [8125, 8127], [8126, 8128, 8160], [8127, 8129], [8006, 8128], [8007, 8161], [8011, 8165], [8015, 8169], [8019, 8173], [8023, 8177], [8027, 8181], [8031, 8185], [8035, 8189], [8039, 8193], [8043, 8197], [8047, 8201], [8051, 8205], [8055, 8209], [8059, 8213], [8063, 8217], [8067, 8221], [8071, 8225], [8075, 8229], [8079, 8233], [8083, 8237], [8087, 8241], [8091, 8245], [8095, 8249], [8099, 8253], [8103, 8257], [8107, 8261], [8111, 8265], [8115, 8269], [8119, 8273], [8123, 8277], [8127, 8281], [8130, 8162], [8161, 8163], [8162, 8164, 8284], [8163, 8165], [8131, 8164, 8166], [8165, 8167], [8166, 8168, 8285], [8167, 8169], [8132, 8168, 8170], [8169, 8171], [8170, 8172, 8286], [8171, 8173], [8133, 8172, 8174], [8173, 8175], [8174, 8176, 8287], [8175, 8177], [8134, 8176, 8178], [8177, 8179], [8178, 8180, 8288], [8179, 8181], [8135, 8180, 8182], [8181, 8183], [8182, 8184, 8289], [8183, 8185], [8136, 8184, 8186], [8185, 8187], [8186, 8188, 8290], [8187, 8189], [8137, 8188, 8190], [8189, 8191], [8190, 8192, 8291], [8191, 8193], [8138, 8192, 8194], [8193, 8195], [8194, 8196, 8292], [8195, 8197], [8139, 8196, 8198], [8197, 8199], [8198, 8200, 8293], [8199, 8201], [8140, 8200, 8202], [8201, 8203], [8202, 8204, 8294], [8203, 8205], [8141, 8204, 8206], [8205, 8207], [8206, 8208, 8295], [8207, 8209], [8142, 8208, 8210], [8209, 8211], [8210, 8212, 8296], [8211, 8213], [8143, 8212, 8214], [8213, 8215], [8214, 8216, 8297], [8215, 8217], [8144, 8216, 8218], [8217, 8219], [8218, 8220, 8298], [8219, 8221], [8145, 8220, 8222], [8221, 8223], [8222, 8224, 8299], [8223, 8225], [8146, 8224, 8226], [8225, 8227], [8226, 8228, 8300], [8227, 8229], [8147, 8228, 8230], [8229, 8231], [8230, 8232, 8301], [8231, 8233], [8148, 8232, 8234], [8233, 8235], [8234, 8236, 8302], [8235, 8237], [8149, 8236, 8238], [8237, 8239], [8238, 8240, 8303], [8239, 8241], [8150, 8240, 8242], [8241, 8243], [8242, 8244, 8304], [8243, 8245], [8151, 8244, 8246], [8245, 8247], [8246, 8248, 8305], [8247, 8249], [8152, 8248, 8250], [8249, 8251], [8250, 8252, 8306], [8251, 8253], [8153, 8252, 8254], [8253, 8255], [8254, 8256, 8307], [8255, 8257], [8154, 8256, 8258], [8257, 8259], [8258, 8260, 8308], [8259, 8261], [8155, 8260, 8262], [8261, 8263], [8262, 8264, 8309], [8263, 8265], [8156, 8264, 8266], [8265, 8267], [8266, 8268, 8310], [8267, 8269], [8157, 8268, 8270], [8269, 8271], [8270, 8272, 8311], [8271, 8273], [8158, 8272, 8274], [8273, 8275], [8274, 8276, 8312], [8275, 8277], [8159, 8276, 8278], [8277, 8279], [8278, 8280, 8313], [8279, 8281], [8160, 8280, 8282], [8281, 8283], [8282, 8314], [8163, 8317], [8167, 8321], [8171, 8325], [8175, 8329], [8179, 8333], [8183, 8337], [8187, 8341], [8191, 8345], [8195, 8349], [8199, 8353], [8203, 8357], [8207, 8361], [8211, 8365], [8215, 8369], [8219, 8373], [8223, 8377], [8227, 8381], [8231, 8385], [8235, 8389], [8239, 8393], [8243, 8397], [8247, 8401], [8251, 8405], [8255, 8409], [8259, 8413], [8263, 8417], [8267, 8421], [8271, 8425], [8275, 8429], [8279, 8433], [8283, 8437], [8316, 8438], [8315, 8317], [8284, 8316, 8318], [8317, 8319], [8318, 8320, 8439], [8319, 8321], [8285, 8320, 8322], [8321, 8323], [8322, 8324, 8440], [8323, 8325], [8286, 8324, 8326], [8325, 8327], [8326, 8328, 8441], [8327, 8329], [8287, 8328, 8330], [8329, 8331], [8330, 8332, 8442], [8331, 8333], [8288, 8332, 8334], [8333, 8335], [8334, 8336, 8443], [8335, 8337], [8289, 8336, 8338], [8337, 8339], [8338, 8340, 8444], [8339, 8341], [8290, 8340, 8342], [8341, 8343], [8342, 8344, 8445], [8343, 8345], [8291, 8344, 8346], [8345, 8347], [8346, 8348, 8446], [8347, 8349], [8292, 8348, 8350], [8349, 8351], [8350, 8352, 8447], [8351, 8353], [8293, 8352, 8354], [8353, 8355], [8354, 8356, 8448], [8355, 8357], [8294, 8356, 8358], [8357, 8359], [8358, 8360, 8449], [8359, 8361], [8295, 8360, 8362], [8361, 8363], [8362, 8364, 8450], [8363, 8365], [8296, 8364, 8366], [8365, 8367], [8366, 8368, 8451], [8367, 8369], [8297, 8368, 8370], [8369, 8371], [8370, 8372, 8452], [8371, 8373], [8298, 8372, 8374], [8373, 8375], [8374, 8376, 8453], [8375, 8377], [8299, 8376, 8378], [8377, 8379], [8378, 8380, 8454], [8379, 8381], [8300, 8380, 8382], [8381, 8383], [8382, 8384, 8455], [8383, 8385], [8301, 8384, 8386], [8385, 8387], [8386, 8388, 8456], [8387, 8389], [8302, 8388, 8390], [8389, 8391], [8390, 8392, 8457], [8391, 8393], [8303, 8392, 8394], [8393, 8395], [8394, 8396, 8458], [8395, 8397], [8304, 8396, 8398], [8397, 8399], [8398, 8400, 8459], [8399, 8401], [8305, 8400, 8402], [8401, 8403], [8402, 8404, 8460], [8403, 8405], [8306, 8404, 8406], [8405, 8407], [8406, 8408, 8461], [8407, 8409], [8307, 8408, 8410], [8409, 8411], [8410, 8412, 8462], [8411, 8413], [8308, 8412, 8414], [8413, 8415], [8414, 8416, 8463], [8415, 8417], [8309, 8416, 8418], [8417, 8419], [8418, 8420, 8464], [8419, 8421], [8310, 8420, 8422], [8421, 8423], [8422, 8424, 8465], [8423, 8425], [8311, 8424, 8426], [8425, 8427], [8426, 8428, 8466], [8427, 8429], [8312, 8428, 8430], [8429, 8431], [8430, 8432, 8467], [8431, 8433], [8313, 8432, 8434], [8433, 8435], [8434, 8436, 8468], [8435, 8437], [8314, 8436], [8315, 8469], [8319, 8473], [8323, 8477], [8327, 8481], [8331, 8485], [8335, 8489], [8339, 8493], [8343, 8497], [8347, 8501], [8351, 8505], [8355, 8509], [8359, 8513], [8363, 8517], [8367, 8521], [8371, 8525], [8375, 8529], [8379, 8533], [8383, 8537], [8387, 8541], [8391, 8545], [8395, 8549], [8399, 8553], [8403, 8557], [8407, 8561], [8411, 8565], [8415, 8569], [8419, 8573], [8423, 8577], [8427, 8581], [8431, 8585], [8435, 8589], [8438, 8470], [8469, 8471], [8470, 8472, 8592], [8471, 8473], [8439, 8472, 8474], [8473, 8475], [8474, 8476, 8593], [8475, 8477], [8440, 8476, 8478], [8477, 8479], [8478, 8480, 8594], [8479, 8481], [8441, 8480, 8482], [8481, 8483], [8482, 8484, 8595], [8483, 8485], [8442, 8484, 8486], [8485, 8487], [8486, 8488, 8596], [8487, 8489], [8443, 8488, 8490], [8489, 8491], [8490, 8492, 8597], [8491, 8493], [8444, 8492, 8494], [8493, 8495], [8494, 8496, 8598], [8495, 8497], [8445, 8496, 8498], [8497, 8499], [8498, 8500, 8599], [8499, 8501], [8446, 8500, 8502], [8501, 8503], [8502, 8504, 8600], [8503, 8505], [8447, 8504, 8506], [8505, 8507], [8506, 8508, 8601], [8507, 8509], [8448, 8508, 8510], [8509, 8511], [8510, 8512, 8602], [8511, 8513], [8449, 8512, 8514], [8513, 8515], [8514, 8516, 8603], [8515, 8517], [8450, 8516, 8518], [8517, 8519], [8518, 8520, 8604], [8519, 8521], [8451, 8520, 8522], [8521, 8523], [8522, 8524, 8605], [8523, 8525], [8452, 8524, 8526], [8525, 8527], [8526, 8528, 8606], [8527, 8529], [8453, 8528, 8530], [8529, 8531], [8530, 8532, 8607], [8531, 8533], [8454, 8532, 8534], [8533, 8535], [8534, 8536, 8608], [8535, 8537], [8455, 8536, 8538], [8537, 8539], [8538, 8540, 8609], [8539, 8541], [8456, 8540, 8542], [8541, 8543], [8542, 8544, 8610], [8543, 8545], [8457, 8544, 8546], [8545, 8547], [8546, 8548, 8611], [8547, 8549], [8458, 8548, 8550], [8549, 8551], [8550, 8552, 8612], [8551, 8553], [8459, 8552, 8554], [8553, 8555], [8554, 8556, 8613], [8555, 8557], [8460, 8556, 8558], [8557, 8559], [8558, 8560, 8614], [8559, 8561], [8461, 8560, 8562], [8561, 8563], [8562, 8564, 8615], [8563, 8565], [8462, 8564, 8566], [8565, 8567], [8566, 8568, 8616], [8567, 8569], [8463, 8568, 8570], [8569, 8571], [8570, 8572, 8617], [8571, 8573], [8464, 8572, 8574], [8573, 8575], [8574, 8576, 8618], [8575, 8577], [8465, 8576, 8578], [8577, 8579], [8578, 8580, 8619], [8579, 8581], [8466, 8580, 8582], [8581, 8583], [8582, 8584, 8620], [8583, 8585], [8467, 8584, 8586], [8585, 8587], [8586, 8588, 8621], [8587, 8589], [8468, 8588, 8590], [8589, 8591], [8590, 8622], [8471, 8625], [8475, 8629], [8479, 8633], [8483, 8637], [8487, 8641], [8491, 8645], [8495, 8649], [8499, 8653], [8503, 8657], [8507, 8661], [8511, 8665], [8515, 8669], [8519, 8673], [8523, 8677], [8527, 8681], [8531, 8685], [8535, 8689], [8539, 8693], [8543, 8697], [8547, 8701], [8551, 8705], [8555, 8709], [8559, 8713], [8563, 8717], [8567, 8721], [8571, 8725], [8575, 8729], [8579, 8733], [8583, 8737], [8587, 8741], [8591, 8745], [8624, 8746], [8623, 8625], [8592, 8624, 8626], [8625, 8627], [8626, 8628, 8747], [8627, 8629], [8593, 8628, 8630], [8629, 8631], [8630, 8632, 8748], [8631, 8633], [8594, 8632, 8634], [8633, 8635], [8634, 8636, 8749], [8635, 8637], [8595, 8636, 8638], [8637, 8639], [8638, 8640, 8750], [8639, 8641], [8596, 8640, 8642], [8641, 8643], [8642, 8644, 8751], [8643, 8645], [8597, 8644, 8646], [8645, 8647], [8646, 8648, 8752], [8647, 8649], [8598, 8648, 8650], [8649, 8651], [8650, 8652, 8753], [8651, 8653], [8599, 8652, 8654], [8653, 8655], [8654, 8656, 8754], [8655, 8657], [8600, 8656, 8658], [8657, 8659], [8658, 8660, 8755], [8659, 8661], [8601, 8660, 8662], [8661, 8663], [8662, 8664, 8756], [8663, 8665], [8602, 8664, 8666], [8665, 8667], [8666, 8668, 8757], [8667, 8669], [8603, 8668, 8670], [8669, 8671], [8670, 8672, 8758], [8671, 8673], [8604, 8672, 8674], [8673, 8675], [8674, 8676, 8759], [8675, 8677], [8605, 8676, 8678], [8677, 8679], [8678, 8680, 8760], [8679, 8681], [8606, 8680, 8682], [8681, 8683], [8682, 8684, 8761], [8683, 8685], [8607, 8684, 8686], [8685, 8687], [8686, 8688, 8762], [8687, 8689], [8608, 8688, 8690], [8689, 8691], [8690, 8692, 8763], [8691, 8693], [8609, 8692, 8694], [8693, 8695], [8694, 8696, 8764], [8695, 8697], [8610, 8696, 8698], [8697, 8699], [8698, 8700, 8765], [8699, 8701], [8611, 8700, 8702], [8701, 8703], [8702, 8704, 8766], [8703, 8705], [8612, 8704, 8706], [8705, 8707], [8706, 8708, 8767], [8707, 8709], [8613, 8708, 8710], [8709, 8711], [8710, 8712, 8768], [8711, 8713], [8614, 8712, 8714], [8713, 8715], [8714, 8716, 8769], [8715, 8717], [8615, 8716, 8718], [8717, 8719], [8718, 8720, 8770], [8719, 8721], [8616, 8720, 8722], [8721, 8723], [8722, 8724, 8771], [8723, 8725], [8617, 8724, 8726], [8725, 8727], [8726, 8728, 8772], [8727, 8729], [8618, 8728, 8730], [8729, 8731], [8730, 8732, 8773], [8731, 8733], [8619, 8732, 8734], [8733, 8735], [8734, 8736, 8774], [8735, 8737], [8620, 8736, 8738], [8737, 8739], [8738, 8740, 8775], [8739, 8741], [8621, 8740, 8742], [8741, 8743], [8742, 8744, 8776], [8743, 8745], [8622, 8744], [8623, 8777], [8627, 8781], [8631, 8785], [8635, 8789], [8639, 8793], [8643, 8797], [8647, 8801], [8651, 8805], [8655, 8809], [8659, 8813], [8663, 8817], [8667, 8821], [8671, 8825], [8675, 8829], [8679, 8833], [8683, 8837], [8687, 8841], [8691, 8845], [8695, 8849], [8699, 8853], [8703, 8857], [8707, 8861], [8711, 8865], [8715, 8869], [8719, 8873], [8723, 8877], [8727, 8881], [8731, 8885], [8735, 8889], [8739, 8893], [8743, 8897], [8746, 8778], [8777, 8779], [8778, 8780, 8900], [8779, 8781], [8747, 8780, 8782], [8781, 8783], [8782, 8784, 8901], [8783, 8785], [8748, 8784, 8786], [8785, 8787], [8786, 8788, 8902], [8787, 8789], [8749, 8788, 8790], [8789, 8791], [8790, 8792, 8903], [8791, 8793], [8750, 8792, 8794], [8793, 8795], [8794, 8796, 8904], [8795, 8797], [8751, 8796, 8798], [8797, 8799], [8798, 8800, 8905], [8799, 8801], [8752, 8800, 8802], [8801, 8803], [8802, 8804, 8906], [8803, 8805], [8753, 8804, 8806], [8805, 8807], [8806, 8808, 8907], [8807, 8809], [8754, 8808, 8810], [8809, 8811], [8810, 8812, 8908], [8811, 8813], [8755, 8812, 8814], [8813, 8815], [8814, 8816, 8909], [8815, 8817], [8756, 8816, 8818], [8817, 8819], [8818, 8820, 8910], [8819, 8821], [8757, 8820, 8822], [8821, 8823], [8822, 8824, 8911], [8823, 8825], [8758, 8824, 8826], [8825, 8827], [8826, 8828, 8912], [8827, 8829], [8759, 8828, 8830], [8829, 8831], [8830, 8832, 8913], [8831, 8833], [8760, 8832, 8834], [8833, 8835], [8834, 8836, 8914], [8835, 8837], [8761, 8836, 8838], [8837, 8839], [8838, 8840, 8915], [8839, 8841], [8762, 8840, 8842], [8841, 8843], [8842, 8844, 8916], [8843, 8845], [8763, 8844, 8846], [8845, 8847], [8846, 8848, 8917], [8847, 8849], [8764, 8848, 8850], [8849, 8851], [8850, 8852, 8918], [8851, 8853], [8765, 8852, 8854], [8853, 8855], [8854, 8856, 8919], [8855, 8857], [8766, 8856, 8858], [8857, 8859], [8858, 8860, 8920], [8859, 8861], [8767, 8860, 8862], [8861, 8863], [8862, 8864, 8921], [8863, 8865], [8768, 8864, 8866], [8865, 8867], [8866, 8868, 8922], [8867, 8869], [8769, 8868, 8870], [8869, 8871], [8870, 8872, 8923], [8871, 8873], [8770, 8872, 8874], [8873, 8875], [8874, 8876, 8924], [8875, 8877], [8771, 8876, 8878], [8877, 8879], [8878, 8880, 8925], [8879, 8881], [8772, 8880, 8882], [8881, 8883], [8882, 8884, 8926], [8883, 8885], [8773, 8884, 8886], [8885, 8887], [8886, 8888, 8927], [8887, 8889], [8774, 8888, 8890], [8889, 8891], [8890, 8892, 8928], [8891, 8893], [8775, 8892, 8894], [8893, 8895], [8894, 8896, 8929], [8895, 8897], [8776, 8896, 8898], [8897, 8899], [8898, 8930], [8779, 8933], [8783, 8937], [8787, 8941], [8791, 8945], [8795, 8949], [8799, 8953], [8803, 8957], [8807, 8961], [8811, 8965], [8815, 8969], [8819, 8973], [8823, 8977], [8827, 8981], [8831, 8985], [8835, 8989], [8839, 8993], [8843, 8997], [8847, 9001], [8851, 9005], [8855, 9009], [8859, 9013], [8863, 9017], [8867, 9021], [8871, 9025], [8875, 9029], [8879, 9033], [8883, 9037], [8887, 9041], [8891, 9045], [8895, 9049], [8899, 9053], [8932, 9054], [8931, 8933], [8900, 8932, 8934], [8933, 8935], [8934, 8936, 9055], [8935, 8937], [8901, 8936, 8938], [8937, 8939], [8938, 8940, 9056], [8939, 8941], [8902, 8940, 8942], [8941, 8943], [8942, 8944, 9057], [8943, 8945], [8903, 8944, 8946], [8945, 8947], [8946, 8948, 9058], [8947, 8949], [8904, 8948, 8950], [8949, 8951], [8950, 8952, 9059], [8951, 8953], [8905, 8952, 8954], [8953, 8955], [8954, 8956, 9060], [8955, 8957], [8906, 8956, 8958], [8957, 8959], [8958, 8960, 9061], [8959, 8961], [8907, 8960, 8962], [8961, 8963], [8962, 8964, 9062], [8963, 8965], [8908, 8964, 8966], [8965, 8967], [8966, 8968, 9063], [8967, 8969], [8909, 8968, 8970], [8969, 8971], [8970, 8972, 9064], [8971, 8973], [8910, 8972, 8974], [8973, 8975], [8974, 8976, 9065], [8975, 8977], [8911, 8976, 8978], [8977, 8979], [8978, 8980, 9066], [8979, 8981], [8912, 8980, 8982], [8981, 8983], [8982, 8984, 9067], [8983, 8985], [8913, 8984, 8986], [8985, 8987], [8986, 8988, 9068], [8987, 8989], [8914, 8988, 8990], [8989, 8991], [8990, 8992, 9069], [8991, 8993], [8915, 8992, 8994], [8993, 8995], [8994, 8996, 9070], [8995, 8997], [8916, 8996, 8998], [8997, 8999], [8998, 9000, 9071], [8999, 9001], [8917, 9000, 9002], [9001, 9003], [9002, 9004, 9072], [9003, 9005], [8918, 9004, 9006], [9005, 9007], [9006, 9008, 9073], [9007, 9009], [8919, 9008, 9010], [9009, 9011], [9010, 9012, 9074], [9011, 9013], [8920, 9012, 9014], [9013, 9015], [9014, 9016, 9075], [9015, 9017], [8921, 9016, 9018], [9017, 9019], [9018, 9020, 9076], [9019, 9021], [8922, 9020, 9022], [9021, 9023], [9022, 9024, 9077], [9023, 9025], [8923, 9024, 9026], [9025, 9027], [9026, 9028, 9078], [9027, 9029], [8924, 9028, 9030], [9029, 9031], [9030, 9032, 9079], [9031, 9033], [8925, 9032, 9034], [9033, 9035], [9034, 9036, 9080], [9035, 9037], [8926, 9036, 9038], [9037, 9039], [9038, 9040, 9081], [9039, 9041], [8927, 9040, 9042], [9041, 9043], [9042, 9044, 9082], [9043, 9045], [8928, 9044, 9046], [9045, 9047], [9046, 9048, 9083], [9047, 9049], [8929, 9048, 9050], [9049, 9051], [9050, 9052, 9084], [9051, 9053], [8930, 9052], [8931, 9085], [8935, 9089], [8939, 9093], [8943, 9097], [8947, 9101], [8951, 9105], [8955, 9109], [8959, 9113], [8963, 9117], [8967, 9121], [8971, 9125], [8975, 9129], [8979, 9133], [8983, 9137], [8987, 9141], [8991, 9145], [8995, 9149], [8999, 9153], [9003, 9157], [9007, 9161], [9011, 9165], [9015, 9169], [9019, 9173], [9023, 9177], [9027, 9181], [9031, 9185], [9035, 9189], [9039, 9193], [9043, 9197], [9047, 9201], [9051, 9205], [9054, 9086], [9085, 9087], [9086, 9088, 9208], [9087, 9089], [9055, 9088, 9090], [9089, 9091], [9090, 9092, 9209], [9091, 9093], [9056, 9092, 9094], [9093, 9095], [9094, 9096, 9210], [9095, 9097], [9057, 9096, 9098], [9097, 9099], [9098, 9100, 9211], [9099, 9101], [9058, 9100, 9102], [9101, 9103], [9102, 9104, 9212], [9103, 9105], [9059, 9104, 9106], [9105, 9107], [9106, 9108, 9213], [9107, 9109], [9060, 9108, 9110], [9109, 9111], [9110, 9112, 9214], [9111, 9113], [9061, 9112, 9114], [9113, 9115], [9114, 9116, 9215], [9115, 9117], [9062, 9116, 9118], [9117, 9119], [9118, 9120, 9216], [9119, 9121], [9063, 9120, 9122], [9121, 9123], [9122, 9124, 9217], [9123, 9125], [9064, 9124, 9126], [9125, 9127], [9126, 9128, 9218], [9127, 9129], [9065, 9128, 9130], [9129, 9131], [9130, 9132, 9219], [9131, 9133], [9066, 9132, 9134], [9133, 9135], [9134, 9136, 9220], [9135, 9137], [9067, 9136, 9138], [9137, 9139], [9138, 9140, 9221], [9139, 9141], [9068, 9140, 9142], [9141, 9143], [9142, 9144, 9222], [9143, 9145], [9069, 9144, 9146], [9145, 9147], [9146, 9148, 9223], [9147, 9149], [9070, 9148, 9150], [9149, 9151], [9150, 9152, 9224], [9151, 9153], [9071, 9152, 9154], [9153, 9155], [9154, 9156, 9225], [9155, 9157], [9072, 9156, 9158], [9157, 9159], [9158, 9160, 9226], [9159, 9161], [9073, 9160, 9162], [9161, 9163], [9162, 9164, 9227], [9163, 9165], [9074, 9164, 9166], [9165, 9167], [9166, 9168, 9228], [9167, 9169], [9075, 9168, 9170], [9169, 9171], [9170, 9172, 9229], [9171, 9173], [9076, 9172, 9174], [9173, 9175], [9174, 9176, 9230], [9175, 9177], [9077, 9176, 9178], [9177, 9179], [9178, 9180, 9231], [9179, 9181], [9078, 9180, 9182], [9181, 9183], [9182, 9184, 9232], [9183, 9185], [9079, 9184, 9186], [9185, 9187], [9186, 9188, 9233], [9187, 9189], [9080, 9188, 9190], [9189, 9191], [9190, 9192, 9234], [9191, 9193], [9081, 9192, 9194], [9193, 9195], [9194, 9196, 9235], [9195, 9197], [9082, 9196, 9198], [9197, 9199], [9198, 9200, 9236], [9199, 9201], [9083, 9200, 9202], [9201, 9203], [9202, 9204, 9237], [9203, 9205], [9084, 9204, 9206], [9205, 9207], [9206, 9238], [9087, 9240], [9091, 9244], [9095, 9248], [9099, 9252], [9103, 9256], [9107, 9260], [9111, 9264], [9115, 9268], [9119, 9272], [9123, 9276], [9127, 9280], [9131, 9284], [9135, 9288], [9139, 9292], [9143, 9296], [9147, 9300], [9151, 9304], [9155, 9308], [9159, 9312], [9163, 9316], [9167, 9320], [9171, 9324], [9175, 9328], [9179, 9332], [9183, 9336], [9187, 9340], [9191, 9344], [9195, 9348], [9199, 9352], [9203, 9356], [9207, 9360], [9240], [9208, 9239, 9241], [9240, 9242], [9241, 9243], [9242, 9244], [9209, 9243, 9245], [9244, 9246], [9245, 9247], [9246, 9248], [9210, 9247, 9249], [9248, 9250], [9249, 9251], [9250, 9252], [9211, 9251, 9253], [9252, 9254], [9253, 9255], [9254, 9256], [9212, 9255, 9257], [9256, 9258], [9257, 9259], [9258, 9260], [9213, 9259, 9261], [9260, 9262], [9261, 9263], [9262, 9264], [9214, 9263, 9265], [9264, 9266], [9265, 9267], [9266, 9268], [9215, 9267, 9269], [9268, 9270], [9269, 9271], [9270, 9272], [9216, 9271, 9273], [9272, 9274], [9273, 9275], [9274, 9276], [9217, 9275, 9277], [9276, 9278], [9277, 9279], [9278, 9280], [9218, 9279, 9281], [9280, 9282], [9281, 9283], [9282, 9284], [9219, 9283, 9285], [9284, 9286], [9285, 9287], [9286, 9288], [9220, 9287, 9289], [9288, 9290], [9289, 9291], [9290, 9292], [9221, 9291, 9293], [9292, 9294], [9293, 9295], [9294, 9296], [9222, 9295, 9297], [9296, 9298], [9297, 9299], [9298, 9300], [9223, 9299, 9301], [9300, 9302], [9301, 9303], [9302, 9304], [9224, 9303, 9305], [9304, 9306], [9305, 9307], [9306, 9308], [9225, 9307, 9309], [9308, 9310], [9309, 9311], [9310, 9312], [9226, 9311, 9313], [9312, 9314], [9313, 9315], [9314, 9316], [9227, 9315, 9317], [9316, 9318], [9317, 9319], [9318, 9320], [9228, 9319, 9321], [9320, 9322], [9321, 9323], [9322, 9324], [9229, 9323, 9325], [9324, 9326], [9325, 9327], [9326, 9328], [9230, 9327, 9329], [9328, 9330], [9329, 9331], [9330, 9332], [9231, 9331, 9333], [9332, 9334], [9333, 9335], [9334, 9336], [9232, 9335, 9337], [9336, 9338], [9337, 9339], [9338, 9340], [9233, 9339, 9341], [9340, 9342], [9341, 9343], [9342, 9344], [9234, 9343, 9345], [9344, 9346], [9345, 9347], [9346, 9348], [9235, 9347, 9349], [9348, 9350], [9349, 9351], [9350, 9352], [9236, 9351, 9353], [9352, 9354], [9353, 9355], [9354, 9356], [9237, 9355, 9357], [9356, 9358], [9357, 9359], [9358, 9360], [9238, 9359]] -CNOTTIME: [[1, 122], [0, 2], [1, 3], [2, 4], [3, 5, 123], [4, 6], [5, 7], [6, 8], [7, 9, 124], [8, 10], [9, 11], [10, 12], [11, 13, 125], [12, 14], [13, 15], [14, 16], [15, 17, 126], [16, 18], [17, 19], [18, 20], [19, 21, 127], [20, 22], [21, 23], [22, 24], [23, 25, 128], [24, 26], [25, 27], [26, 28], [27, 29, 129], [28, 30], [29, 31], [30, 32], [31, 33, 130], [32, 34], [33, 35], [34, 36], [35, 37, 131], [36, 38], [37, 39], [38, 40], [39, 41, 132], [40, 42], [41, 43], [42, 44], [43, 45, 133], [44, 46], [45, 47], [46, 48], [47, 49, 134], [48, 50], [49, 51], [50, 52], [51, 53, 135], [52, 54], [53, 55], [54, 56], [55, 57, 136], [56, 58], [57, 59], [58, 60], [59, 61, 137], [60, 62], [61, 63], [62, 64], [63, 65, 138], [64, 66], [65, 67], [66, 68], [67, 69, 139], [68, 70], [69, 71], [70, 72], [71, 73, 140], [72, 74], [73, 75], [74, 76], [75, 77, 141], [76, 78], [77, 79], [78, 80], [79, 81, 142], [80, 82], [81, 83], [82, 84], [83, 85, 143], [84, 86], [85, 87], [86, 88], [87, 89, 144], [88, 90], [89, 91], [90, 92], [91, 93, 145], [92, 94], [93, 95], [94, 96], [95, 97, 146], [96, 98], [97, 99], [98, 100], [99, 101, 147], [100, 102], [101, 103], [102, 104], [103, 105, 148], [104, 106], [105, 107], [106, 108], [107, 109, 149], [108, 110], [109, 111], [110, 112], [111, 113, 150], [112, 114], [113, 115], [114, 116], [115, 117, 151], [116, 118], [117, 119], [118, 120], [119, 121, 152], [120], [0, 153], [4, 157], [8, 161], [12, 165], [16, 169], [20, 173], [24, 177], [28, 181], [32, 185], [36, 189], [40, 193], [44, 197], [48, 201], [52, 205], [56, 209], [60, 213], [64, 217], [68, 221], [72, 225], [76, 229], [80, 233], [84, 237], [88, 241], [92, 245], [96, 249], [100, 253], [104, 257], [108, 261], [112, 265], [116, 269], [120, 273], [122, 154], [153, 155], [154, 156, 276], [155, 157], [123, 156, 158], [157, 159], [158, 160, 277], [159, 161], [124, 160, 162], [161, 163], [162, 164, 278], [163, 165], [125, 164, 166], [165, 167], [166, 168, 279], [167, 169], [126, 168, 170], [169, 171], [170, 172, 280], [171, 173], [127, 172, 174], [173, 175], [174, 176, 281], [175, 177], [128, 176, 178], [177, 179], [178, 180, 282], [179, 181], [129, 180, 182], [181, 183], [182, 184, 283], [183, 185], [130, 184, 186], [185, 187], [186, 188, 284], [187, 189], [131, 188, 190], [189, 191], [190, 192, 285], [191, 193], [132, 192, 194], [193, 195], [194, 196, 286], [195, 197], [133, 196, 198], [197, 199], [198, 200, 287], [199, 201], [134, 200, 202], [201, 203], [202, 204, 288], [203, 205], [135, 204, 206], [205, 207], [206, 208, 289], [207, 209], [136, 208, 210], [209, 211], [210, 212, 290], [211, 213], [137, 212, 214], [213, 215], [214, 216, 291], [215, 217], [138, 216, 218], [217, 219], [218, 220, 292], [219, 221], [139, 220, 222], [221, 223], [222, 224, 293], [223, 225], [140, 224, 226], [225, 227], [226, 228, 294], [227, 229], [141, 228, 230], [229, 231], [230, 232, 295], [231, 233], [142, 232, 234], [233, 235], [234, 236, 296], [235, 237], [143, 236, 238], [237, 239], [238, 240, 297], [239, 241], [144, 240, 242], [241, 243], [242, 244, 298], [243, 245], [145, 244, 246], [245, 247], [246, 248, 299], [247, 249], [146, 248, 250], [249, 251], [250, 252, 300], [251, 253], [147, 252, 254], [253, 255], [254, 256, 301], [255, 257], [148, 256, 258], [257, 259], [258, 260, 302], [259, 261], [149, 260, 262], [261, 263], [262, 264, 303], [263, 265], [150, 264, 266], [265, 267], [266, 268, 304], [267, 269], [151, 268, 270], [269, 271], [270, 272, 305], [271, 273], [152, 272, 274], [273, 275], [274, 306], [155, 309], [159, 313], [163, 317], [167, 321], [171, 325], [175, 329], [179, 333], [183, 337], [187, 341], [191, 345], [195, 349], [199, 353], [203, 357], [207, 361], [211, 365], [215, 369], [219, 373], [223, 377], [227, 381], [231, 385], [235, 389], [239, 393], [243, 397], [247, 401], [251, 405], [255, 409], [259, 413], [263, 417], [267, 421], [271, 425], [275, 429], [308, 430], [307, 309], [276, 308, 310], [309, 311], [310, 312, 431], [311, 313], [277, 312, 314], [313, 315], [314, 316, 432], [315, 317], [278, 316, 318], [317, 319], [318, 320, 433], [319, 321], [279, 320, 322], [321, 323], [322, 324, 434], [323, 325], [280, 324, 326], [325, 327], [326, 328, 435], [327, 329], [281, 328, 330], [329, 331], [330, 332, 436], [331, 333], [282, 332, 334], [333, 335], [334, 336, 437], [335, 337], [283, 336, 338], [337, 339], [338, 340, 438], [339, 341], [284, 340, 342], [341, 343], [342, 344, 439], [343, 345], [285, 344, 346], [345, 347], [346, 348, 440], [347, 349], [286, 348, 350], [349, 351], [350, 352, 441], [351, 353], [287, 352, 354], [353, 355], [354, 356, 442], [355, 357], [288, 356, 358], [357, 359], [358, 360, 443], [359, 361], [289, 360, 362], [361, 363], [362, 364, 444], [363, 365], [290, 364, 366], [365, 367], [366, 368, 445], [367, 369], [291, 368, 370], [369, 371], [370, 372, 446], [371, 373], [292, 372, 374], [373, 375], [374, 376, 447], [375, 377], [293, 376, 378], [377, 379], [378, 380, 448], [379, 381], [294, 380, 382], [381, 383], [382, 384, 449], [383, 385], [295, 384, 386], [385, 387], [386, 388, 450], [387, 389], [296, 388, 390], [389, 391], [390, 392, 451], [391, 393], [297, 392, 394], [393, 395], [394, 396, 452], [395, 397], [298, 396, 398], [397, 399], [398, 400, 453], [399, 401], [299, 400, 402], [401, 403], [402, 404, 454], [403, 405], [300, 404, 406], [405, 407], [406, 408, 455], [407, 409], [301, 408, 410], [409, 411], [410, 412, 456], [411, 413], [302, 412, 414], [413, 415], [414, 416, 457], [415, 417], [303, 416, 418], [417, 419], [418, 420, 458], [419, 421], [304, 420, 422], [421, 423], [422, 424, 459], [423, 425], [305, 424, 426], [425, 427], [426, 428, 460], [427, 429], [306, 428], [307, 461], [311, 465], [315, 469], [319, 473], [323, 477], [327, 481], [331, 485], [335, 489], [339, 493], [343, 497], [347, 501], [351, 505], [355, 509], [359, 513], [363, 517], [367, 521], [371, 525], [375, 529], [379, 533], [383, 537], [387, 541], [391, 545], [395, 549], [399, 553], [403, 557], [407, 561], [411, 565], [415, 569], [419, 573], [423, 577], [427, 581], [430, 462], [461, 463], [462, 464, 584], [463, 465], [431, 464, 466], [465, 467], [466, 468, 585], [467, 469], [432, 468, 470], [469, 471], [470, 472, 586], [471, 473], [433, 472, 474], [473, 475], [474, 476, 587], [475, 477], [434, 476, 478], [477, 479], [478, 480, 588], [479, 481], [435, 480, 482], [481, 483], [482, 484, 589], [483, 485], [436, 484, 486], [485, 487], [486, 488, 590], [487, 489], [437, 488, 490], [489, 491], [490, 492, 591], [491, 493], [438, 492, 494], [493, 495], [494, 496, 592], [495, 497], [439, 496, 498], [497, 499], [498, 500, 593], [499, 501], [440, 500, 502], [501, 503], [502, 504, 594], [503, 505], [441, 504, 506], [505, 507], [506, 508, 595], [507, 509], [442, 508, 510], [509, 511], [510, 512, 596], [511, 513], [443, 512, 514], [513, 515], [514, 516, 597], [515, 517], [444, 516, 518], [517, 519], [518, 520, 598], [519, 521], [445, 520, 522], [521, 523], [522, 524, 599], [523, 525], [446, 524, 526], [525, 527], [526, 528, 600], [527, 529], [447, 528, 530], [529, 531], [530, 532, 601], [531, 533], [448, 532, 534], [533, 535], [534, 536, 602], [535, 537], [449, 536, 538], [537, 539], [538, 540, 603], [539, 541], [450, 540, 542], [541, 543], [542, 544, 604], [543, 545], [451, 544, 546], [545, 547], [546, 548, 605], [547, 549], [452, 548, 550], [549, 551], [550, 552, 606], [551, 553], [453, 552, 554], [553, 555], [554, 556, 607], [555, 557], [454, 556, 558], [557, 559], [558, 560, 608], [559, 561], [455, 560, 562], [561, 563], [562, 564, 609], [563, 565], [456, 564, 566], [565, 567], [566, 568, 610], [567, 569], [457, 568, 570], [569, 571], [570, 572, 611], [571, 573], [458, 572, 574], [573, 575], [574, 576, 612], [575, 577], [459, 576, 578], [577, 579], [578, 580, 613], [579, 581], [460, 580, 582], [581, 583], [582, 614], [463, 617], [467, 621], [471, 625], [475, 629], [479, 633], [483, 637], [487, 641], [491, 645], [495, 649], [499, 653], [503, 657], [507, 661], [511, 665], [515, 669], [519, 673], [523, 677], [527, 681], [531, 685], [535, 689], [539, 693], [543, 697], [547, 701], [551, 705], [555, 709], [559, 713], [563, 717], [567, 721], [571, 725], [575, 729], [579, 733], [583, 737], [616, 738], [615, 617], [584, 616, 618], [617, 619], [618, 620, 739], [619, 621], [585, 620, 622], [621, 623], [622, 624, 740], [623, 625], [586, 624, 626], [625, 627], [626, 628, 741], [627, 629], [587, 628, 630], [629, 631], [630, 632, 742], [631, 633], [588, 632, 634], [633, 635], [634, 636, 743], [635, 637], [589, 636, 638], [637, 639], [638, 640, 744], [639, 641], [590, 640, 642], [641, 643], [642, 644, 745], [643, 645], [591, 644, 646], [645, 647], [646, 648, 746], [647, 649], [592, 648, 650], [649, 651], [650, 652, 747], [651, 653], [593, 652, 654], [653, 655], [654, 656, 748], [655, 657], [594, 656, 658], [657, 659], [658, 660, 749], [659, 661], [595, 660, 662], [661, 663], [662, 664, 750], [663, 665], [596, 664, 666], [665, 667], [666, 668, 751], [667, 669], [597, 668, 670], [669, 671], [670, 672, 752], [671, 673], [598, 672, 674], [673, 675], [674, 676, 753], [675, 677], [599, 676, 678], [677, 679], [678, 680, 754], [679, 681], [600, 680, 682], [681, 683], [682, 684, 755], [683, 685], [601, 684, 686], [685, 687], [686, 688, 756], [687, 689], [602, 688, 690], [689, 691], [690, 692, 757], [691, 693], [603, 692, 694], [693, 695], [694, 696, 758], [695, 697], [604, 696, 698], [697, 699], [698, 700, 759], [699, 701], [605, 700, 702], [701, 703], [702, 704, 760], [703, 705], [606, 704, 706], [705, 707], [706, 708, 761], [707, 709], [607, 708, 710], [709, 711], [710, 712, 762], [711, 713], [608, 712, 714], [713, 715], [714, 716, 763], [715, 717], [609, 716, 718], [717, 719], [718, 720, 764], [719, 721], [610, 720, 722], [721, 723], [722, 724, 765], [723, 725], [611, 724, 726], [725, 727], [726, 728, 766], [727, 729], [612, 728, 730], [729, 731], [730, 732, 767], [731, 733], [613, 732, 734], [733, 735], [734, 736, 768], [735, 737], [614, 736], [615, 769], [619, 773], [623, 777], [627, 781], [631, 785], [635, 789], [639, 793], [643, 797], [647, 801], [651, 805], [655, 809], [659, 813], [663, 817], [667, 821], [671, 825], [675, 829], [679, 833], [683, 837], [687, 841], [691, 845], [695, 849], [699, 853], [703, 857], [707, 861], [711, 865], [715, 869], [719, 873], [723, 877], [727, 881], [731, 885], [735, 889], [738, 770], [769, 771], [770, 772, 892], [771, 773], [739, 772, 774], [773, 775], [774, 776, 893], [775, 777], [740, 776, 778], [777, 779], [778, 780, 894], [779, 781], [741, 780, 782], [781, 783], [782, 784, 895], [783, 785], [742, 784, 786], [785, 787], [786, 788, 896], [787, 789], [743, 788, 790], [789, 791], [790, 792, 897], [791, 793], [744, 792, 794], [793, 795], [794, 796, 898], [795, 797], [745, 796, 798], [797, 799], [798, 800, 899], [799, 801], [746, 800, 802], [801, 803], [802, 804, 900], [803, 805], [747, 804, 806], [805, 807], [806, 808, 901], [807, 809], [748, 808, 810], [809, 811], [810, 812, 902], [811, 813], [749, 812, 814], [813, 815], [814, 816, 903], [815, 817], [750, 816, 818], [817, 819], [818, 820, 904], [819, 821], [751, 820, 822], [821, 823], [822, 824, 905], [823, 825], [752, 824, 826], [825, 827], [826, 828, 906], [827, 829], [753, 828, 830], [829, 831], [830, 832, 907], [831, 833], [754, 832, 834], [833, 835], [834, 836, 908], [835, 837], [755, 836, 838], [837, 839], [838, 840, 909], [839, 841], [756, 840, 842], [841, 843], [842, 844, 910], [843, 845], [757, 844, 846], [845, 847], [846, 848, 911], [847, 849], [758, 848, 850], [849, 851], [850, 852, 912], [851, 853], [759, 852, 854], [853, 855], [854, 856, 913], [855, 857], [760, 856, 858], [857, 859], [858, 860, 914], [859, 861], [761, 860, 862], [861, 863], [862, 864, 915], [863, 865], [762, 864, 866], [865, 867], [866, 868, 916], [867, 869], [763, 868, 870], [869, 871], [870, 872, 917], [871, 873], [764, 872, 874], [873, 875], [874, 876, 918], [875, 877], [765, 876, 878], [877, 879], [878, 880, 919], [879, 881], [766, 880, 882], [881, 883], [882, 884, 920], [883, 885], [767, 884, 886], [885, 887], [886, 888, 921], [887, 889], [768, 888, 890], [889, 891], [890, 922], [771, 925], [775, 929], [779, 933], [783, 937], [787, 941], [791, 945], [795, 949], [799, 953], [803, 957], [807, 961], [811, 965], [815, 969], [819, 973], [823, 977], [827, 981], [831, 985], [835, 989], [839, 993], [843, 997], [847, 1001], [851, 1005], [855, 1009], [859, 1013], [863, 1017], [867, 1021], [871, 1025], [875, 1029], [879, 1033], [883, 1037], [887, 1041], [891, 1045], [924, 1046], [923, 925], [892, 924, 926], [925, 927], [926, 928, 1047], [927, 929], [893, 928, 930], [929, 931], [930, 932, 1048], [931, 933], [894, 932, 934], [933, 935], [934, 936, 1049], [935, 937], [895, 936, 938], [937, 939], [938, 940, 1050], [939, 941], [896, 940, 942], [941, 943], [942, 944, 1051], [943, 945], [897, 944, 946], [945, 947], [946, 948, 1052], [947, 949], [898, 948, 950], [949, 951], [950, 952, 1053], [951, 953], [899, 952, 954], [953, 955], [954, 956, 1054], [955, 957], [900, 956, 958], [957, 959], [958, 960, 1055], [959, 961], [901, 960, 962], [961, 963], [962, 964, 1056], [963, 965], [902, 964, 966], [965, 967], [966, 968, 1057], [967, 969], [903, 968, 970], [969, 971], [970, 972, 1058], [971, 973], [904, 972, 974], [973, 975], [974, 976, 1059], [975, 977], [905, 976, 978], [977, 979], [978, 980, 1060], [979, 981], [906, 980, 982], [981, 983], [982, 984, 1061], [983, 985], [907, 984, 986], [985, 987], [986, 988, 1062], [987, 989], [908, 988, 990], [989, 991], [990, 992, 1063], [991, 993], [909, 992, 994], [993, 995], [994, 996, 1064], [995, 997], [910, 996, 998], [997, 999], [998, 1000, 1065], [999, 1001], [911, 1000, 1002], [1001, 1003], [1002, 1004, 1066], [1003, 1005], [912, 1004, 1006], [1005, 1007], [1006, 1008, 1067], [1007, 1009], [913, 1008, 1010], [1009, 1011], [1010, 1012, 1068], [1011, 1013], [914, 1012, 1014], [1013, 1015], [1014, 1016, 1069], [1015, 1017], [915, 1016, 1018], [1017, 1019], [1018, 1020, 1070], [1019, 1021], [916, 1020, 1022], [1021, 1023], [1022, 1024, 1071], [1023, 1025], [917, 1024, 1026], [1025, 1027], [1026, 1028, 1072], [1027, 1029], [918, 1028, 1030], [1029, 1031], [1030, 1032, 1073], [1031, 1033], [919, 1032, 1034], [1033, 1035], [1034, 1036, 1074], [1035, 1037], [920, 1036, 1038], [1037, 1039], [1038, 1040, 1075], [1039, 1041], [921, 1040, 1042], [1041, 1043], [1042, 1044, 1076], [1043, 1045], [922, 1044], [923, 1077], [927, 1081], [931, 1085], [935, 1089], [939, 1093], [943, 1097], [947, 1101], [951, 1105], [955, 1109], [959, 1113], [963, 1117], [967, 1121], [971, 1125], [975, 1129], [979, 1133], [983, 1137], [987, 1141], [991, 1145], [995, 1149], [999, 1153], [1003, 1157], [1007, 1161], [1011, 1165], [1015, 1169], [1019, 1173], [1023, 1177], [1027, 1181], [1031, 1185], [1035, 1189], [1039, 1193], [1043, 1197], [1046, 1078], [1077, 1079], [1078, 1080, 1200], [1079, 1081], [1047, 1080, 1082], [1081, 1083], [1082, 1084, 1201], [1083, 1085], [1048, 1084, 1086], [1085, 1087], [1086, 1088, 1202], [1087, 1089], [1049, 1088, 1090], [1089, 1091], [1090, 1092, 1203], [1091, 1093], [1050, 1092, 1094], [1093, 1095], [1094, 1096, 1204], [1095, 1097], [1051, 1096, 1098], [1097, 1099], [1098, 1100, 1205], [1099, 1101], [1052, 1100, 1102], [1101, 1103], [1102, 1104, 1206], [1103, 1105], [1053, 1104, 1106], [1105, 1107], [1106, 1108, 1207], [1107, 1109], [1054, 1108, 1110], [1109, 1111], [1110, 1112, 1208], [1111, 1113], [1055, 1112, 1114], [1113, 1115], [1114, 1116, 1209], [1115, 1117], [1056, 1116, 1118], [1117, 1119], [1118, 1120, 1210], [1119, 1121], [1057, 1120, 1122], [1121, 1123], [1122, 1124, 1211], [1123, 1125], [1058, 1124, 1126], [1125, 1127], [1126, 1128, 1212], [1127, 1129], [1059, 1128, 1130], [1129, 1131], [1130, 1132, 1213], [1131, 1133], [1060, 1132, 1134], [1133, 1135], [1134, 1136, 1214], [1135, 1137], [1061, 1136, 1138], [1137, 1139], [1138, 1140, 1215], [1139, 1141], [1062, 1140, 1142], [1141, 1143], [1142, 1144, 1216], [1143, 1145], [1063, 1144, 1146], [1145, 1147], [1146, 1148, 1217], [1147, 1149], [1064, 1148, 1150], [1149, 1151], [1150, 1152, 1218], [1151, 1153], [1065, 1152, 1154], [1153, 1155], [1154, 1156, 1219], [1155, 1157], [1066, 1156, 1158], [1157, 1159], [1158, 1160, 1220], [1159, 1161], [1067, 1160, 1162], [1161, 1163], [1162, 1164, 1221], [1163, 1165], [1068, 1164, 1166], [1165, 1167], [1166, 1168, 1222], [1167, 1169], [1069, 1168, 1170], [1169, 1171], [1170, 1172, 1223], [1171, 1173], [1070, 1172, 1174], [1173, 1175], [1174, 1176, 1224], [1175, 1177], [1071, 1176, 1178], [1177, 1179], [1178, 1180, 1225], [1179, 1181], [1072, 1180, 1182], [1181, 1183], [1182, 1184, 1226], [1183, 1185], [1073, 1184, 1186], [1185, 1187], [1186, 1188, 1227], [1187, 1189], [1074, 1188, 1190], [1189, 1191], [1190, 1192, 1228], [1191, 1193], [1075, 1192, 1194], [1193, 1195], [1194, 1196, 1229], [1195, 1197], [1076, 1196, 1198], [1197, 1199], [1198, 1230], [1079, 1233], [1083, 1237], [1087, 1241], [1091, 1245], [1095, 1249], [1099, 1253], [1103, 1257], [1107, 1261], [1111, 1265], [1115, 1269], [1119, 1273], [1123, 1277], [1127, 1281], [1131, 1285], [1135, 1289], [1139, 1293], [1143, 1297], [1147, 1301], [1151, 1305], [1155, 1309], [1159, 1313], [1163, 1317], [1167, 1321], [1171, 1325], [1175, 1329], [1179, 1333], [1183, 1337], [1187, 1341], [1191, 1345], [1195, 1349], [1199, 1353], [1232, 1354], [1231, 1233], [1200, 1232, 1234], [1233, 1235], [1234, 1236, 1355], [1235, 1237], [1201, 1236, 1238], [1237, 1239], [1238, 1240, 1356], [1239, 1241], [1202, 1240, 1242], [1241, 1243], [1242, 1244, 1357], [1243, 1245], [1203, 1244, 1246], [1245, 1247], [1246, 1248, 1358], [1247, 1249], [1204, 1248, 1250], [1249, 1251], [1250, 1252, 1359], [1251, 1253], [1205, 1252, 1254], [1253, 1255], [1254, 1256, 1360], [1255, 1257], [1206, 1256, 1258], [1257, 1259], [1258, 1260, 1361], [1259, 1261], [1207, 1260, 1262], [1261, 1263], [1262, 1264, 1362], [1263, 1265], [1208, 1264, 1266], [1265, 1267], [1266, 1268, 1363], [1267, 1269], [1209, 1268, 1270], [1269, 1271], [1270, 1272, 1364], [1271, 1273], [1210, 1272, 1274], [1273, 1275], [1274, 1276, 1365], [1275, 1277], [1211, 1276, 1278], [1277, 1279], [1278, 1280, 1366], [1279, 1281], [1212, 1280, 1282], [1281, 1283], [1282, 1284, 1367], [1283, 1285], [1213, 1284, 1286], [1285, 1287], [1286, 1288, 1368], [1287, 1289], [1214, 1288, 1290], [1289, 1291], [1290, 1292, 1369], [1291, 1293], [1215, 1292, 1294], [1293, 1295], [1294, 1296, 1370], [1295, 1297], [1216, 1296, 1298], [1297, 1299], [1298, 1300, 1371], [1299, 1301], [1217, 1300, 1302], [1301, 1303], [1302, 1304, 1372], [1303, 1305], [1218, 1304, 1306], [1305, 1307], [1306, 1308, 1373], [1307, 1309], [1219, 1308, 1310], [1309, 1311], [1310, 1312, 1374], [1311, 1313], [1220, 1312, 1314], [1313, 1315], [1314, 1316, 1375], [1315, 1317], [1221, 1316, 1318], [1317, 1319], [1318, 1320, 1376], [1319, 1321], [1222, 1320, 1322], [1321, 1323], [1322, 1324, 1377], [1323, 1325], [1223, 1324, 1326], [1325, 1327], [1326, 1328, 1378], [1327, 1329], [1224, 1328, 1330], [1329, 1331], [1330, 1332, 1379], [1331, 1333], [1225, 1332, 1334], [1333, 1335], [1334, 1336, 1380], [1335, 1337], [1226, 1336, 1338], [1337, 1339], [1338, 1340, 1381], [1339, 1341], [1227, 1340, 1342], [1341, 1343], [1342, 1344, 1382], [1343, 1345], [1228, 1344, 1346], [1345, 1347], [1346, 1348, 1383], [1347, 1349], [1229, 1348, 1350], [1349, 1351], [1350, 1352, 1384], [1351, 1353], [1230, 1352], [1231, 1385], [1235, 1389], [1239, 1393], [1243, 1397], [1247, 1401], [1251, 1405], [1255, 1409], [1259, 1413], [1263, 1417], [1267, 1421], [1271, 1425], [1275, 1429], [1279, 1433], [1283, 1437], [1287, 1441], [1291, 1445], [1295, 1449], [1299, 1453], [1303, 1457], [1307, 1461], [1311, 1465], [1315, 1469], [1319, 1473], [1323, 1477], [1327, 1481], [1331, 1485], [1335, 1489], [1339, 1493], [1343, 1497], [1347, 1501], [1351, 1505], [1354, 1386], [1385, 1387], [1386, 1388, 1508], [1387, 1389], [1355, 1388, 1390], [1389, 1391], [1390, 1392, 1509], [1391, 1393], [1356, 1392, 1394], [1393, 1395], [1394, 1396, 1510], [1395, 1397], [1357, 1396, 1398], [1397, 1399], [1398, 1400, 1511], [1399, 1401], [1358, 1400, 1402], [1401, 1403], [1402, 1404, 1512], [1403, 1405], [1359, 1404, 1406], [1405, 1407], [1406, 1408, 1513], [1407, 1409], [1360, 1408, 1410], [1409, 1411], [1410, 1412, 1514], [1411, 1413], [1361, 1412, 1414], [1413, 1415], [1414, 1416, 1515], [1415, 1417], [1362, 1416, 1418], [1417, 1419], [1418, 1420, 1516], [1419, 1421], [1363, 1420, 1422], [1421, 1423], [1422, 1424, 1517], [1423, 1425], [1364, 1424, 1426], [1425, 1427], [1426, 1428, 1518], [1427, 1429], [1365, 1428, 1430], [1429, 1431], [1430, 1432, 1519], [1431, 1433], [1366, 1432, 1434], [1433, 1435], [1434, 1436, 1520], [1435, 1437], [1367, 1436, 1438], [1437, 1439], [1438, 1440, 1521], [1439, 1441], [1368, 1440, 1442], [1441, 1443], [1442, 1444, 1522], [1443, 1445], [1369, 1444, 1446], [1445, 1447], [1446, 1448, 1523], [1447, 1449], [1370, 1448, 1450], [1449, 1451], [1450, 1452, 1524], [1451, 1453], [1371, 1452, 1454], [1453, 1455], [1454, 1456, 1525], [1455, 1457], [1372, 1456, 1458], [1457, 1459], [1458, 1460, 1526], [1459, 1461], [1373, 1460, 1462], [1461, 1463], [1462, 1464, 1527], [1463, 1465], [1374, 1464, 1466], [1465, 1467], [1466, 1468, 1528], [1467, 1469], [1375, 1468, 1470], [1469, 1471], [1470, 1472, 1529], [1471, 1473], [1376, 1472, 1474], [1473, 1475], [1474, 1476, 1530], [1475, 1477], [1377, 1476, 1478], [1477, 1479], [1478, 1480, 1531], [1479, 1481], [1378, 1480, 1482], [1481, 1483], [1482, 1484, 1532], [1483, 1485], [1379, 1484, 1486], [1485, 1487], [1486, 1488, 1533], [1487, 1489], [1380, 1488, 1490], [1489, 1491], [1490, 1492, 1534], [1491, 1493], [1381, 1492, 1494], [1493, 1495], [1494, 1496, 1535], [1495, 1497], [1382, 1496, 1498], [1497, 1499], [1498, 1500, 1536], [1499, 1501], [1383, 1500, 1502], [1501, 1503], [1502, 1504, 1537], [1503, 1505], [1384, 1504, 1506], [1505, 1507], [1506, 1538], [1387, 1541], [1391, 1545], [1395, 1549], [1399, 1553], [1403, 1557], [1407, 1561], [1411, 1565], [1415, 1569], [1419, 1573], [1423, 1577], [1427, 1581], [1431, 1585], [1435, 1589], [1439, 1593], [1443, 1597], [1447, 1601], [1451, 1605], [1455, 1609], [1459, 1613], [1463, 1617], [1467, 1621], [1471, 1625], [1475, 1629], [1479, 1633], [1483, 1637], [1487, 1641], [1491, 1645], [1495, 1649], [1499, 1653], [1503, 1657], [1507, 1661], [1540, 1662], [1539, 1541], [1508, 1540, 1542], [1541, 1543], [1542, 1544, 1663], [1543, 1545], [1509, 1544, 1546], [1545, 1547], [1546, 1548, 1664], [1547, 1549], [1510, 1548, 1550], [1549, 1551], [1550, 1552, 1665], [1551, 1553], [1511, 1552, 1554], [1553, 1555], [1554, 1556, 1666], [1555, 1557], [1512, 1556, 1558], [1557, 1559], [1558, 1560, 1667], [1559, 1561], [1513, 1560, 1562], [1561, 1563], [1562, 1564, 1668], [1563, 1565], [1514, 1564, 1566], [1565, 1567], [1566, 1568, 1669], [1567, 1569], [1515, 1568, 1570], [1569, 1571], [1570, 1572, 1670], [1571, 1573], [1516, 1572, 1574], [1573, 1575], [1574, 1576, 1671], [1575, 1577], [1517, 1576, 1578], [1577, 1579], [1578, 1580, 1672], [1579, 1581], [1518, 1580, 1582], [1581, 1583], [1582, 1584, 1673], [1583, 1585], [1519, 1584, 1586], [1585, 1587], [1586, 1588, 1674], [1587, 1589], [1520, 1588, 1590], [1589, 1591], [1590, 1592, 1675], [1591, 1593], [1521, 1592, 1594], [1593, 1595], [1594, 1596, 1676], [1595, 1597], [1522, 1596, 1598], [1597, 1599], [1598, 1600, 1677], [1599, 1601], [1523, 1600, 1602], [1601, 1603], [1602, 1604, 1678], [1603, 1605], [1524, 1604, 1606], [1605, 1607], [1606, 1608, 1679], [1607, 1609], [1525, 1608, 1610], [1609, 1611], [1610, 1612, 1680], [1611, 1613], [1526, 1612, 1614], [1613, 1615], [1614, 1616, 1681], [1615, 1617], [1527, 1616, 1618], [1617, 1619], [1618, 1620, 1682], [1619, 1621], [1528, 1620, 1622], [1621, 1623], [1622, 1624, 1683], [1623, 1625], [1529, 1624, 1626], [1625, 1627], [1626, 1628, 1684], [1627, 1629], [1530, 1628, 1630], [1629, 1631], [1630, 1632, 1685], [1631, 1633], [1531, 1632, 1634], [1633, 1635], [1634, 1636, 1686], [1635, 1637], [1532, 1636, 1638], [1637, 1639], [1638, 1640, 1687], [1639, 1641], [1533, 1640, 1642], [1641, 1643], [1642, 1644, 1688], [1643, 1645], [1534, 1644, 1646], [1645, 1647], [1646, 1648, 1689], [1647, 1649], [1535, 1648, 1650], [1649, 1651], [1650, 1652, 1690], [1651, 1653], [1536, 1652, 1654], [1653, 1655], [1654, 1656, 1691], [1655, 1657], [1537, 1656, 1658], [1657, 1659], [1658, 1660, 1692], [1659, 1661], [1538, 1660], [1539, 1693], [1543, 1697], [1547, 1701], [1551, 1705], [1555, 1709], [1559, 1713], [1563, 1717], [1567, 1721], [1571, 1725], [1575, 1729], [1579, 1733], [1583, 1737], [1587, 1741], [1591, 1745], [1595, 1749], [1599, 1753], [1603, 1757], [1607, 1761], [1611, 1765], [1615, 1769], [1619, 1773], [1623, 1777], [1627, 1781], [1631, 1785], [1635, 1789], [1639, 1793], [1643, 1797], [1647, 1801], [1651, 1805], [1655, 1809], [1659, 1813], [1662, 1694], [1693, 1695], [1694, 1696, 1816], [1695, 1697], [1663, 1696, 1698], [1697, 1699], [1698, 1700, 1817], [1699, 1701], [1664, 1700, 1702], [1701, 1703], [1702, 1704, 1818], [1703, 1705], [1665, 1704, 1706], [1705, 1707], [1706, 1708, 1819], [1707, 1709], [1666, 1708, 1710], [1709, 1711], [1710, 1712, 1820], [1711, 1713], [1667, 1712, 1714], [1713, 1715], [1714, 1716, 1821], [1715, 1717], [1668, 1716, 1718], [1717, 1719], [1718, 1720, 1822], [1719, 1721], [1669, 1720, 1722], [1721, 1723], [1722, 1724, 1823], [1723, 1725], [1670, 1724, 1726], [1725, 1727], [1726, 1728, 1824], [1727, 1729], [1671, 1728, 1730], [1729, 1731], [1730, 1732, 1825], [1731, 1733], [1672, 1732, 1734], [1733, 1735], [1734, 1736, 1826], [1735, 1737], [1673, 1736, 1738], [1737, 1739], [1738, 1740, 1827], [1739, 1741], [1674, 1740, 1742], [1741, 1743], [1742, 1744, 1828], [1743, 1745], [1675, 1744, 1746], [1745, 1747], [1746, 1748, 1829], [1747, 1749], [1676, 1748, 1750], [1749, 1751], [1750, 1752, 1830], [1751, 1753], [1677, 1752, 1754], [1753, 1755], [1754, 1756, 1831], [1755, 1757], [1678, 1756, 1758], [1757, 1759], [1758, 1760, 1832], [1759, 1761], [1679, 1760, 1762], [1761, 1763], [1762, 1764, 1833], [1763, 1765], [1680, 1764, 1766], [1765, 1767], [1766, 1768, 1834], [1767, 1769], [1681, 1768, 1770], [1769, 1771], [1770, 1772, 1835], [1771, 1773], [1682, 1772, 1774], [1773, 1775], [1774, 1776, 1836], [1775, 1777], [1683, 1776, 1778], [1777, 1779], [1778, 1780, 1837], [1779, 1781], [1684, 1780, 1782], [1781, 1783], [1782, 1784, 1838], [1783, 1785], [1685, 1784, 1786], [1785, 1787], [1786, 1788, 1839], [1787, 1789], [1686, 1788, 1790], [1789, 1791], [1790, 1792, 1840], [1791, 1793], [1687, 1792, 1794], [1793, 1795], [1794, 1796, 1841], [1795, 1797], [1688, 1796, 1798], [1797, 1799], [1798, 1800, 1842], [1799, 1801], [1689, 1800, 1802], [1801, 1803], [1802, 1804, 1843], [1803, 1805], [1690, 1804, 1806], [1805, 1807], [1806, 1808, 1844], [1807, 1809], [1691, 1808, 1810], [1809, 1811], [1810, 1812, 1845], [1811, 1813], [1692, 1812, 1814], [1813, 1815], [1814, 1846], [1695, 1849], [1699, 1853], [1703, 1857], [1707, 1861], [1711, 1865], [1715, 1869], [1719, 1873], [1723, 1877], [1727, 1881], [1731, 1885], [1735, 1889], [1739, 1893], [1743, 1897], [1747, 1901], [1751, 1905], [1755, 1909], [1759, 1913], [1763, 1917], [1767, 1921], [1771, 1925], [1775, 1929], [1779, 1933], [1783, 1937], [1787, 1941], [1791, 1945], [1795, 1949], [1799, 1953], [1803, 1957], [1807, 1961], [1811, 1965], [1815, 1969], [1848, 1970], [1847, 1849], [1816, 1848, 1850], [1849, 1851], [1850, 1852, 1971], [1851, 1853], [1817, 1852, 1854], [1853, 1855], [1854, 1856, 1972], [1855, 1857], [1818, 1856, 1858], [1857, 1859], [1858, 1860, 1973], [1859, 1861], [1819, 1860, 1862], [1861, 1863], [1862, 1864, 1974], [1863, 1865], [1820, 1864, 1866], [1865, 1867], [1866, 1868, 1975], [1867, 1869], [1821, 1868, 1870], [1869, 1871], [1870, 1872, 1976], [1871, 1873], [1822, 1872, 1874], [1873, 1875], [1874, 1876, 1977], [1875, 1877], [1823, 1876, 1878], [1877, 1879], [1878, 1880, 1978], [1879, 1881], [1824, 1880, 1882], [1881, 1883], [1882, 1884, 1979], [1883, 1885], [1825, 1884, 1886], [1885, 1887], [1886, 1888, 1980], [1887, 1889], [1826, 1888, 1890], [1889, 1891], [1890, 1892, 1981], [1891, 1893], [1827, 1892, 1894], [1893, 1895], [1894, 1896, 1982], [1895, 1897], [1828, 1896, 1898], [1897, 1899], [1898, 1900, 1983], [1899, 1901], [1829, 1900, 1902], [1901, 1903], [1902, 1904, 1984], [1903, 1905], [1830, 1904, 1906], [1905, 1907], [1906, 1908, 1985], [1907, 1909], [1831, 1908, 1910], [1909, 1911], [1910, 1912, 1986], [1911, 1913], [1832, 1912, 1914], [1913, 1915], [1914, 1916, 1987], [1915, 1917], [1833, 1916, 1918], [1917, 1919], [1918, 1920, 1988], [1919, 1921], [1834, 1920, 1922], [1921, 1923], [1922, 1924, 1989], [1923, 1925], [1835, 1924, 1926], [1925, 1927], [1926, 1928, 1990], [1927, 1929], [1836, 1928, 1930], [1929, 1931], [1930, 1932, 1991], [1931, 1933], [1837, 1932, 1934], [1933, 1935], [1934, 1936, 1992], [1935, 1937], [1838, 1936, 1938], [1937, 1939], [1938, 1940, 1993], [1939, 1941], [1839, 1940, 1942], [1941, 1943], [1942, 1944, 1994], [1943, 1945], [1840, 1944, 1946], [1945, 1947], [1946, 1948, 1995], [1947, 1949], [1841, 1948, 1950], [1949, 1951], [1950, 1952, 1996], [1951, 1953], [1842, 1952, 1954], [1953, 1955], [1954, 1956, 1997], [1955, 1957], [1843, 1956, 1958], [1957, 1959], [1958, 1960, 1998], [1959, 1961], [1844, 1960, 1962], [1961, 1963], [1962, 1964, 1999], [1963, 1965], [1845, 1964, 1966], [1965, 1967], [1966, 1968, 2000], [1967, 1969], [1846, 1968], [1847, 2001], [1851, 2005], [1855, 2009], [1859, 2013], [1863, 2017], [1867, 2021], [1871, 2025], [1875, 2029], [1879, 2033], [1883, 2037], [1887, 2041], [1891, 2045], [1895, 2049], [1899, 2053], [1903, 2057], [1907, 2061], [1911, 2065], [1915, 2069], [1919, 2073], [1923, 2077], [1927, 2081], [1931, 2085], [1935, 2089], [1939, 2093], [1943, 2097], [1947, 2101], [1951, 2105], [1955, 2109], [1959, 2113], [1963, 2117], [1967, 2121], [1970, 2002], [2001, 2003], [2002, 2004, 2124], [2003, 2005], [1971, 2004, 2006], [2005, 2007], [2006, 2008, 2125], [2007, 2009], [1972, 2008, 2010], [2009, 2011], [2010, 2012, 2126], [2011, 2013], [1973, 2012, 2014], [2013, 2015], [2014, 2016, 2127], [2015, 2017], [1974, 2016, 2018], [2017, 2019], [2018, 2020, 2128], [2019, 2021], [1975, 2020, 2022], [2021, 2023], [2022, 2024, 2129], [2023, 2025], [1976, 2024, 2026], [2025, 2027], [2026, 2028, 2130], [2027, 2029], [1977, 2028, 2030], [2029, 2031], [2030, 2032, 2131], [2031, 2033], [1978, 2032, 2034], [2033, 2035], [2034, 2036, 2132], [2035, 2037], [1979, 2036, 2038], [2037, 2039], [2038, 2040, 2133], [2039, 2041], [1980, 2040, 2042], [2041, 2043], [2042, 2044, 2134], [2043, 2045], [1981, 2044, 2046], [2045, 2047], [2046, 2048, 2135], [2047, 2049], [1982, 2048, 2050], [2049, 2051], [2050, 2052, 2136], [2051, 2053], [1983, 2052, 2054], [2053, 2055], [2054, 2056, 2137], [2055, 2057], [1984, 2056, 2058], [2057, 2059], [2058, 2060, 2138], [2059, 2061], [1985, 2060, 2062], [2061, 2063], [2062, 2064, 2139], [2063, 2065], [1986, 2064, 2066], [2065, 2067], [2066, 2068, 2140], [2067, 2069], [1987, 2068, 2070], [2069, 2071], [2070, 2072, 2141], [2071, 2073], [1988, 2072, 2074], [2073, 2075], [2074, 2076, 2142], [2075, 2077], [1989, 2076, 2078], [2077, 2079], [2078, 2080, 2143], [2079, 2081], [1990, 2080, 2082], [2081, 2083], [2082, 2084, 2144], [2083, 2085], [1991, 2084, 2086], [2085, 2087], [2086, 2088, 2145], [2087, 2089], [1992, 2088, 2090], [2089, 2091], [2090, 2092, 2146], [2091, 2093], [1993, 2092, 2094], [2093, 2095], [2094, 2096, 2147], [2095, 2097], [1994, 2096, 2098], [2097, 2099], [2098, 2100, 2148], [2099, 2101], [1995, 2100, 2102], [2101, 2103], [2102, 2104, 2149], [2103, 2105], [1996, 2104, 2106], [2105, 2107], [2106, 2108, 2150], [2107, 2109], [1997, 2108, 2110], [2109, 2111], [2110, 2112, 2151], [2111, 2113], [1998, 2112, 2114], [2113, 2115], [2114, 2116, 2152], [2115, 2117], [1999, 2116, 2118], [2117, 2119], [2118, 2120, 2153], [2119, 2121], [2000, 2120, 2122], [2121, 2123], [2122, 2154], [2003, 2157], [2007, 2161], [2011, 2165], [2015, 2169], [2019, 2173], [2023, 2177], [2027, 2181], [2031, 2185], [2035, 2189], [2039, 2193], [2043, 2197], [2047, 2201], [2051, 2205], [2055, 2209], [2059, 2213], [2063, 2217], [2067, 2221], [2071, 2225], [2075, 2229], [2079, 2233], [2083, 2237], [2087, 2241], [2091, 2245], [2095, 2249], [2099, 2253], [2103, 2257], [2107, 2261], [2111, 2265], [2115, 2269], [2119, 2273], [2123, 2277], [2156, 2278], [2155, 2157], [2124, 2156, 2158], [2157, 2159], [2158, 2160, 2279], [2159, 2161], [2125, 2160, 2162], [2161, 2163], [2162, 2164, 2280], [2163, 2165], [2126, 2164, 2166], [2165, 2167], [2166, 2168, 2281], [2167, 2169], [2127, 2168, 2170], [2169, 2171], [2170, 2172, 2282], [2171, 2173], [2128, 2172, 2174], [2173, 2175], [2174, 2176, 2283], [2175, 2177], [2129, 2176, 2178], [2177, 2179], [2178, 2180, 2284], [2179, 2181], [2130, 2180, 2182], [2181, 2183], [2182, 2184, 2285], [2183, 2185], [2131, 2184, 2186], [2185, 2187], [2186, 2188, 2286], [2187, 2189], [2132, 2188, 2190], [2189, 2191], [2190, 2192, 2287], [2191, 2193], [2133, 2192, 2194], [2193, 2195], [2194, 2196, 2288], [2195, 2197], [2134, 2196, 2198], [2197, 2199], [2198, 2200, 2289], [2199, 2201], [2135, 2200, 2202], [2201, 2203], [2202, 2204, 2290], [2203, 2205], [2136, 2204, 2206], [2205, 2207], [2206, 2208, 2291], [2207, 2209], [2137, 2208, 2210], [2209, 2211], [2210, 2212, 2292], [2211, 2213], [2138, 2212, 2214], [2213, 2215], [2214, 2216, 2293], [2215, 2217], [2139, 2216, 2218], [2217, 2219], [2218, 2220, 2294], [2219, 2221], [2140, 2220, 2222], [2221, 2223], [2222, 2224, 2295], [2223, 2225], [2141, 2224, 2226], [2225, 2227], [2226, 2228, 2296], [2227, 2229], [2142, 2228, 2230], [2229, 2231], [2230, 2232, 2297], [2231, 2233], [2143, 2232, 2234], [2233, 2235], [2234, 2236, 2298], [2235, 2237], [2144, 2236, 2238], [2237, 2239], [2238, 2240, 2299], [2239, 2241], [2145, 2240, 2242], [2241, 2243], [2242, 2244, 2300], [2243, 2245], [2146, 2244, 2246], [2245, 2247], [2246, 2248, 2301], [2247, 2249], [2147, 2248, 2250], [2249, 2251], [2250, 2252, 2302], [2251, 2253], [2148, 2252, 2254], [2253, 2255], [2254, 2256, 2303], [2255, 2257], [2149, 2256, 2258], [2257, 2259], [2258, 2260, 2304], [2259, 2261], [2150, 2260, 2262], [2261, 2263], [2262, 2264, 2305], [2263, 2265], [2151, 2264, 2266], [2265, 2267], [2266, 2268, 2306], [2267, 2269], [2152, 2268, 2270], [2269, 2271], [2270, 2272, 2307], [2271, 2273], [2153, 2272, 2274], [2273, 2275], [2274, 2276, 2308], [2275, 2277], [2154, 2276], [2155, 2309], [2159, 2313], [2163, 2317], [2167, 2321], [2171, 2325], [2175, 2329], [2179, 2333], [2183, 2337], [2187, 2341], [2191, 2345], [2195, 2349], [2199, 2353], [2203, 2357], [2207, 2361], [2211, 2365], [2215, 2369], [2219, 2373], [2223, 2377], [2227, 2381], [2231, 2385], [2235, 2389], [2239, 2393], [2243, 2397], [2247, 2401], [2251, 2405], [2255, 2409], [2259, 2413], [2263, 2417], [2267, 2421], [2271, 2425], [2275, 2429], [2278, 2310], [2309, 2311], [2310, 2312, 2432], [2311, 2313], [2279, 2312, 2314], [2313, 2315], [2314, 2316, 2433], [2315, 2317], [2280, 2316, 2318], [2317, 2319], [2318, 2320, 2434], [2319, 2321], [2281, 2320, 2322], [2321, 2323], [2322, 2324, 2435], [2323, 2325], [2282, 2324, 2326], [2325, 2327], [2326, 2328, 2436], [2327, 2329], [2283, 2328, 2330], [2329, 2331], [2330, 2332, 2437], [2331, 2333], [2284, 2332, 2334], [2333, 2335], [2334, 2336, 2438], [2335, 2337], [2285, 2336, 2338], [2337, 2339], [2338, 2340, 2439], [2339, 2341], [2286, 2340, 2342], [2341, 2343], [2342, 2344, 2440], [2343, 2345], [2287, 2344, 2346], [2345, 2347], [2346, 2348, 2441], [2347, 2349], [2288, 2348, 2350], [2349, 2351], [2350, 2352, 2442], [2351, 2353], [2289, 2352, 2354], [2353, 2355], [2354, 2356, 2443], [2355, 2357], [2290, 2356, 2358], [2357, 2359], [2358, 2360, 2444], [2359, 2361], [2291, 2360, 2362], [2361, 2363], [2362, 2364, 2445], [2363, 2365], [2292, 2364, 2366], [2365, 2367], [2366, 2368, 2446], [2367, 2369], [2293, 2368, 2370], [2369, 2371], [2370, 2372, 2447], [2371, 2373], [2294, 2372, 2374], [2373, 2375], [2374, 2376, 2448], [2375, 2377], [2295, 2376, 2378], [2377, 2379], [2378, 2380, 2449], [2379, 2381], [2296, 2380, 2382], [2381, 2383], [2382, 2384, 2450], [2383, 2385], [2297, 2384, 2386], [2385, 2387], [2386, 2388, 2451], [2387, 2389], [2298, 2388, 2390], [2389, 2391], [2390, 2392, 2452], [2391, 2393], [2299, 2392, 2394], [2393, 2395], [2394, 2396, 2453], [2395, 2397], [2300, 2396, 2398], [2397, 2399], [2398, 2400, 2454], [2399, 2401], [2301, 2400, 2402], [2401, 2403], [2402, 2404, 2455], [2403, 2405], [2302, 2404, 2406], [2405, 2407], [2406, 2408, 2456], [2407, 2409], [2303, 2408, 2410], [2409, 2411], [2410, 2412, 2457], [2411, 2413], [2304, 2412, 2414], [2413, 2415], [2414, 2416, 2458], [2415, 2417], [2305, 2416, 2418], [2417, 2419], [2418, 2420, 2459], [2419, 2421], [2306, 2420, 2422], [2421, 2423], [2422, 2424, 2460], [2423, 2425], [2307, 2424, 2426], [2425, 2427], [2426, 2428, 2461], [2427, 2429], [2308, 2428, 2430], [2429, 2431], [2430, 2462], [2311, 2465], [2315, 2469], [2319, 2473], [2323, 2477], [2327, 2481], [2331, 2485], [2335, 2489], [2339, 2493], [2343, 2497], [2347, 2501], [2351, 2505], [2355, 2509], [2359, 2513], [2363, 2517], [2367, 2521], [2371, 2525], [2375, 2529], [2379, 2533], [2383, 2537], [2387, 2541], [2391, 2545], [2395, 2549], [2399, 2553], [2403, 2557], [2407, 2561], [2411, 2565], [2415, 2569], [2419, 2573], [2423, 2577], [2427, 2581], [2431, 2585], [2464, 2586], [2463, 2465], [2432, 2464, 2466], [2465, 2467], [2466, 2468, 2587], [2467, 2469], [2433, 2468, 2470], [2469, 2471], [2470, 2472, 2588], [2471, 2473], [2434, 2472, 2474], [2473, 2475], [2474, 2476, 2589], [2475, 2477], [2435, 2476, 2478], [2477, 2479], [2478, 2480, 2590], [2479, 2481], [2436, 2480, 2482], [2481, 2483], [2482, 2484, 2591], [2483, 2485], [2437, 2484, 2486], [2485, 2487], [2486, 2488, 2592], [2487, 2489], [2438, 2488, 2490], [2489, 2491], [2490, 2492, 2593], [2491, 2493], [2439, 2492, 2494], [2493, 2495], [2494, 2496, 2594], [2495, 2497], [2440, 2496, 2498], [2497, 2499], [2498, 2500, 2595], [2499, 2501], [2441, 2500, 2502], [2501, 2503], [2502, 2504, 2596], [2503, 2505], [2442, 2504, 2506], [2505, 2507], [2506, 2508, 2597], [2507, 2509], [2443, 2508, 2510], [2509, 2511], [2510, 2512, 2598], [2511, 2513], [2444, 2512, 2514], [2513, 2515], [2514, 2516, 2599], [2515, 2517], [2445, 2516, 2518], [2517, 2519], [2518, 2520, 2600], [2519, 2521], [2446, 2520, 2522], [2521, 2523], [2522, 2524, 2601], [2523, 2525], [2447, 2524, 2526], [2525, 2527], [2526, 2528, 2602], [2527, 2529], [2448, 2528, 2530], [2529, 2531], [2530, 2532, 2603], [2531, 2533], [2449, 2532, 2534], [2533, 2535], [2534, 2536, 2604], [2535, 2537], [2450, 2536, 2538], [2537, 2539], [2538, 2540, 2605], [2539, 2541], [2451, 2540, 2542], [2541, 2543], [2542, 2544, 2606], [2543, 2545], [2452, 2544, 2546], [2545, 2547], [2546, 2548, 2607], [2547, 2549], [2453, 2548, 2550], [2549, 2551], [2550, 2552, 2608], [2551, 2553], [2454, 2552, 2554], [2553, 2555], [2554, 2556, 2609], [2555, 2557], [2455, 2556, 2558], [2557, 2559], [2558, 2560, 2610], [2559, 2561], [2456, 2560, 2562], [2561, 2563], [2562, 2564, 2611], [2563, 2565], [2457, 2564, 2566], [2565, 2567], [2566, 2568, 2612], [2567, 2569], [2458, 2568, 2570], [2569, 2571], [2570, 2572, 2613], [2571, 2573], [2459, 2572, 2574], [2573, 2575], [2574, 2576, 2614], [2575, 2577], [2460, 2576, 2578], [2577, 2579], [2578, 2580, 2615], [2579, 2581], [2461, 2580, 2582], [2581, 2583], [2582, 2584, 2616], [2583, 2585], [2462, 2584], [2463, 2617], [2467, 2621], [2471, 2625], [2475, 2629], [2479, 2633], [2483, 2637], [2487, 2641], [2491, 2645], [2495, 2649], [2499, 2653], [2503, 2657], [2507, 2661], [2511, 2665], [2515, 2669], [2519, 2673], [2523, 2677], [2527, 2681], [2531, 2685], [2535, 2689], [2539, 2693], [2543, 2697], [2547, 2701], [2551, 2705], [2555, 2709], [2559, 2713], [2563, 2717], [2567, 2721], [2571, 2725], [2575, 2729], [2579, 2733], [2583, 2737], [2586, 2618], [2617, 2619], [2618, 2620, 2740], [2619, 2621], [2587, 2620, 2622], [2621, 2623], [2622, 2624, 2741], [2623, 2625], [2588, 2624, 2626], [2625, 2627], [2626, 2628, 2742], [2627, 2629], [2589, 2628, 2630], [2629, 2631], [2630, 2632, 2743], [2631, 2633], [2590, 2632, 2634], [2633, 2635], [2634, 2636, 2744], [2635, 2637], [2591, 2636, 2638], [2637, 2639], [2638, 2640, 2745], [2639, 2641], [2592, 2640, 2642], [2641, 2643], [2642, 2644, 2746], [2643, 2645], [2593, 2644, 2646], [2645, 2647], [2646, 2648, 2747], [2647, 2649], [2594, 2648, 2650], [2649, 2651], [2650, 2652, 2748], [2651, 2653], [2595, 2652, 2654], [2653, 2655], [2654, 2656, 2749], [2655, 2657], [2596, 2656, 2658], [2657, 2659], [2658, 2660, 2750], [2659, 2661], [2597, 2660, 2662], [2661, 2663], [2662, 2664, 2751], [2663, 2665], [2598, 2664, 2666], [2665, 2667], [2666, 2668, 2752], [2667, 2669], [2599, 2668, 2670], [2669, 2671], [2670, 2672, 2753], [2671, 2673], [2600, 2672, 2674], [2673, 2675], [2674, 2676, 2754], [2675, 2677], [2601, 2676, 2678], [2677, 2679], [2678, 2680, 2755], [2679, 2681], [2602, 2680, 2682], [2681, 2683], [2682, 2684, 2756], [2683, 2685], [2603, 2684, 2686], [2685, 2687], [2686, 2688, 2757], [2687, 2689], [2604, 2688, 2690], [2689, 2691], [2690, 2692, 2758], [2691, 2693], [2605, 2692, 2694], [2693, 2695], [2694, 2696, 2759], [2695, 2697], [2606, 2696, 2698], [2697, 2699], [2698, 2700, 2760], [2699, 2701], [2607, 2700, 2702], [2701, 2703], [2702, 2704, 2761], [2703, 2705], [2608, 2704, 2706], [2705, 2707], [2706, 2708, 2762], [2707, 2709], [2609, 2708, 2710], [2709, 2711], [2710, 2712, 2763], [2711, 2713], [2610, 2712, 2714], [2713, 2715], [2714, 2716, 2764], [2715, 2717], [2611, 2716, 2718], [2717, 2719], [2718, 2720, 2765], [2719, 2721], [2612, 2720, 2722], [2721, 2723], [2722, 2724, 2766], [2723, 2725], [2613, 2724, 2726], [2725, 2727], [2726, 2728, 2767], [2727, 2729], [2614, 2728, 2730], [2729, 2731], [2730, 2732, 2768], [2731, 2733], [2615, 2732, 2734], [2733, 2735], [2734, 2736, 2769], [2735, 2737], [2616, 2736, 2738], [2737, 2739], [2738, 2770], [2619, 2773], [2623, 2777], [2627, 2781], [2631, 2785], [2635, 2789], [2639, 2793], [2643, 2797], [2647, 2801], [2651, 2805], [2655, 2809], [2659, 2813], [2663, 2817], [2667, 2821], [2671, 2825], [2675, 2829], [2679, 2833], [2683, 2837], [2687, 2841], [2691, 2845], [2695, 2849], [2699, 2853], [2703, 2857], [2707, 2861], [2711, 2865], [2715, 2869], [2719, 2873], [2723, 2877], [2727, 2881], [2731, 2885], [2735, 2889], [2739, 2893], [2772, 2894], [2771, 2773], [2740, 2772, 2774], [2773, 2775], [2774, 2776, 2895], [2775, 2777], [2741, 2776, 2778], [2777, 2779], [2778, 2780, 2896], [2779, 2781], [2742, 2780, 2782], [2781, 2783], [2782, 2784, 2897], [2783, 2785], [2743, 2784, 2786], [2785, 2787], [2786, 2788, 2898], [2787, 2789], [2744, 2788, 2790], [2789, 2791], [2790, 2792, 2899], [2791, 2793], [2745, 2792, 2794], [2793, 2795], [2794, 2796, 2900], [2795, 2797], [2746, 2796, 2798], [2797, 2799], [2798, 2800, 2901], [2799, 2801], [2747, 2800, 2802], [2801, 2803], [2802, 2804, 2902], [2803, 2805], [2748, 2804, 2806], [2805, 2807], [2806, 2808, 2903], [2807, 2809], [2749, 2808, 2810], [2809, 2811], [2810, 2812, 2904], [2811, 2813], [2750, 2812, 2814], [2813, 2815], [2814, 2816, 2905], [2815, 2817], [2751, 2816, 2818], [2817, 2819], [2818, 2820, 2906], [2819, 2821], [2752, 2820, 2822], [2821, 2823], [2822, 2824, 2907], [2823, 2825], [2753, 2824, 2826], [2825, 2827], [2826, 2828, 2908], [2827, 2829], [2754, 2828, 2830], [2829, 2831], [2830, 2832, 2909], [2831, 2833], [2755, 2832, 2834], [2833, 2835], [2834, 2836, 2910], [2835, 2837], [2756, 2836, 2838], [2837, 2839], [2838, 2840, 2911], [2839, 2841], [2757, 2840, 2842], [2841, 2843], [2842, 2844, 2912], [2843, 2845], [2758, 2844, 2846], [2845, 2847], [2846, 2848, 2913], [2847, 2849], [2759, 2848, 2850], [2849, 2851], [2850, 2852, 2914], [2851, 2853], [2760, 2852, 2854], [2853, 2855], [2854, 2856, 2915], [2855, 2857], [2761, 2856, 2858], [2857, 2859], [2858, 2860, 2916], [2859, 2861], [2762, 2860, 2862], [2861, 2863], [2862, 2864, 2917], [2863, 2865], [2763, 2864, 2866], [2865, 2867], [2866, 2868, 2918], [2867, 2869], [2764, 2868, 2870], [2869, 2871], [2870, 2872, 2919], [2871, 2873], [2765, 2872, 2874], [2873, 2875], [2874, 2876, 2920], [2875, 2877], [2766, 2876, 2878], [2877, 2879], [2878, 2880, 2921], [2879, 2881], [2767, 2880, 2882], [2881, 2883], [2882, 2884, 2922], [2883, 2885], [2768, 2884, 2886], [2885, 2887], [2886, 2888, 2923], [2887, 2889], [2769, 2888, 2890], [2889, 2891], [2890, 2892, 2924], [2891, 2893], [2770, 2892], [2771, 2925], [2775, 2929], [2779, 2933], [2783, 2937], [2787, 2941], [2791, 2945], [2795, 2949], [2799, 2953], [2803, 2957], [2807, 2961], [2811, 2965], [2815, 2969], [2819, 2973], [2823, 2977], [2827, 2981], [2831, 2985], [2835, 2989], [2839, 2993], [2843, 2997], [2847, 3001], [2851, 3005], [2855, 3009], [2859, 3013], [2863, 3017], [2867, 3021], [2871, 3025], [2875, 3029], [2879, 3033], [2883, 3037], [2887, 3041], [2891, 3045], [2894, 2926], [2925, 2927], [2926, 2928, 3048], [2927, 2929], [2895, 2928, 2930], [2929, 2931], [2930, 2932, 3049], [2931, 2933], [2896, 2932, 2934], [2933, 2935], [2934, 2936, 3050], [2935, 2937], [2897, 2936, 2938], [2937, 2939], [2938, 2940, 3051], [2939, 2941], [2898, 2940, 2942], [2941, 2943], [2942, 2944, 3052], [2943, 2945], [2899, 2944, 2946], [2945, 2947], [2946, 2948, 3053], [2947, 2949], [2900, 2948, 2950], [2949, 2951], [2950, 2952, 3054], [2951, 2953], [2901, 2952, 2954], [2953, 2955], [2954, 2956, 3055], [2955, 2957], [2902, 2956, 2958], [2957, 2959], [2958, 2960, 3056], [2959, 2961], [2903, 2960, 2962], [2961, 2963], [2962, 2964, 3057], [2963, 2965], [2904, 2964, 2966], [2965, 2967], [2966, 2968, 3058], [2967, 2969], [2905, 2968, 2970], [2969, 2971], [2970, 2972, 3059], [2971, 2973], [2906, 2972, 2974], [2973, 2975], [2974, 2976, 3060], [2975, 2977], [2907, 2976, 2978], [2977, 2979], [2978, 2980, 3061], [2979, 2981], [2908, 2980, 2982], [2981, 2983], [2982, 2984, 3062], [2983, 2985], [2909, 2984, 2986], [2985, 2987], [2986, 2988, 3063], [2987, 2989], [2910, 2988, 2990], [2989, 2991], [2990, 2992, 3064], [2991, 2993], [2911, 2992, 2994], [2993, 2995], [2994, 2996, 3065], [2995, 2997], [2912, 2996, 2998], [2997, 2999], [2998, 3000, 3066], [2999, 3001], [2913, 3000, 3002], [3001, 3003], [3002, 3004, 3067], [3003, 3005], [2914, 3004, 3006], [3005, 3007], [3006, 3008, 3068], [3007, 3009], [2915, 3008, 3010], [3009, 3011], [3010, 3012, 3069], [3011, 3013], [2916, 3012, 3014], [3013, 3015], [3014, 3016, 3070], [3015, 3017], [2917, 3016, 3018], [3017, 3019], [3018, 3020, 3071], [3019, 3021], [2918, 3020, 3022], [3021, 3023], [3022, 3024, 3072], [3023, 3025], [2919, 3024, 3026], [3025, 3027], [3026, 3028, 3073], [3027, 3029], [2920, 3028, 3030], [3029, 3031], [3030, 3032, 3074], [3031, 3033], [2921, 3032, 3034], [3033, 3035], [3034, 3036, 3075], [3035, 3037], [2922, 3036, 3038], [3037, 3039], [3038, 3040, 3076], [3039, 3041], [2923, 3040, 3042], [3041, 3043], [3042, 3044, 3077], [3043, 3045], [2924, 3044, 3046], [3045, 3047], [3046, 3078], [2927, 3081], [2931, 3085], [2935, 3089], [2939, 3093], [2943, 3097], [2947, 3101], [2951, 3105], [2955, 3109], [2959, 3113], [2963, 3117], [2967, 3121], [2971, 3125], [2975, 3129], [2979, 3133], [2983, 3137], [2987, 3141], [2991, 3145], [2995, 3149], [2999, 3153], [3003, 3157], [3007, 3161], [3011, 3165], [3015, 3169], [3019, 3173], [3023, 3177], [3027, 3181], [3031, 3185], [3035, 3189], [3039, 3193], [3043, 3197], [3047, 3201], [3080, 3202], [3079, 3081], [3048, 3080, 3082], [3081, 3083], [3082, 3084, 3203], [3083, 3085], [3049, 3084, 3086], [3085, 3087], [3086, 3088, 3204], [3087, 3089], [3050, 3088, 3090], [3089, 3091], [3090, 3092, 3205], [3091, 3093], [3051, 3092, 3094], [3093, 3095], [3094, 3096, 3206], [3095, 3097], [3052, 3096, 3098], [3097, 3099], [3098, 3100, 3207], [3099, 3101], [3053, 3100, 3102], [3101, 3103], [3102, 3104, 3208], [3103, 3105], [3054, 3104, 3106], [3105, 3107], [3106, 3108, 3209], [3107, 3109], [3055, 3108, 3110], [3109, 3111], [3110, 3112, 3210], [3111, 3113], [3056, 3112, 3114], [3113, 3115], [3114, 3116, 3211], [3115, 3117], [3057, 3116, 3118], [3117, 3119], [3118, 3120, 3212], [3119, 3121], [3058, 3120, 3122], [3121, 3123], [3122, 3124, 3213], [3123, 3125], [3059, 3124, 3126], [3125, 3127], [3126, 3128, 3214], [3127, 3129], [3060, 3128, 3130], [3129, 3131], [3130, 3132, 3215], [3131, 3133], [3061, 3132, 3134], [3133, 3135], [3134, 3136, 3216], [3135, 3137], [3062, 3136, 3138], [3137, 3139], [3138, 3140, 3217], [3139, 3141], [3063, 3140, 3142], [3141, 3143], [3142, 3144, 3218], [3143, 3145], [3064, 3144, 3146], [3145, 3147], [3146, 3148, 3219], [3147, 3149], [3065, 3148, 3150], [3149, 3151], [3150, 3152, 3220], [3151, 3153], [3066, 3152, 3154], [3153, 3155], [3154, 3156, 3221], [3155, 3157], [3067, 3156, 3158], [3157, 3159], [3158, 3160, 3222], [3159, 3161], [3068, 3160, 3162], [3161, 3163], [3162, 3164, 3223], [3163, 3165], [3069, 3164, 3166], [3165, 3167], [3166, 3168, 3224], [3167, 3169], [3070, 3168, 3170], [3169, 3171], [3170, 3172, 3225], [3171, 3173], [3071, 3172, 3174], [3173, 3175], [3174, 3176, 3226], [3175, 3177], [3072, 3176, 3178], [3177, 3179], [3178, 3180, 3227], [3179, 3181], [3073, 3180, 3182], [3181, 3183], [3182, 3184, 3228], [3183, 3185], [3074, 3184, 3186], [3185, 3187], [3186, 3188, 3229], [3187, 3189], [3075, 3188, 3190], [3189, 3191], [3190, 3192, 3230], [3191, 3193], [3076, 3192, 3194], [3193, 3195], [3194, 3196, 3231], [3195, 3197], [3077, 3196, 3198], [3197, 3199], [3198, 3200, 3232], [3199, 3201], [3078, 3200], [3079, 3233], [3083, 3237], [3087, 3241], [3091, 3245], [3095, 3249], [3099, 3253], [3103, 3257], [3107, 3261], [3111, 3265], [3115, 3269], [3119, 3273], [3123, 3277], [3127, 3281], [3131, 3285], [3135, 3289], [3139, 3293], [3143, 3297], [3147, 3301], [3151, 3305], [3155, 3309], [3159, 3313], [3163, 3317], [3167, 3321], [3171, 3325], [3175, 3329], [3179, 3333], [3183, 3337], [3187, 3341], [3191, 3345], [3195, 3349], [3199, 3353], [3202, 3234], [3233, 3235], [3234, 3236, 3356], [3235, 3237], [3203, 3236, 3238], [3237, 3239], [3238, 3240, 3357], [3239, 3241], [3204, 3240, 3242], [3241, 3243], [3242, 3244, 3358], [3243, 3245], [3205, 3244, 3246], [3245, 3247], [3246, 3248, 3359], [3247, 3249], [3206, 3248, 3250], [3249, 3251], [3250, 3252, 3360], [3251, 3253], [3207, 3252, 3254], [3253, 3255], [3254, 3256, 3361], [3255, 3257], [3208, 3256, 3258], [3257, 3259], [3258, 3260, 3362], [3259, 3261], [3209, 3260, 3262], [3261, 3263], [3262, 3264, 3363], [3263, 3265], [3210, 3264, 3266], [3265, 3267], [3266, 3268, 3364], [3267, 3269], [3211, 3268, 3270], [3269, 3271], [3270, 3272, 3365], [3271, 3273], [3212, 3272, 3274], [3273, 3275], [3274, 3276, 3366], [3275, 3277], [3213, 3276, 3278], [3277, 3279], [3278, 3280, 3367], [3279, 3281], [3214, 3280, 3282], [3281, 3283], [3282, 3284, 3368], [3283, 3285], [3215, 3284, 3286], [3285, 3287], [3286, 3288, 3369], [3287, 3289], [3216, 3288, 3290], [3289, 3291], [3290, 3292, 3370], [3291, 3293], [3217, 3292, 3294], [3293, 3295], [3294, 3296, 3371], [3295, 3297], [3218, 3296, 3298], [3297, 3299], [3298, 3300, 3372], [3299, 3301], [3219, 3300, 3302], [3301, 3303], [3302, 3304, 3373], [3303, 3305], [3220, 3304, 3306], [3305, 3307], [3306, 3308, 3374], [3307, 3309], [3221, 3308, 3310], [3309, 3311], [3310, 3312, 3375], [3311, 3313], [3222, 3312, 3314], [3313, 3315], [3314, 3316, 3376], [3315, 3317], [3223, 3316, 3318], [3317, 3319], [3318, 3320, 3377], [3319, 3321], [3224, 3320, 3322], [3321, 3323], [3322, 3324, 3378], [3323, 3325], [3225, 3324, 3326], [3325, 3327], [3326, 3328, 3379], [3327, 3329], [3226, 3328, 3330], [3329, 3331], [3330, 3332, 3380], [3331, 3333], [3227, 3332, 3334], [3333, 3335], [3334, 3336, 3381], [3335, 3337], [3228, 3336, 3338], [3337, 3339], [3338, 3340, 3382], [3339, 3341], [3229, 3340, 3342], [3341, 3343], [3342, 3344, 3383], [3343, 3345], [3230, 3344, 3346], [3345, 3347], [3346, 3348, 3384], [3347, 3349], [3231, 3348, 3350], [3349, 3351], [3350, 3352, 3385], [3351, 3353], [3232, 3352, 3354], [3353, 3355], [3354, 3386], [3235, 3389], [3239, 3393], [3243, 3397], [3247, 3401], [3251, 3405], [3255, 3409], [3259, 3413], [3263, 3417], [3267, 3421], [3271, 3425], [3275, 3429], [3279, 3433], [3283, 3437], [3287, 3441], [3291, 3445], [3295, 3449], [3299, 3453], [3303, 3457], [3307, 3461], [3311, 3465], [3315, 3469], [3319, 3473], [3323, 3477], [3327, 3481], [3331, 3485], [3335, 3489], [3339, 3493], [3343, 3497], [3347, 3501], [3351, 3505], [3355, 3509], [3388, 3510], [3387, 3389], [3356, 3388, 3390], [3389, 3391], [3390, 3392, 3511], [3391, 3393], [3357, 3392, 3394], [3393, 3395], [3394, 3396, 3512], [3395, 3397], [3358, 3396, 3398], [3397, 3399], [3398, 3400, 3513], [3399, 3401], [3359, 3400, 3402], [3401, 3403], [3402, 3404, 3514], [3403, 3405], [3360, 3404, 3406], [3405, 3407], [3406, 3408, 3515], [3407, 3409], [3361, 3408, 3410], [3409, 3411], [3410, 3412, 3516], [3411, 3413], [3362, 3412, 3414], [3413, 3415], [3414, 3416, 3517], [3415, 3417], [3363, 3416, 3418], [3417, 3419], [3418, 3420, 3518], [3419, 3421], [3364, 3420, 3422], [3421, 3423], [3422, 3424, 3519], [3423, 3425], [3365, 3424, 3426], [3425, 3427], [3426, 3428, 3520], [3427, 3429], [3366, 3428, 3430], [3429, 3431], [3430, 3432, 3521], [3431, 3433], [3367, 3432, 3434], [3433, 3435], [3434, 3436, 3522], [3435, 3437], [3368, 3436, 3438], [3437, 3439], [3438, 3440, 3523], [3439, 3441], [3369, 3440, 3442], [3441, 3443], [3442, 3444, 3524], [3443, 3445], [3370, 3444, 3446], [3445, 3447], [3446, 3448, 3525], [3447, 3449], [3371, 3448, 3450], [3449, 3451], [3450, 3452, 3526], [3451, 3453], [3372, 3452, 3454], [3453, 3455], [3454, 3456, 3527], [3455, 3457], [3373, 3456, 3458], [3457, 3459], [3458, 3460, 3528], [3459, 3461], [3374, 3460, 3462], [3461, 3463], [3462, 3464, 3529], [3463, 3465], [3375, 3464, 3466], [3465, 3467], [3466, 3468, 3530], [3467, 3469], [3376, 3468, 3470], [3469, 3471], [3470, 3472, 3531], [3471, 3473], [3377, 3472, 3474], [3473, 3475], [3474, 3476, 3532], [3475, 3477], [3378, 3476, 3478], [3477, 3479], [3478, 3480, 3533], [3479, 3481], [3379, 3480, 3482], [3481, 3483], [3482, 3484, 3534], [3483, 3485], [3380, 3484, 3486], [3485, 3487], [3486, 3488, 3535], [3487, 3489], [3381, 3488, 3490], [3489, 3491], [3490, 3492, 3536], [3491, 3493], [3382, 3492, 3494], [3493, 3495], [3494, 3496, 3537], [3495, 3497], [3383, 3496, 3498], [3497, 3499], [3498, 3500, 3538], [3499, 3501], [3384, 3500, 3502], [3501, 3503], [3502, 3504, 3539], [3503, 3505], [3385, 3504, 3506], [3505, 3507], [3506, 3508, 3540], [3507, 3509], [3386, 3508], [3387, 3541], [3391, 3545], [3395, 3549], [3399, 3553], [3403, 3557], [3407, 3561], [3411, 3565], [3415, 3569], [3419, 3573], [3423, 3577], [3427, 3581], [3431, 3585], [3435, 3589], [3439, 3593], [3443, 3597], [3447, 3601], [3451, 3605], [3455, 3609], [3459, 3613], [3463, 3617], [3467, 3621], [3471, 3625], [3475, 3629], [3479, 3633], [3483, 3637], [3487, 3641], [3491, 3645], [3495, 3649], [3499, 3653], [3503, 3657], [3507, 3661], [3510, 3542], [3541, 3543], [3542, 3544, 3664], [3543, 3545], [3511, 3544, 3546], [3545, 3547], [3546, 3548, 3665], [3547, 3549], [3512, 3548, 3550], [3549, 3551], [3550, 3552, 3666], [3551, 3553], [3513, 3552, 3554], [3553, 3555], [3554, 3556, 3667], [3555, 3557], [3514, 3556, 3558], [3557, 3559], [3558, 3560, 3668], [3559, 3561], [3515, 3560, 3562], [3561, 3563], [3562, 3564, 3669], [3563, 3565], [3516, 3564, 3566], [3565, 3567], [3566, 3568, 3670], [3567, 3569], [3517, 3568, 3570], [3569, 3571], [3570, 3572, 3671], [3571, 3573], [3518, 3572, 3574], [3573, 3575], [3574, 3576, 3672], [3575, 3577], [3519, 3576, 3578], [3577, 3579], [3578, 3580, 3673], [3579, 3581], [3520, 3580, 3582], [3581, 3583], [3582, 3584, 3674], [3583, 3585], [3521, 3584, 3586], [3585, 3587], [3586, 3588, 3675], [3587, 3589], [3522, 3588, 3590], [3589, 3591], [3590, 3592, 3676], [3591, 3593], [3523, 3592, 3594], [3593, 3595], [3594, 3596, 3677], [3595, 3597], [3524, 3596, 3598], [3597, 3599], [3598, 3600, 3678], [3599, 3601], [3525, 3600, 3602], [3601, 3603], [3602, 3604, 3679], [3603, 3605], [3526, 3604, 3606], [3605, 3607], [3606, 3608, 3680], [3607, 3609], [3527, 3608, 3610], [3609, 3611], [3610, 3612, 3681], [3611, 3613], [3528, 3612, 3614], [3613, 3615], [3614, 3616, 3682], [3615, 3617], [3529, 3616, 3618], [3617, 3619], [3618, 3620, 3683], [3619, 3621], [3530, 3620, 3622], [3621, 3623], [3622, 3624, 3684], [3623, 3625], [3531, 3624, 3626], [3625, 3627], [3626, 3628, 3685], [3627, 3629], [3532, 3628, 3630], [3629, 3631], [3630, 3632, 3686], [3631, 3633], [3533, 3632, 3634], [3633, 3635], [3634, 3636, 3687], [3635, 3637], [3534, 3636, 3638], [3637, 3639], [3638, 3640, 3688], [3639, 3641], [3535, 3640, 3642], [3641, 3643], [3642, 3644, 3689], [3643, 3645], [3536, 3644, 3646], [3645, 3647], [3646, 3648, 3690], [3647, 3649], [3537, 3648, 3650], [3649, 3651], [3650, 3652, 3691], [3651, 3653], [3538, 3652, 3654], [3653, 3655], [3654, 3656, 3692], [3655, 3657], [3539, 3656, 3658], [3657, 3659], [3658, 3660, 3693], [3659, 3661], [3540, 3660, 3662], [3661, 3663], [3662, 3694], [3543, 3697], [3547, 3701], [3551, 3705], [3555, 3709], [3559, 3713], [3563, 3717], [3567, 3721], [3571, 3725], [3575, 3729], [3579, 3733], [3583, 3737], [3587, 3741], [3591, 3745], [3595, 3749], [3599, 3753], [3603, 3757], [3607, 3761], [3611, 3765], [3615, 3769], [3619, 3773], [3623, 3777], [3627, 3781], [3631, 3785], [3635, 3789], [3639, 3793], [3643, 3797], [3647, 3801], [3651, 3805], [3655, 3809], [3659, 3813], [3663, 3817], [3696, 3818], [3695, 3697], [3664, 3696, 3698], [3697, 3699], [3698, 3700, 3819], [3699, 3701], [3665, 3700, 3702], [3701, 3703], [3702, 3704, 3820], [3703, 3705], [3666, 3704, 3706], [3705, 3707], [3706, 3708, 3821], [3707, 3709], [3667, 3708, 3710], [3709, 3711], [3710, 3712, 3822], [3711, 3713], [3668, 3712, 3714], [3713, 3715], [3714, 3716, 3823], [3715, 3717], [3669, 3716, 3718], [3717, 3719], [3718, 3720, 3824], [3719, 3721], [3670, 3720, 3722], [3721, 3723], [3722, 3724, 3825], [3723, 3725], [3671, 3724, 3726], [3725, 3727], [3726, 3728, 3826], [3727, 3729], [3672, 3728, 3730], [3729, 3731], [3730, 3732, 3827], [3731, 3733], [3673, 3732, 3734], [3733, 3735], [3734, 3736, 3828], [3735, 3737], [3674, 3736, 3738], [3737, 3739], [3738, 3740, 3829], [3739, 3741], [3675, 3740, 3742], [3741, 3743], [3742, 3744, 3830], [3743, 3745], [3676, 3744, 3746], [3745, 3747], [3746, 3748, 3831], [3747, 3749], [3677, 3748, 3750], [3749, 3751], [3750, 3752, 3832], [3751, 3753], [3678, 3752, 3754], [3753, 3755], [3754, 3756, 3833], [3755, 3757], [3679, 3756, 3758], [3757, 3759], [3758, 3760, 3834], [3759, 3761], [3680, 3760, 3762], [3761, 3763], [3762, 3764, 3835], [3763, 3765], [3681, 3764, 3766], [3765, 3767], [3766, 3768, 3836], [3767, 3769], [3682, 3768, 3770], [3769, 3771], [3770, 3772, 3837], [3771, 3773], [3683, 3772, 3774], [3773, 3775], [3774, 3776, 3838], [3775, 3777], [3684, 3776, 3778], [3777, 3779], [3778, 3780, 3839], [3779, 3781], [3685, 3780, 3782], [3781, 3783], [3782, 3784, 3840], [3783, 3785], [3686, 3784, 3786], [3785, 3787], [3786, 3788, 3841], [3787, 3789], [3687, 3788, 3790], [3789, 3791], [3790, 3792, 3842], [3791, 3793], [3688, 3792, 3794], [3793, 3795], [3794, 3796, 3843], [3795, 3797], [3689, 3796, 3798], [3797, 3799], [3798, 3800, 3844], [3799, 3801], [3690, 3800, 3802], [3801, 3803], [3802, 3804, 3845], [3803, 3805], [3691, 3804, 3806], [3805, 3807], [3806, 3808, 3846], [3807, 3809], [3692, 3808, 3810], [3809, 3811], [3810, 3812, 3847], [3811, 3813], [3693, 3812, 3814], [3813, 3815], [3814, 3816, 3848], [3815, 3817], [3694, 3816], [3695, 3849], [3699, 3853], [3703, 3857], [3707, 3861], [3711, 3865], [3715, 3869], [3719, 3873], [3723, 3877], [3727, 3881], [3731, 3885], [3735, 3889], [3739, 3893], [3743, 3897], [3747, 3901], [3751, 3905], [3755, 3909], [3759, 3913], [3763, 3917], [3767, 3921], [3771, 3925], [3775, 3929], [3779, 3933], [3783, 3937], [3787, 3941], [3791, 3945], [3795, 3949], [3799, 3953], [3803, 3957], [3807, 3961], [3811, 3965], [3815, 3969], [3818, 3850], [3849, 3851], [3850, 3852, 3972], [3851, 3853], [3819, 3852, 3854], [3853, 3855], [3854, 3856, 3973], [3855, 3857], [3820, 3856, 3858], [3857, 3859], [3858, 3860, 3974], [3859, 3861], [3821, 3860, 3862], [3861, 3863], [3862, 3864, 3975], [3863, 3865], [3822, 3864, 3866], [3865, 3867], [3866, 3868, 3976], [3867, 3869], [3823, 3868, 3870], [3869, 3871], [3870, 3872, 3977], [3871, 3873], [3824, 3872, 3874], [3873, 3875], [3874, 3876, 3978], [3875, 3877], [3825, 3876, 3878], [3877, 3879], [3878, 3880, 3979], [3879, 3881], [3826, 3880, 3882], [3881, 3883], [3882, 3884, 3980], [3883, 3885], [3827, 3884, 3886], [3885, 3887], [3886, 3888, 3981], [3887, 3889], [3828, 3888, 3890], [3889, 3891], [3890, 3892, 3982], [3891, 3893], [3829, 3892, 3894], [3893, 3895], [3894, 3896, 3983], [3895, 3897], [3830, 3896, 3898], [3897, 3899], [3898, 3900, 3984], [3899, 3901], [3831, 3900, 3902], [3901, 3903], [3902, 3904, 3985], [3903, 3905], [3832, 3904, 3906], [3905, 3907], [3906, 3908, 3986], [3907, 3909], [3833, 3908, 3910], [3909, 3911], [3910, 3912, 3987], [3911, 3913], [3834, 3912, 3914], [3913, 3915], [3914, 3916, 3988], [3915, 3917], [3835, 3916, 3918], [3917, 3919], [3918, 3920, 3989], [3919, 3921], [3836, 3920, 3922], [3921, 3923], [3922, 3924, 3990], [3923, 3925], [3837, 3924, 3926], [3925, 3927], [3926, 3928, 3991], [3927, 3929], [3838, 3928, 3930], [3929, 3931], [3930, 3932, 3992], [3931, 3933], [3839, 3932, 3934], [3933, 3935], [3934, 3936, 3993], [3935, 3937], [3840, 3936, 3938], [3937, 3939], [3938, 3940, 3994], [3939, 3941], [3841, 3940, 3942], [3941, 3943], [3942, 3944, 3995], [3943, 3945], [3842, 3944, 3946], [3945, 3947], [3946, 3948, 3996], [3947, 3949], [3843, 3948, 3950], [3949, 3951], [3950, 3952, 3997], [3951, 3953], [3844, 3952, 3954], [3953, 3955], [3954, 3956, 3998], [3955, 3957], [3845, 3956, 3958], [3957, 3959], [3958, 3960, 3999], [3959, 3961], [3846, 3960, 3962], [3961, 3963], [3962, 3964, 4000], [3963, 3965], [3847, 3964, 3966], [3965, 3967], [3966, 3968, 4001], [3967, 3969], [3848, 3968, 3970], [3969, 3971], [3970, 4002], [3851, 4005], [3855, 4009], [3859, 4013], [3863, 4017], [3867, 4021], [3871, 4025], [3875, 4029], [3879, 4033], [3883, 4037], [3887, 4041], [3891, 4045], [3895, 4049], [3899, 4053], [3903, 4057], [3907, 4061], [3911, 4065], [3915, 4069], [3919, 4073], [3923, 4077], [3927, 4081], [3931, 4085], [3935, 4089], [3939, 4093], [3943, 4097], [3947, 4101], [3951, 4105], [3955, 4109], [3959, 4113], [3963, 4117], [3967, 4121], [3971, 4125], [4004, 4126], [4003, 4005], [3972, 4004, 4006], [4005, 4007], [4006, 4008, 4127], [4007, 4009], [3973, 4008, 4010], [4009, 4011], [4010, 4012, 4128], [4011, 4013], [3974, 4012, 4014], [4013, 4015], [4014, 4016, 4129], [4015, 4017], [3975, 4016, 4018], [4017, 4019], [4018, 4020, 4130], [4019, 4021], [3976, 4020, 4022], [4021, 4023], [4022, 4024, 4131], [4023, 4025], [3977, 4024, 4026], [4025, 4027], [4026, 4028, 4132], [4027, 4029], [3978, 4028, 4030], [4029, 4031], [4030, 4032, 4133], [4031, 4033], [3979, 4032, 4034], [4033, 4035], [4034, 4036, 4134], [4035, 4037], [3980, 4036, 4038], [4037, 4039], [4038, 4040, 4135], [4039, 4041], [3981, 4040, 4042], [4041, 4043], [4042, 4044, 4136], [4043, 4045], [3982, 4044, 4046], [4045, 4047], [4046, 4048, 4137], [4047, 4049], [3983, 4048, 4050], [4049, 4051], [4050, 4052, 4138], [4051, 4053], [3984, 4052, 4054], [4053, 4055], [4054, 4056, 4139], [4055, 4057], [3985, 4056, 4058], [4057, 4059], [4058, 4060, 4140], [4059, 4061], [3986, 4060, 4062], [4061, 4063], [4062, 4064, 4141], [4063, 4065], [3987, 4064, 4066], [4065, 4067], [4066, 4068, 4142], [4067, 4069], [3988, 4068, 4070], [4069, 4071], [4070, 4072, 4143], [4071, 4073], [3989, 4072, 4074], [4073, 4075], [4074, 4076, 4144], [4075, 4077], [3990, 4076, 4078], [4077, 4079], [4078, 4080, 4145], [4079, 4081], [3991, 4080, 4082], [4081, 4083], [4082, 4084, 4146], [4083, 4085], [3992, 4084, 4086], [4085, 4087], [4086, 4088, 4147], [4087, 4089], [3993, 4088, 4090], [4089, 4091], [4090, 4092, 4148], [4091, 4093], [3994, 4092, 4094], [4093, 4095], [4094, 4096, 4149], [4095, 4097], [3995, 4096, 4098], [4097, 4099], [4098, 4100, 4150], [4099, 4101], [3996, 4100, 4102], [4101, 4103], [4102, 4104, 4151], [4103, 4105], [3997, 4104, 4106], [4105, 4107], [4106, 4108, 4152], [4107, 4109], [3998, 4108, 4110], [4109, 4111], [4110, 4112, 4153], [4111, 4113], [3999, 4112, 4114], [4113, 4115], [4114, 4116, 4154], [4115, 4117], [4000, 4116, 4118], [4117, 4119], [4118, 4120, 4155], [4119, 4121], [4001, 4120, 4122], [4121, 4123], [4122, 4124, 4156], [4123, 4125], [4002, 4124], [4003, 4157], [4007, 4161], [4011, 4165], [4015, 4169], [4019, 4173], [4023, 4177], [4027, 4181], [4031, 4185], [4035, 4189], [4039, 4193], [4043, 4197], [4047, 4201], [4051, 4205], [4055, 4209], [4059, 4213], [4063, 4217], [4067, 4221], [4071, 4225], [4075, 4229], [4079, 4233], [4083, 4237], [4087, 4241], [4091, 4245], [4095, 4249], [4099, 4253], [4103, 4257], [4107, 4261], [4111, 4265], [4115, 4269], [4119, 4273], [4123, 4277], [4126, 4158], [4157, 4159], [4158, 4160, 4280], [4159, 4161], [4127, 4160, 4162], [4161, 4163], [4162, 4164, 4281], [4163, 4165], [4128, 4164, 4166], [4165, 4167], [4166, 4168, 4282], [4167, 4169], [4129, 4168, 4170], [4169, 4171], [4170, 4172, 4283], [4171, 4173], [4130, 4172, 4174], [4173, 4175], [4174, 4176, 4284], [4175, 4177], [4131, 4176, 4178], [4177, 4179], [4178, 4180, 4285], [4179, 4181], [4132, 4180, 4182], [4181, 4183], [4182, 4184, 4286], [4183, 4185], [4133, 4184, 4186], [4185, 4187], [4186, 4188, 4287], [4187, 4189], [4134, 4188, 4190], [4189, 4191], [4190, 4192, 4288], [4191, 4193], [4135, 4192, 4194], [4193, 4195], [4194, 4196, 4289], [4195, 4197], [4136, 4196, 4198], [4197, 4199], [4198, 4200, 4290], [4199, 4201], [4137, 4200, 4202], [4201, 4203], [4202, 4204, 4291], [4203, 4205], [4138, 4204, 4206], [4205, 4207], [4206, 4208, 4292], [4207, 4209], [4139, 4208, 4210], [4209, 4211], [4210, 4212, 4293], [4211, 4213], [4140, 4212, 4214], [4213, 4215], [4214, 4216, 4294], [4215, 4217], [4141, 4216, 4218], [4217, 4219], [4218, 4220, 4295], [4219, 4221], [4142, 4220, 4222], [4221, 4223], [4222, 4224, 4296], [4223, 4225], [4143, 4224, 4226], [4225, 4227], [4226, 4228, 4297], [4227, 4229], [4144, 4228, 4230], [4229, 4231], [4230, 4232, 4298], [4231, 4233], [4145, 4232, 4234], [4233, 4235], [4234, 4236, 4299], [4235, 4237], [4146, 4236, 4238], [4237, 4239], [4238, 4240, 4300], [4239, 4241], [4147, 4240, 4242], [4241, 4243], [4242, 4244, 4301], [4243, 4245], [4148, 4244, 4246], [4245, 4247], [4246, 4248, 4302], [4247, 4249], [4149, 4248, 4250], [4249, 4251], [4250, 4252, 4303], [4251, 4253], [4150, 4252, 4254], [4253, 4255], [4254, 4256, 4304], [4255, 4257], [4151, 4256, 4258], [4257, 4259], [4258, 4260, 4305], [4259, 4261], [4152, 4260, 4262], [4261, 4263], [4262, 4264, 4306], [4263, 4265], [4153, 4264, 4266], [4265, 4267], [4266, 4268, 4307], [4267, 4269], [4154, 4268, 4270], [4269, 4271], [4270, 4272, 4308], [4271, 4273], [4155, 4272, 4274], [4273, 4275], [4274, 4276, 4309], [4275, 4277], [4156, 4276, 4278], [4277, 4279], [4278, 4310], [4159, 4313], [4163, 4317], [4167, 4321], [4171, 4325], [4175, 4329], [4179, 4333], [4183, 4337], [4187, 4341], [4191, 4345], [4195, 4349], [4199, 4353], [4203, 4357], [4207, 4361], [4211, 4365], [4215, 4369], [4219, 4373], [4223, 4377], [4227, 4381], [4231, 4385], [4235, 4389], [4239, 4393], [4243, 4397], [4247, 4401], [4251, 4405], [4255, 4409], [4259, 4413], [4263, 4417], [4267, 4421], [4271, 4425], [4275, 4429], [4279, 4433], [4312, 4434], [4311, 4313], [4280, 4312, 4314], [4313, 4315], [4314, 4316, 4435], [4315, 4317], [4281, 4316, 4318], [4317, 4319], [4318, 4320, 4436], [4319, 4321], [4282, 4320, 4322], [4321, 4323], [4322, 4324, 4437], [4323, 4325], [4283, 4324, 4326], [4325, 4327], [4326, 4328, 4438], [4327, 4329], [4284, 4328, 4330], [4329, 4331], [4330, 4332, 4439], [4331, 4333], [4285, 4332, 4334], [4333, 4335], [4334, 4336, 4440], [4335, 4337], [4286, 4336, 4338], [4337, 4339], [4338, 4340, 4441], [4339, 4341], [4287, 4340, 4342], [4341, 4343], [4342, 4344, 4442], [4343, 4345], [4288, 4344, 4346], [4345, 4347], [4346, 4348, 4443], [4347, 4349], [4289, 4348, 4350], [4349, 4351], [4350, 4352, 4444], [4351, 4353], [4290, 4352, 4354], [4353, 4355], [4354, 4356, 4445], [4355, 4357], [4291, 4356, 4358], [4357, 4359], [4358, 4360, 4446], [4359, 4361], [4292, 4360, 4362], [4361, 4363], [4362, 4364, 4447], [4363, 4365], [4293, 4364, 4366], [4365, 4367], [4366, 4368, 4448], [4367, 4369], [4294, 4368, 4370], [4369, 4371], [4370, 4372, 4449], [4371, 4373], [4295, 4372, 4374], [4373, 4375], [4374, 4376, 4450], [4375, 4377], [4296, 4376, 4378], [4377, 4379], [4378, 4380, 4451], [4379, 4381], [4297, 4380, 4382], [4381, 4383], [4382, 4384, 4452], [4383, 4385], [4298, 4384, 4386], [4385, 4387], [4386, 4388, 4453], [4387, 4389], [4299, 4388, 4390], [4389, 4391], [4390, 4392, 4454], [4391, 4393], [4300, 4392, 4394], [4393, 4395], [4394, 4396, 4455], [4395, 4397], [4301, 4396, 4398], [4397, 4399], [4398, 4400, 4456], [4399, 4401], [4302, 4400, 4402], [4401, 4403], [4402, 4404, 4457], [4403, 4405], [4303, 4404, 4406], [4405, 4407], [4406, 4408, 4458], [4407, 4409], [4304, 4408, 4410], [4409, 4411], [4410, 4412, 4459], [4411, 4413], [4305, 4412, 4414], [4413, 4415], [4414, 4416, 4460], [4415, 4417], [4306, 4416, 4418], [4417, 4419], [4418, 4420, 4461], [4419, 4421], [4307, 4420, 4422], [4421, 4423], [4422, 4424, 4462], [4423, 4425], [4308, 4424, 4426], [4425, 4427], [4426, 4428, 4463], [4427, 4429], [4309, 4428, 4430], [4429, 4431], [4430, 4432, 4464], [4431, 4433], [4310, 4432], [4311, 4465], [4315, 4469], [4319, 4473], [4323, 4477], [4327, 4481], [4331, 4485], [4335, 4489], [4339, 4493], [4343, 4497], [4347, 4501], [4351, 4505], [4355, 4509], [4359, 4513], [4363, 4517], [4367, 4521], [4371, 4525], [4375, 4529], [4379, 4533], [4383, 4537], [4387, 4541], [4391, 4545], [4395, 4549], [4399, 4553], [4403, 4557], [4407, 4561], [4411, 4565], [4415, 4569], [4419, 4573], [4423, 4577], [4427, 4581], [4431, 4585], [4434, 4466], [4465, 4467], [4466, 4468, 4588], [4467, 4469], [4435, 4468, 4470], [4469, 4471], [4470, 4472, 4589], [4471, 4473], [4436, 4472, 4474], [4473, 4475], [4474, 4476, 4590], [4475, 4477], [4437, 4476, 4478], [4477, 4479], [4478, 4480, 4591], [4479, 4481], [4438, 4480, 4482], [4481, 4483], [4482, 4484, 4592], [4483, 4485], [4439, 4484, 4486], [4485, 4487], [4486, 4488, 4593], [4487, 4489], [4440, 4488, 4490], [4489, 4491], [4490, 4492, 4594], [4491, 4493], [4441, 4492, 4494], [4493, 4495], [4494, 4496, 4595], [4495, 4497], [4442, 4496, 4498], [4497, 4499], [4498, 4500, 4596], [4499, 4501], [4443, 4500, 4502], [4501, 4503], [4502, 4504, 4597], [4503, 4505], [4444, 4504, 4506], [4505, 4507], [4506, 4508, 4598], [4507, 4509], [4445, 4508, 4510], [4509, 4511], [4510, 4512, 4599], [4511, 4513], [4446, 4512, 4514], [4513, 4515], [4514, 4516, 4600], [4515, 4517], [4447, 4516, 4518], [4517, 4519], [4518, 4520, 4601], [4519, 4521], [4448, 4520, 4522], [4521, 4523], [4522, 4524, 4602], [4523, 4525], [4449, 4524, 4526], [4525, 4527], [4526, 4528, 4603], [4527, 4529], [4450, 4528, 4530], [4529, 4531], [4530, 4532, 4604], [4531, 4533], [4451, 4532, 4534], [4533, 4535], [4534, 4536, 4605], [4535, 4537], [4452, 4536, 4538], [4537, 4539], [4538, 4540, 4606], [4539, 4541], [4453, 4540, 4542], [4541, 4543], [4542, 4544, 4607], [4543, 4545], [4454, 4544, 4546], [4545, 4547], [4546, 4548, 4608], [4547, 4549], [4455, 4548, 4550], [4549, 4551], [4550, 4552, 4609], [4551, 4553], [4456, 4552, 4554], [4553, 4555], [4554, 4556, 4610], [4555, 4557], [4457, 4556, 4558], [4557, 4559], [4558, 4560, 4611], [4559, 4561], [4458, 4560, 4562], [4561, 4563], [4562, 4564, 4612], [4563, 4565], [4459, 4564, 4566], [4565, 4567], [4566, 4568, 4613], [4567, 4569], [4460, 4568, 4570], [4569, 4571], [4570, 4572, 4614], [4571, 4573], [4461, 4572, 4574], [4573, 4575], [4574, 4576, 4615], [4575, 4577], [4462, 4576, 4578], [4577, 4579], [4578, 4580, 4616], [4579, 4581], [4463, 4580, 4582], [4581, 4583], [4582, 4584, 4617], [4583, 4585], [4464, 4584, 4586], [4585, 4587], [4586, 4618], [4467, 4621], [4471, 4625], [4475, 4629], [4479, 4633], [4483, 4637], [4487, 4641], [4491, 4645], [4495, 4649], [4499, 4653], [4503, 4657], [4507, 4661], [4511, 4665], [4515, 4669], [4519, 4673], [4523, 4677], [4527, 4681], [4531, 4685], [4535, 4689], [4539, 4693], [4543, 4697], [4547, 4701], [4551, 4705], [4555, 4709], [4559, 4713], [4563, 4717], [4567, 4721], [4571, 4725], [4575, 4729], [4579, 4733], [4583, 4737], [4587, 4741], [4620, 4742], [4619, 4621], [4588, 4620, 4622], [4621, 4623], [4622, 4624, 4743], [4623, 4625], [4589, 4624, 4626], [4625, 4627], [4626, 4628, 4744], [4627, 4629], [4590, 4628, 4630], [4629, 4631], [4630, 4632, 4745], [4631, 4633], [4591, 4632, 4634], [4633, 4635], [4634, 4636, 4746], [4635, 4637], [4592, 4636, 4638], [4637, 4639], [4638, 4640, 4747], [4639, 4641], [4593, 4640, 4642], [4641, 4643], [4642, 4644, 4748], [4643, 4645], [4594, 4644, 4646], [4645, 4647], [4646, 4648, 4749], [4647, 4649], [4595, 4648, 4650], [4649, 4651], [4650, 4652, 4750], [4651, 4653], [4596, 4652, 4654], [4653, 4655], [4654, 4656, 4751], [4655, 4657], [4597, 4656, 4658], [4657, 4659], [4658, 4660, 4752], [4659, 4661], [4598, 4660, 4662], [4661, 4663], [4662, 4664, 4753], [4663, 4665], [4599, 4664, 4666], [4665, 4667], [4666, 4668, 4754], [4667, 4669], [4600, 4668, 4670], [4669, 4671], [4670, 4672, 4755], [4671, 4673], [4601, 4672, 4674], [4673, 4675], [4674, 4676, 4756], [4675, 4677], [4602, 4676, 4678], [4677, 4679], [4678, 4680, 4757], [4679, 4681], [4603, 4680, 4682], [4681, 4683], [4682, 4684, 4758], [4683, 4685], [4604, 4684, 4686], [4685, 4687], [4686, 4688, 4759], [4687, 4689], [4605, 4688, 4690], [4689, 4691], [4690, 4692, 4760], [4691, 4693], [4606, 4692, 4694], [4693, 4695], [4694, 4696, 4761], [4695, 4697], [4607, 4696, 4698], [4697, 4699], [4698, 4700, 4762], [4699, 4701], [4608, 4700, 4702], [4701, 4703], [4702, 4704, 4763], [4703, 4705], [4609, 4704, 4706], [4705, 4707], [4706, 4708, 4764], [4707, 4709], [4610, 4708, 4710], [4709, 4711], [4710, 4712, 4765], [4711, 4713], [4611, 4712, 4714], [4713, 4715], [4714, 4716, 4766], [4715, 4717], [4612, 4716, 4718], [4717, 4719], [4718, 4720, 4767], [4719, 4721], [4613, 4720, 4722], [4721, 4723], [4722, 4724, 4768], [4723, 4725], [4614, 4724, 4726], [4725, 4727], [4726, 4728, 4769], [4727, 4729], [4615, 4728, 4730], [4729, 4731], [4730, 4732, 4770], [4731, 4733], [4616, 4732, 4734], [4733, 4735], [4734, 4736, 4771], [4735, 4737], [4617, 4736, 4738], [4737, 4739], [4738, 4740, 4772], [4739, 4741], [4618, 4740], [4619, 4773], [4623, 4777], [4627, 4781], [4631, 4785], [4635, 4789], [4639, 4793], [4643, 4797], [4647, 4801], [4651, 4805], [4655, 4809], [4659, 4813], [4663, 4817], [4667, 4821], [4671, 4825], [4675, 4829], [4679, 4833], [4683, 4837], [4687, 4841], [4691, 4845], [4695, 4849], [4699, 4853], [4703, 4857], [4707, 4861], [4711, 4865], [4715, 4869], [4719, 4873], [4723, 4877], [4727, 4881], [4731, 4885], [4735, 4889], [4739, 4893], [4742, 4774], [4773, 4775], [4774, 4776, 4896], [4775, 4777], [4743, 4776, 4778], [4777, 4779], [4778, 4780, 4897], [4779, 4781], [4744, 4780, 4782], [4781, 4783], [4782, 4784, 4898], [4783, 4785], [4745, 4784, 4786], [4785, 4787], [4786, 4788, 4899], [4787, 4789], [4746, 4788, 4790], [4789, 4791], [4790, 4792, 4900], [4791, 4793], [4747, 4792, 4794], [4793, 4795], [4794, 4796, 4901], [4795, 4797], [4748, 4796, 4798], [4797, 4799], [4798, 4800, 4902], [4799, 4801], [4749, 4800, 4802], [4801, 4803], [4802, 4804, 4903], [4803, 4805], [4750, 4804, 4806], [4805, 4807], [4806, 4808, 4904], [4807, 4809], [4751, 4808, 4810], [4809, 4811], [4810, 4812, 4905], [4811, 4813], [4752, 4812, 4814], [4813, 4815], [4814, 4816, 4906], [4815, 4817], [4753, 4816, 4818], [4817, 4819], [4818, 4820, 4907], [4819, 4821], [4754, 4820, 4822], [4821, 4823], [4822, 4824, 4908], [4823, 4825], [4755, 4824, 4826], [4825, 4827], [4826, 4828, 4909], [4827, 4829], [4756, 4828, 4830], [4829, 4831], [4830, 4832, 4910], [4831, 4833], [4757, 4832, 4834], [4833, 4835], [4834, 4836, 4911], [4835, 4837], [4758, 4836, 4838], [4837, 4839], [4838, 4840, 4912], [4839, 4841], [4759, 4840, 4842], [4841, 4843], [4842, 4844, 4913], [4843, 4845], [4760, 4844, 4846], [4845, 4847], [4846, 4848, 4914], [4847, 4849], [4761, 4848, 4850], [4849, 4851], [4850, 4852, 4915], [4851, 4853], [4762, 4852, 4854], [4853, 4855], [4854, 4856, 4916], [4855, 4857], [4763, 4856, 4858], [4857, 4859], [4858, 4860, 4917], [4859, 4861], [4764, 4860, 4862], [4861, 4863], [4862, 4864, 4918], [4863, 4865], [4765, 4864, 4866], [4865, 4867], [4866, 4868, 4919], [4867, 4869], [4766, 4868, 4870], [4869, 4871], [4870, 4872, 4920], [4871, 4873], [4767, 4872, 4874], [4873, 4875], [4874, 4876, 4921], [4875, 4877], [4768, 4876, 4878], [4877, 4879], [4878, 4880, 4922], [4879, 4881], [4769, 4880, 4882], [4881, 4883], [4882, 4884, 4923], [4883, 4885], [4770, 4884, 4886], [4885, 4887], [4886, 4888, 4924], [4887, 4889], [4771, 4888, 4890], [4889, 4891], [4890, 4892, 4925], [4891, 4893], [4772, 4892, 4894], [4893, 4895], [4894, 4926], [4775, 4929], [4779, 4933], [4783, 4937], [4787, 4941], [4791, 4945], [4795, 4949], [4799, 4953], [4803, 4957], [4807, 4961], [4811, 4965], [4815, 4969], [4819, 4973], [4823, 4977], [4827, 4981], [4831, 4985], [4835, 4989], [4839, 4993], [4843, 4997], [4847, 5001], [4851, 5005], [4855, 5009], [4859, 5013], [4863, 5017], [4867, 5021], [4871, 5025], [4875, 5029], [4879, 5033], [4883, 5037], [4887, 5041], [4891, 5045], [4895, 5049], [4928, 5050], [4927, 4929], [4896, 4928, 4930], [4929, 4931], [4930, 4932, 5051], [4931, 4933], [4897, 4932, 4934], [4933, 4935], [4934, 4936, 5052], [4935, 4937], [4898, 4936, 4938], [4937, 4939], [4938, 4940, 5053], [4939, 4941], [4899, 4940, 4942], [4941, 4943], [4942, 4944, 5054], [4943, 4945], [4900, 4944, 4946], [4945, 4947], [4946, 4948, 5055], [4947, 4949], [4901, 4948, 4950], [4949, 4951], [4950, 4952, 5056], [4951, 4953], [4902, 4952, 4954], [4953, 4955], [4954, 4956, 5057], [4955, 4957], [4903, 4956, 4958], [4957, 4959], [4958, 4960, 5058], [4959, 4961], [4904, 4960, 4962], [4961, 4963], [4962, 4964, 5059], [4963, 4965], [4905, 4964, 4966], [4965, 4967], [4966, 4968, 5060], [4967, 4969], [4906, 4968, 4970], [4969, 4971], [4970, 4972, 5061], [4971, 4973], [4907, 4972, 4974], [4973, 4975], [4974, 4976, 5062], [4975, 4977], [4908, 4976, 4978], [4977, 4979], [4978, 4980, 5063], [4979, 4981], [4909, 4980, 4982], [4981, 4983], [4982, 4984, 5064], [4983, 4985], [4910, 4984, 4986], [4985, 4987], [4986, 4988, 5065], [4987, 4989], [4911, 4988, 4990], [4989, 4991], [4990, 4992, 5066], [4991, 4993], [4912, 4992, 4994], [4993, 4995], [4994, 4996, 5067], [4995, 4997], [4913, 4996, 4998], [4997, 4999], [4998, 5000, 5068], [4999, 5001], [4914, 5000, 5002], [5001, 5003], [5002, 5004, 5069], [5003, 5005], [4915, 5004, 5006], [5005, 5007], [5006, 5008, 5070], [5007, 5009], [4916, 5008, 5010], [5009, 5011], [5010, 5012, 5071], [5011, 5013], [4917, 5012, 5014], [5013, 5015], [5014, 5016, 5072], [5015, 5017], [4918, 5016, 5018], [5017, 5019], [5018, 5020, 5073], [5019, 5021], [4919, 5020, 5022], [5021, 5023], [5022, 5024, 5074], [5023, 5025], [4920, 5024, 5026], [5025, 5027], [5026, 5028, 5075], [5027, 5029], [4921, 5028, 5030], [5029, 5031], [5030, 5032, 5076], [5031, 5033], [4922, 5032, 5034], [5033, 5035], [5034, 5036, 5077], [5035, 5037], [4923, 5036, 5038], [5037, 5039], [5038, 5040, 5078], [5039, 5041], [4924, 5040, 5042], [5041, 5043], [5042, 5044, 5079], [5043, 5045], [4925, 5044, 5046], [5045, 5047], [5046, 5048, 5080], [5047, 5049], [4926, 5048], [4927, 5081], [4931, 5085], [4935, 5089], [4939, 5093], [4943, 5097], [4947, 5101], [4951, 5105], [4955, 5109], [4959, 5113], [4963, 5117], [4967, 5121], [4971, 5125], [4975, 5129], [4979, 5133], [4983, 5137], [4987, 5141], [4991, 5145], [4995, 5149], [4999, 5153], [5003, 5157], [5007, 5161], [5011, 5165], [5015, 5169], [5019, 5173], [5023, 5177], [5027, 5181], [5031, 5185], [5035, 5189], [5039, 5193], [5043, 5197], [5047, 5201], [5050, 5082], [5081, 5083], [5082, 5084, 5204], [5083, 5085], [5051, 5084, 5086], [5085, 5087], [5086, 5088, 5205], [5087, 5089], [5052, 5088, 5090], [5089, 5091], [5090, 5092, 5206], [5091, 5093], [5053, 5092, 5094], [5093, 5095], [5094, 5096, 5207], [5095, 5097], [5054, 5096, 5098], [5097, 5099], [5098, 5100, 5208], [5099, 5101], [5055, 5100, 5102], [5101, 5103], [5102, 5104, 5209], [5103, 5105], [5056, 5104, 5106], [5105, 5107], [5106, 5108, 5210], [5107, 5109], [5057, 5108, 5110], [5109, 5111], [5110, 5112, 5211], [5111, 5113], [5058, 5112, 5114], [5113, 5115], [5114, 5116, 5212], [5115, 5117], [5059, 5116, 5118], [5117, 5119], [5118, 5120, 5213], [5119, 5121], [5060, 5120, 5122], [5121, 5123], [5122, 5124, 5214], [5123, 5125], [5061, 5124, 5126], [5125, 5127], [5126, 5128, 5215], [5127, 5129], [5062, 5128, 5130], [5129, 5131], [5130, 5132, 5216], [5131, 5133], [5063, 5132, 5134], [5133, 5135], [5134, 5136, 5217], [5135, 5137], [5064, 5136, 5138], [5137, 5139], [5138, 5140, 5218], [5139, 5141], [5065, 5140, 5142], [5141, 5143], [5142, 5144, 5219], [5143, 5145], [5066, 5144, 5146], [5145, 5147], [5146, 5148, 5220], [5147, 5149], [5067, 5148, 5150], [5149, 5151], [5150, 5152, 5221], [5151, 5153], [5068, 5152, 5154], [5153, 5155], [5154, 5156, 5222], [5155, 5157], [5069, 5156, 5158], [5157, 5159], [5158, 5160, 5223], [5159, 5161], [5070, 5160, 5162], [5161, 5163], [5162, 5164, 5224], [5163, 5165], [5071, 5164, 5166], [5165, 5167], [5166, 5168, 5225], [5167, 5169], [5072, 5168, 5170], [5169, 5171], [5170, 5172, 5226], [5171, 5173], [5073, 5172, 5174], [5173, 5175], [5174, 5176, 5227], [5175, 5177], [5074, 5176, 5178], [5177, 5179], [5178, 5180, 5228], [5179, 5181], [5075, 5180, 5182], [5181, 5183], [5182, 5184, 5229], [5183, 5185], [5076, 5184, 5186], [5185, 5187], [5186, 5188, 5230], [5187, 5189], [5077, 5188, 5190], [5189, 5191], [5190, 5192, 5231], [5191, 5193], [5078, 5192, 5194], [5193, 5195], [5194, 5196, 5232], [5195, 5197], [5079, 5196, 5198], [5197, 5199], [5198, 5200, 5233], [5199, 5201], [5080, 5200, 5202], [5201, 5203], [5202, 5234], [5083, 5237], [5087, 5241], [5091, 5245], [5095, 5249], [5099, 5253], [5103, 5257], [5107, 5261], [5111, 5265], [5115, 5269], [5119, 5273], [5123, 5277], [5127, 5281], [5131, 5285], [5135, 5289], [5139, 5293], [5143, 5297], [5147, 5301], [5151, 5305], [5155, 5309], [5159, 5313], [5163, 5317], [5167, 5321], [5171, 5325], [5175, 5329], [5179, 5333], [5183, 5337], [5187, 5341], [5191, 5345], [5195, 5349], [5199, 5353], [5203, 5357], [5236, 5358], [5235, 5237], [5204, 5236, 5238], [5237, 5239], [5238, 5240, 5359], [5239, 5241], [5205, 5240, 5242], [5241, 5243], [5242, 5244, 5360], [5243, 5245], [5206, 5244, 5246], [5245, 5247], [5246, 5248, 5361], [5247, 5249], [5207, 5248, 5250], [5249, 5251], [5250, 5252, 5362], [5251, 5253], [5208, 5252, 5254], [5253, 5255], [5254, 5256, 5363], [5255, 5257], [5209, 5256, 5258], [5257, 5259], [5258, 5260, 5364], [5259, 5261], [5210, 5260, 5262], [5261, 5263], [5262, 5264, 5365], [5263, 5265], [5211, 5264, 5266], [5265, 5267], [5266, 5268, 5366], [5267, 5269], [5212, 5268, 5270], [5269, 5271], [5270, 5272, 5367], [5271, 5273], [5213, 5272, 5274], [5273, 5275], [5274, 5276, 5368], [5275, 5277], [5214, 5276, 5278], [5277, 5279], [5278, 5280, 5369], [5279, 5281], [5215, 5280, 5282], [5281, 5283], [5282, 5284, 5370], [5283, 5285], [5216, 5284, 5286], [5285, 5287], [5286, 5288, 5371], [5287, 5289], [5217, 5288, 5290], [5289, 5291], [5290, 5292, 5372], [5291, 5293], [5218, 5292, 5294], [5293, 5295], [5294, 5296, 5373], [5295, 5297], [5219, 5296, 5298], [5297, 5299], [5298, 5300, 5374], [5299, 5301], [5220, 5300, 5302], [5301, 5303], [5302, 5304, 5375], [5303, 5305], [5221, 5304, 5306], [5305, 5307], [5306, 5308, 5376], [5307, 5309], [5222, 5308, 5310], [5309, 5311], [5310, 5312, 5377], [5311, 5313], [5223, 5312, 5314], [5313, 5315], [5314, 5316, 5378], [5315, 5317], [5224, 5316, 5318], [5317, 5319], [5318, 5320, 5379], [5319, 5321], [5225, 5320, 5322], [5321, 5323], [5322, 5324, 5380], [5323, 5325], [5226, 5324, 5326], [5325, 5327], [5326, 5328, 5381], [5327, 5329], [5227, 5328, 5330], [5329, 5331], [5330, 5332, 5382], [5331, 5333], [5228, 5332, 5334], [5333, 5335], [5334, 5336, 5383], [5335, 5337], [5229, 5336, 5338], [5337, 5339], [5338, 5340, 5384], [5339, 5341], [5230, 5340, 5342], [5341, 5343], [5342, 5344, 5385], [5343, 5345], [5231, 5344, 5346], [5345, 5347], [5346, 5348, 5386], [5347, 5349], [5232, 5348, 5350], [5349, 5351], [5350, 5352, 5387], [5351, 5353], [5233, 5352, 5354], [5353, 5355], [5354, 5356, 5388], [5355, 5357], [5234, 5356], [5235, 5389], [5239, 5393], [5243, 5397], [5247, 5401], [5251, 5405], [5255, 5409], [5259, 5413], [5263, 5417], [5267, 5421], [5271, 5425], [5275, 5429], [5279, 5433], [5283, 5437], [5287, 5441], [5291, 5445], [5295, 5449], [5299, 5453], [5303, 5457], [5307, 5461], [5311, 5465], [5315, 5469], [5319, 5473], [5323, 5477], [5327, 5481], [5331, 5485], [5335, 5489], [5339, 5493], [5343, 5497], [5347, 5501], [5351, 5505], [5355, 5509], [5358, 5390], [5389, 5391], [5390, 5392, 5512], [5391, 5393], [5359, 5392, 5394], [5393, 5395], [5394, 5396, 5513], [5395, 5397], [5360, 5396, 5398], [5397, 5399], [5398, 5400, 5514], [5399, 5401], [5361, 5400, 5402], [5401, 5403], [5402, 5404, 5515], [5403, 5405], [5362, 5404, 5406], [5405, 5407], [5406, 5408, 5516], [5407, 5409], [5363, 5408, 5410], [5409, 5411], [5410, 5412, 5517], [5411, 5413], [5364, 5412, 5414], [5413, 5415], [5414, 5416, 5518], [5415, 5417], [5365, 5416, 5418], [5417, 5419], [5418, 5420, 5519], [5419, 5421], [5366, 5420, 5422], [5421, 5423], [5422, 5424, 5520], [5423, 5425], [5367, 5424, 5426], [5425, 5427], [5426, 5428, 5521], [5427, 5429], [5368, 5428, 5430], [5429, 5431], [5430, 5432, 5522], [5431, 5433], [5369, 5432, 5434], [5433, 5435], [5434, 5436, 5523], [5435, 5437], [5370, 5436, 5438], [5437, 5439], [5438, 5440, 5524], [5439, 5441], [5371, 5440, 5442], [5441, 5443], [5442, 5444, 5525], [5443, 5445], [5372, 5444, 5446], [5445, 5447], [5446, 5448, 5526], [5447, 5449], [5373, 5448, 5450], [5449, 5451], [5450, 5452, 5527], [5451, 5453], [5374, 5452, 5454], [5453, 5455], [5454, 5456, 5528], [5455, 5457], [5375, 5456, 5458], [5457, 5459], [5458, 5460, 5529], [5459, 5461], [5376, 5460, 5462], [5461, 5463], [5462, 5464, 5530], [5463, 5465], [5377, 5464, 5466], [5465, 5467], [5466, 5468, 5531], [5467, 5469], [5378, 5468, 5470], [5469, 5471], [5470, 5472, 5532], [5471, 5473], [5379, 5472, 5474], [5473, 5475], [5474, 5476, 5533], [5475, 5477], [5380, 5476, 5478], [5477, 5479], [5478, 5480, 5534], [5479, 5481], [5381, 5480, 5482], [5481, 5483], [5482, 5484, 5535], [5483, 5485], [5382, 5484, 5486], [5485, 5487], [5486, 5488, 5536], [5487, 5489], [5383, 5488, 5490], [5489, 5491], [5490, 5492, 5537], [5491, 5493], [5384, 5492, 5494], [5493, 5495], [5494, 5496, 5538], [5495, 5497], [5385, 5496, 5498], [5497, 5499], [5498, 5500, 5539], [5499, 5501], [5386, 5500, 5502], [5501, 5503], [5502, 5504, 5540], [5503, 5505], [5387, 5504, 5506], [5505, 5507], [5506, 5508, 5541], [5507, 5509], [5388, 5508, 5510], [5509, 5511], [5510, 5542], [5391, 5545], [5395, 5549], [5399, 5553], [5403, 5557], [5407, 5561], [5411, 5565], [5415, 5569], [5419, 5573], [5423, 5577], [5427, 5581], [5431, 5585], [5435, 5589], [5439, 5593], [5443, 5597], [5447, 5601], [5451, 5605], [5455, 5609], [5459, 5613], [5463, 5617], [5467, 5621], [5471, 5625], [5475, 5629], [5479, 5633], [5483, 5637], [5487, 5641], [5491, 5645], [5495, 5649], [5499, 5653], [5503, 5657], [5507, 5661], [5511, 5665], [5544, 5666], [5543, 5545], [5512, 5544, 5546], [5545, 5547], [5546, 5548, 5667], [5547, 5549], [5513, 5548, 5550], [5549, 5551], [5550, 5552, 5668], [5551, 5553], [5514, 5552, 5554], [5553, 5555], [5554, 5556, 5669], [5555, 5557], [5515, 5556, 5558], [5557, 5559], [5558, 5560, 5670], [5559, 5561], [5516, 5560, 5562], [5561, 5563], [5562, 5564, 5671], [5563, 5565], [5517, 5564, 5566], [5565, 5567], [5566, 5568, 5672], [5567, 5569], [5518, 5568, 5570], [5569, 5571], [5570, 5572, 5673], [5571, 5573], [5519, 5572, 5574], [5573, 5575], [5574, 5576, 5674], [5575, 5577], [5520, 5576, 5578], [5577, 5579], [5578, 5580, 5675], [5579, 5581], [5521, 5580, 5582], [5581, 5583], [5582, 5584, 5676], [5583, 5585], [5522, 5584, 5586], [5585, 5587], [5586, 5588, 5677], [5587, 5589], [5523, 5588, 5590], [5589, 5591], [5590, 5592, 5678], [5591, 5593], [5524, 5592, 5594], [5593, 5595], [5594, 5596, 5679], [5595, 5597], [5525, 5596, 5598], [5597, 5599], [5598, 5600, 5680], [5599, 5601], [5526, 5600, 5602], [5601, 5603], [5602, 5604, 5681], [5603, 5605], [5527, 5604, 5606], [5605, 5607], [5606, 5608, 5682], [5607, 5609], [5528, 5608, 5610], [5609, 5611], [5610, 5612, 5683], [5611, 5613], [5529, 5612, 5614], [5613, 5615], [5614, 5616, 5684], [5615, 5617], [5530, 5616, 5618], [5617, 5619], [5618, 5620, 5685], [5619, 5621], [5531, 5620, 5622], [5621, 5623], [5622, 5624, 5686], [5623, 5625], [5532, 5624, 5626], [5625, 5627], [5626, 5628, 5687], [5627, 5629], [5533, 5628, 5630], [5629, 5631], [5630, 5632, 5688], [5631, 5633], [5534, 5632, 5634], [5633, 5635], [5634, 5636, 5689], [5635, 5637], [5535, 5636, 5638], [5637, 5639], [5638, 5640, 5690], [5639, 5641], [5536, 5640, 5642], [5641, 5643], [5642, 5644, 5691], [5643, 5645], [5537, 5644, 5646], [5645, 5647], [5646, 5648, 5692], [5647, 5649], [5538, 5648, 5650], [5649, 5651], [5650, 5652, 5693], [5651, 5653], [5539, 5652, 5654], [5653, 5655], [5654, 5656, 5694], [5655, 5657], [5540, 5656, 5658], [5657, 5659], [5658, 5660, 5695], [5659, 5661], [5541, 5660, 5662], [5661, 5663], [5662, 5664, 5696], [5663, 5665], [5542, 5664], [5543, 5697], [5547, 5701], [5551, 5705], [5555, 5709], [5559, 5713], [5563, 5717], [5567, 5721], [5571, 5725], [5575, 5729], [5579, 5733], [5583, 5737], [5587, 5741], [5591, 5745], [5595, 5749], [5599, 5753], [5603, 5757], [5607, 5761], [5611, 5765], [5615, 5769], [5619, 5773], [5623, 5777], [5627, 5781], [5631, 5785], [5635, 5789], [5639, 5793], [5643, 5797], [5647, 5801], [5651, 5805], [5655, 5809], [5659, 5813], [5663, 5817], [5666, 5698], [5697, 5699], [5698, 5700, 5820], [5699, 5701], [5667, 5700, 5702], [5701, 5703], [5702, 5704, 5821], [5703, 5705], [5668, 5704, 5706], [5705, 5707], [5706, 5708, 5822], [5707, 5709], [5669, 5708, 5710], [5709, 5711], [5710, 5712, 5823], [5711, 5713], [5670, 5712, 5714], [5713, 5715], [5714, 5716, 5824], [5715, 5717], [5671, 5716, 5718], [5717, 5719], [5718, 5720, 5825], [5719, 5721], [5672, 5720, 5722], [5721, 5723], [5722, 5724, 5826], [5723, 5725], [5673, 5724, 5726], [5725, 5727], [5726, 5728, 5827], [5727, 5729], [5674, 5728, 5730], [5729, 5731], [5730, 5732, 5828], [5731, 5733], [5675, 5732, 5734], [5733, 5735], [5734, 5736, 5829], [5735, 5737], [5676, 5736, 5738], [5737, 5739], [5738, 5740, 5830], [5739, 5741], [5677, 5740, 5742], [5741, 5743], [5742, 5744, 5831], [5743, 5745], [5678, 5744, 5746], [5745, 5747], [5746, 5748, 5832], [5747, 5749], [5679, 5748, 5750], [5749, 5751], [5750, 5752, 5833], [5751, 5753], [5680, 5752, 5754], [5753, 5755], [5754, 5756, 5834], [5755, 5757], [5681, 5756, 5758], [5757, 5759], [5758, 5760, 5835], [5759, 5761], [5682, 5760, 5762], [5761, 5763], [5762, 5764, 5836], [5763, 5765], [5683, 5764, 5766], [5765, 5767], [5766, 5768, 5837], [5767, 5769], [5684, 5768, 5770], [5769, 5771], [5770, 5772, 5838], [5771, 5773], [5685, 5772, 5774], [5773, 5775], [5774, 5776, 5839], [5775, 5777], [5686, 5776, 5778], [5777, 5779], [5778, 5780, 5840], [5779, 5781], [5687, 5780, 5782], [5781, 5783], [5782, 5784, 5841], [5783, 5785], [5688, 5784, 5786], [5785, 5787], [5786, 5788, 5842], [5787, 5789], [5689, 5788, 5790], [5789, 5791], [5790, 5792, 5843], [5791, 5793], [5690, 5792, 5794], [5793, 5795], [5794, 5796, 5844], [5795, 5797], [5691, 5796, 5798], [5797, 5799], [5798, 5800, 5845], [5799, 5801], [5692, 5800, 5802], [5801, 5803], [5802, 5804, 5846], [5803, 5805], [5693, 5804, 5806], [5805, 5807], [5806, 5808, 5847], [5807, 5809], [5694, 5808, 5810], [5809, 5811], [5810, 5812, 5848], [5811, 5813], [5695, 5812, 5814], [5813, 5815], [5814, 5816, 5849], [5815, 5817], [5696, 5816, 5818], [5817, 5819], [5818, 5850], [5699, 5853], [5703, 5857], [5707, 5861], [5711, 5865], [5715, 5869], [5719, 5873], [5723, 5877], [5727, 5881], [5731, 5885], [5735, 5889], [5739, 5893], [5743, 5897], [5747, 5901], [5751, 5905], [5755, 5909], [5759, 5913], [5763, 5917], [5767, 5921], [5771, 5925], [5775, 5929], [5779, 5933], [5783, 5937], [5787, 5941], [5791, 5945], [5795, 5949], [5799, 5953], [5803, 5957], [5807, 5961], [5811, 5965], [5815, 5969], [5819, 5973], [5852, 5974], [5851, 5853], [5820, 5852, 5854], [5853, 5855], [5854, 5856, 5975], [5855, 5857], [5821, 5856, 5858], [5857, 5859], [5858, 5860, 5976], [5859, 5861], [5822, 5860, 5862], [5861, 5863], [5862, 5864, 5977], [5863, 5865], [5823, 5864, 5866], [5865, 5867], [5866, 5868, 5978], [5867, 5869], [5824, 5868, 5870], [5869, 5871], [5870, 5872, 5979], [5871, 5873], [5825, 5872, 5874], [5873, 5875], [5874, 5876, 5980], [5875, 5877], [5826, 5876, 5878], [5877, 5879], [5878, 5880, 5981], [5879, 5881], [5827, 5880, 5882], [5881, 5883], [5882, 5884, 5982], [5883, 5885], [5828, 5884, 5886], [5885, 5887], [5886, 5888, 5983], [5887, 5889], [5829, 5888, 5890], [5889, 5891], [5890, 5892, 5984], [5891, 5893], [5830, 5892, 5894], [5893, 5895], [5894, 5896, 5985], [5895, 5897], [5831, 5896, 5898], [5897, 5899], [5898, 5900, 5986], [5899, 5901], [5832, 5900, 5902], [5901, 5903], [5902, 5904, 5987], [5903, 5905], [5833, 5904, 5906], [5905, 5907], [5906, 5908, 5988], [5907, 5909], [5834, 5908, 5910], [5909, 5911], [5910, 5912, 5989], [5911, 5913], [5835, 5912, 5914], [5913, 5915], [5914, 5916, 5990], [5915, 5917], [5836, 5916, 5918], [5917, 5919], [5918, 5920, 5991], [5919, 5921], [5837, 5920, 5922], [5921, 5923], [5922, 5924, 5992], [5923, 5925], [5838, 5924, 5926], [5925, 5927], [5926, 5928, 5993], [5927, 5929], [5839, 5928, 5930], [5929, 5931], [5930, 5932, 5994], [5931, 5933], [5840, 5932, 5934], [5933, 5935], [5934, 5936, 5995], [5935, 5937], [5841, 5936, 5938], [5937, 5939], [5938, 5940, 5996], [5939, 5941], [5842, 5940, 5942], [5941, 5943], [5942, 5944, 5997], [5943, 5945], [5843, 5944, 5946], [5945, 5947], [5946, 5948, 5998], [5947, 5949], [5844, 5948, 5950], [5949, 5951], [5950, 5952, 5999], [5951, 5953], [5845, 5952, 5954], [5953, 5955], [5954, 5956, 6000], [5955, 5957], [5846, 5956, 5958], [5957, 5959], [5958, 5960, 6001], [5959, 5961], [5847, 5960, 5962], [5961, 5963], [5962, 5964, 6002], [5963, 5965], [5848, 5964, 5966], [5965, 5967], [5966, 5968, 6003], [5967, 5969], [5849, 5968, 5970], [5969, 5971], [5970, 5972, 6004], [5971, 5973], [5850, 5972], [5851, 6005], [5855, 6009], [5859, 6013], [5863, 6017], [5867, 6021], [5871, 6025], [5875, 6029], [5879, 6033], [5883, 6037], [5887, 6041], [5891, 6045], [5895, 6049], [5899, 6053], [5903, 6057], [5907, 6061], [5911, 6065], [5915, 6069], [5919, 6073], [5923, 6077], [5927, 6081], [5931, 6085], [5935, 6089], [5939, 6093], [5943, 6097], [5947, 6101], [5951, 6105], [5955, 6109], [5959, 6113], [5963, 6117], [5967, 6121], [5971, 6125], [5974, 6006], [6005, 6007], [6006, 6008, 6128], [6007, 6009], [5975, 6008, 6010], [6009, 6011], [6010, 6012, 6129], [6011, 6013], [5976, 6012, 6014], [6013, 6015], [6014, 6016, 6130], [6015, 6017], [5977, 6016, 6018], [6017, 6019], [6018, 6020, 6131], [6019, 6021], [5978, 6020, 6022], [6021, 6023], [6022, 6024, 6132], [6023, 6025], [5979, 6024, 6026], [6025, 6027], [6026, 6028, 6133], [6027, 6029], [5980, 6028, 6030], [6029, 6031], [6030, 6032, 6134], [6031, 6033], [5981, 6032, 6034], [6033, 6035], [6034, 6036, 6135], [6035, 6037], [5982, 6036, 6038], [6037, 6039], [6038, 6040, 6136], [6039, 6041], [5983, 6040, 6042], [6041, 6043], [6042, 6044, 6137], [6043, 6045], [5984, 6044, 6046], [6045, 6047], [6046, 6048, 6138], [6047, 6049], [5985, 6048, 6050], [6049, 6051], [6050, 6052, 6139], [6051, 6053], [5986, 6052, 6054], [6053, 6055], [6054, 6056, 6140], [6055, 6057], [5987, 6056, 6058], [6057, 6059], [6058, 6060, 6141], [6059, 6061], [5988, 6060, 6062], [6061, 6063], [6062, 6064, 6142], [6063, 6065], [5989, 6064, 6066], [6065, 6067], [6066, 6068, 6143], [6067, 6069], [5990, 6068, 6070], [6069, 6071], [6070, 6072, 6144], [6071, 6073], [5991, 6072, 6074], [6073, 6075], [6074, 6076, 6145], [6075, 6077], [5992, 6076, 6078], [6077, 6079], [6078, 6080, 6146], [6079, 6081], [5993, 6080, 6082], [6081, 6083], [6082, 6084, 6147], [6083, 6085], [5994, 6084, 6086], [6085, 6087], [6086, 6088, 6148], [6087, 6089], [5995, 6088, 6090], [6089, 6091], [6090, 6092, 6149], [6091, 6093], [5996, 6092, 6094], [6093, 6095], [6094, 6096, 6150], [6095, 6097], [5997, 6096, 6098], [6097, 6099], [6098, 6100, 6151], [6099, 6101], [5998, 6100, 6102], [6101, 6103], [6102, 6104, 6152], [6103, 6105], [5999, 6104, 6106], [6105, 6107], [6106, 6108, 6153], [6107, 6109], [6000, 6108, 6110], [6109, 6111], [6110, 6112, 6154], [6111, 6113], [6001, 6112, 6114], [6113, 6115], [6114, 6116, 6155], [6115, 6117], [6002, 6116, 6118], [6117, 6119], [6118, 6120, 6156], [6119, 6121], [6003, 6120, 6122], [6121, 6123], [6122, 6124, 6157], [6123, 6125], [6004, 6124, 6126], [6125, 6127], [6126, 6158], [6007, 6161], [6011, 6165], [6015, 6169], [6019, 6173], [6023, 6177], [6027, 6181], [6031, 6185], [6035, 6189], [6039, 6193], [6043, 6197], [6047, 6201], [6051, 6205], [6055, 6209], [6059, 6213], [6063, 6217], [6067, 6221], [6071, 6225], [6075, 6229], [6079, 6233], [6083, 6237], [6087, 6241], [6091, 6245], [6095, 6249], [6099, 6253], [6103, 6257], [6107, 6261], [6111, 6265], [6115, 6269], [6119, 6273], [6123, 6277], [6127, 6281], [6160, 6282], [6159, 6161], [6128, 6160, 6162], [6161, 6163], [6162, 6164, 6283], [6163, 6165], [6129, 6164, 6166], [6165, 6167], [6166, 6168, 6284], [6167, 6169], [6130, 6168, 6170], [6169, 6171], [6170, 6172, 6285], [6171, 6173], [6131, 6172, 6174], [6173, 6175], [6174, 6176, 6286], [6175, 6177], [6132, 6176, 6178], [6177, 6179], [6178, 6180, 6287], [6179, 6181], [6133, 6180, 6182], [6181, 6183], [6182, 6184, 6288], [6183, 6185], [6134, 6184, 6186], [6185, 6187], [6186, 6188, 6289], [6187, 6189], [6135, 6188, 6190], [6189, 6191], [6190, 6192, 6290], [6191, 6193], [6136, 6192, 6194], [6193, 6195], [6194, 6196, 6291], [6195, 6197], [6137, 6196, 6198], [6197, 6199], [6198, 6200, 6292], [6199, 6201], [6138, 6200, 6202], [6201, 6203], [6202, 6204, 6293], [6203, 6205], [6139, 6204, 6206], [6205, 6207], [6206, 6208, 6294], [6207, 6209], [6140, 6208, 6210], [6209, 6211], [6210, 6212, 6295], [6211, 6213], [6141, 6212, 6214], [6213, 6215], [6214, 6216, 6296], [6215, 6217], [6142, 6216, 6218], [6217, 6219], [6218, 6220, 6297], [6219, 6221], [6143, 6220, 6222], [6221, 6223], [6222, 6224, 6298], [6223, 6225], [6144, 6224, 6226], [6225, 6227], [6226, 6228, 6299], [6227, 6229], [6145, 6228, 6230], [6229, 6231], [6230, 6232, 6300], [6231, 6233], [6146, 6232, 6234], [6233, 6235], [6234, 6236, 6301], [6235, 6237], [6147, 6236, 6238], [6237, 6239], [6238, 6240, 6302], [6239, 6241], [6148, 6240, 6242], [6241, 6243], [6242, 6244, 6303], [6243, 6245], [6149, 6244, 6246], [6245, 6247], [6246, 6248, 6304], [6247, 6249], [6150, 6248, 6250], [6249, 6251], [6250, 6252, 6305], [6251, 6253], [6151, 6252, 6254], [6253, 6255], [6254, 6256, 6306], [6255, 6257], [6152, 6256, 6258], [6257, 6259], [6258, 6260, 6307], [6259, 6261], [6153, 6260, 6262], [6261, 6263], [6262, 6264, 6308], [6263, 6265], [6154, 6264, 6266], [6265, 6267], [6266, 6268, 6309], [6267, 6269], [6155, 6268, 6270], [6269, 6271], [6270, 6272, 6310], [6271, 6273], [6156, 6272, 6274], [6273, 6275], [6274, 6276, 6311], [6275, 6277], [6157, 6276, 6278], [6277, 6279], [6278, 6280, 6312], [6279, 6281], [6158, 6280], [6159, 6313], [6163, 6317], [6167, 6321], [6171, 6325], [6175, 6329], [6179, 6333], [6183, 6337], [6187, 6341], [6191, 6345], [6195, 6349], [6199, 6353], [6203, 6357], [6207, 6361], [6211, 6365], [6215, 6369], [6219, 6373], [6223, 6377], [6227, 6381], [6231, 6385], [6235, 6389], [6239, 6393], [6243, 6397], [6247, 6401], [6251, 6405], [6255, 6409], [6259, 6413], [6263, 6417], [6267, 6421], [6271, 6425], [6275, 6429], [6279, 6433], [6282, 6314], [6313, 6315], [6314, 6316, 6436], [6315, 6317], [6283, 6316, 6318], [6317, 6319], [6318, 6320, 6437], [6319, 6321], [6284, 6320, 6322], [6321, 6323], [6322, 6324, 6438], [6323, 6325], [6285, 6324, 6326], [6325, 6327], [6326, 6328, 6439], [6327, 6329], [6286, 6328, 6330], [6329, 6331], [6330, 6332, 6440], [6331, 6333], [6287, 6332, 6334], [6333, 6335], [6334, 6336, 6441], [6335, 6337], [6288, 6336, 6338], [6337, 6339], [6338, 6340, 6442], [6339, 6341], [6289, 6340, 6342], [6341, 6343], [6342, 6344, 6443], [6343, 6345], [6290, 6344, 6346], [6345, 6347], [6346, 6348, 6444], [6347, 6349], [6291, 6348, 6350], [6349, 6351], [6350, 6352, 6445], [6351, 6353], [6292, 6352, 6354], [6353, 6355], [6354, 6356, 6446], [6355, 6357], [6293, 6356, 6358], [6357, 6359], [6358, 6360, 6447], [6359, 6361], [6294, 6360, 6362], [6361, 6363], [6362, 6364, 6448], [6363, 6365], [6295, 6364, 6366], [6365, 6367], [6366, 6368, 6449], [6367, 6369], [6296, 6368, 6370], [6369, 6371], [6370, 6372, 6450], [6371, 6373], [6297, 6372, 6374], [6373, 6375], [6374, 6376, 6451], [6375, 6377], [6298, 6376, 6378], [6377, 6379], [6378, 6380, 6452], [6379, 6381], [6299, 6380, 6382], [6381, 6383], [6382, 6384, 6453], [6383, 6385], [6300, 6384, 6386], [6385, 6387], [6386, 6388, 6454], [6387, 6389], [6301, 6388, 6390], [6389, 6391], [6390, 6392, 6455], [6391, 6393], [6302, 6392, 6394], [6393, 6395], [6394, 6396, 6456], [6395, 6397], [6303, 6396, 6398], [6397, 6399], [6398, 6400, 6457], [6399, 6401], [6304, 6400, 6402], [6401, 6403], [6402, 6404, 6458], [6403, 6405], [6305, 6404, 6406], [6405, 6407], [6406, 6408, 6459], [6407, 6409], [6306, 6408, 6410], [6409, 6411], [6410, 6412, 6460], [6411, 6413], [6307, 6412, 6414], [6413, 6415], [6414, 6416, 6461], [6415, 6417], [6308, 6416, 6418], [6417, 6419], [6418, 6420, 6462], [6419, 6421], [6309, 6420, 6422], [6421, 6423], [6422, 6424, 6463], [6423, 6425], [6310, 6424, 6426], [6425, 6427], [6426, 6428, 6464], [6427, 6429], [6311, 6428, 6430], [6429, 6431], [6430, 6432, 6465], [6431, 6433], [6312, 6432, 6434], [6433, 6435], [6434, 6466], [6315, 6469], [6319, 6473], [6323, 6477], [6327, 6481], [6331, 6485], [6335, 6489], [6339, 6493], [6343, 6497], [6347, 6501], [6351, 6505], [6355, 6509], [6359, 6513], [6363, 6517], [6367, 6521], [6371, 6525], [6375, 6529], [6379, 6533], [6383, 6537], [6387, 6541], [6391, 6545], [6395, 6549], [6399, 6553], [6403, 6557], [6407, 6561], [6411, 6565], [6415, 6569], [6419, 6573], [6423, 6577], [6427, 6581], [6431, 6585], [6435, 6589], [6468, 6590], [6467, 6469], [6436, 6468, 6470], [6469, 6471], [6470, 6472, 6591], [6471, 6473], [6437, 6472, 6474], [6473, 6475], [6474, 6476, 6592], [6475, 6477], [6438, 6476, 6478], [6477, 6479], [6478, 6480, 6593], [6479, 6481], [6439, 6480, 6482], [6481, 6483], [6482, 6484, 6594], [6483, 6485], [6440, 6484, 6486], [6485, 6487], [6486, 6488, 6595], [6487, 6489], [6441, 6488, 6490], [6489, 6491], [6490, 6492, 6596], [6491, 6493], [6442, 6492, 6494], [6493, 6495], [6494, 6496, 6597], [6495, 6497], [6443, 6496, 6498], [6497, 6499], [6498, 6500, 6598], [6499, 6501], [6444, 6500, 6502], [6501, 6503], [6502, 6504, 6599], [6503, 6505], [6445, 6504, 6506], [6505, 6507], [6506, 6508, 6600], [6507, 6509], [6446, 6508, 6510], [6509, 6511], [6510, 6512, 6601], [6511, 6513], [6447, 6512, 6514], [6513, 6515], [6514, 6516, 6602], [6515, 6517], [6448, 6516, 6518], [6517, 6519], [6518, 6520, 6603], [6519, 6521], [6449, 6520, 6522], [6521, 6523], [6522, 6524, 6604], [6523, 6525], [6450, 6524, 6526], [6525, 6527], [6526, 6528, 6605], [6527, 6529], [6451, 6528, 6530], [6529, 6531], [6530, 6532, 6606], [6531, 6533], [6452, 6532, 6534], [6533, 6535], [6534, 6536, 6607], [6535, 6537], [6453, 6536, 6538], [6537, 6539], [6538, 6540, 6608], [6539, 6541], [6454, 6540, 6542], [6541, 6543], [6542, 6544, 6609], [6543, 6545], [6455, 6544, 6546], [6545, 6547], [6546, 6548, 6610], [6547, 6549], [6456, 6548, 6550], [6549, 6551], [6550, 6552, 6611], [6551, 6553], [6457, 6552, 6554], [6553, 6555], [6554, 6556, 6612], [6555, 6557], [6458, 6556, 6558], [6557, 6559], [6558, 6560, 6613], [6559, 6561], [6459, 6560, 6562], [6561, 6563], [6562, 6564, 6614], [6563, 6565], [6460, 6564, 6566], [6565, 6567], [6566, 6568, 6615], [6567, 6569], [6461, 6568, 6570], [6569, 6571], [6570, 6572, 6616], [6571, 6573], [6462, 6572, 6574], [6573, 6575], [6574, 6576, 6617], [6575, 6577], [6463, 6576, 6578], [6577, 6579], [6578, 6580, 6618], [6579, 6581], [6464, 6580, 6582], [6581, 6583], [6582, 6584, 6619], [6583, 6585], [6465, 6584, 6586], [6585, 6587], [6586, 6588, 6620], [6587, 6589], [6466, 6588], [6467, 6621], [6471, 6625], [6475, 6629], [6479, 6633], [6483, 6637], [6487, 6641], [6491, 6645], [6495, 6649], [6499, 6653], [6503, 6657], [6507, 6661], [6511, 6665], [6515, 6669], [6519, 6673], [6523, 6677], [6527, 6681], [6531, 6685], [6535, 6689], [6539, 6693], [6543, 6697], [6547, 6701], [6551, 6705], [6555, 6709], [6559, 6713], [6563, 6717], [6567, 6721], [6571, 6725], [6575, 6729], [6579, 6733], [6583, 6737], [6587, 6741], [6590, 6622], [6621, 6623], [6622, 6624, 6744], [6623, 6625], [6591, 6624, 6626], [6625, 6627], [6626, 6628, 6745], [6627, 6629], [6592, 6628, 6630], [6629, 6631], [6630, 6632, 6746], [6631, 6633], [6593, 6632, 6634], [6633, 6635], [6634, 6636, 6747], [6635, 6637], [6594, 6636, 6638], [6637, 6639], [6638, 6640, 6748], [6639, 6641], [6595, 6640, 6642], [6641, 6643], [6642, 6644, 6749], [6643, 6645], [6596, 6644, 6646], [6645, 6647], [6646, 6648, 6750], [6647, 6649], [6597, 6648, 6650], [6649, 6651], [6650, 6652, 6751], [6651, 6653], [6598, 6652, 6654], [6653, 6655], [6654, 6656, 6752], [6655, 6657], [6599, 6656, 6658], [6657, 6659], [6658, 6660, 6753], [6659, 6661], [6600, 6660, 6662], [6661, 6663], [6662, 6664, 6754], [6663, 6665], [6601, 6664, 6666], [6665, 6667], [6666, 6668, 6755], [6667, 6669], [6602, 6668, 6670], [6669, 6671], [6670, 6672, 6756], [6671, 6673], [6603, 6672, 6674], [6673, 6675], [6674, 6676, 6757], [6675, 6677], [6604, 6676, 6678], [6677, 6679], [6678, 6680, 6758], [6679, 6681], [6605, 6680, 6682], [6681, 6683], [6682, 6684, 6759], [6683, 6685], [6606, 6684, 6686], [6685, 6687], [6686, 6688, 6760], [6687, 6689], [6607, 6688, 6690], [6689, 6691], [6690, 6692, 6761], [6691, 6693], [6608, 6692, 6694], [6693, 6695], [6694, 6696, 6762], [6695, 6697], [6609, 6696, 6698], [6697, 6699], [6698, 6700, 6763], [6699, 6701], [6610, 6700, 6702], [6701, 6703], [6702, 6704, 6764], [6703, 6705], [6611, 6704, 6706], [6705, 6707], [6706, 6708, 6765], [6707, 6709], [6612, 6708, 6710], [6709, 6711], [6710, 6712, 6766], [6711, 6713], [6613, 6712, 6714], [6713, 6715], [6714, 6716, 6767], [6715, 6717], [6614, 6716, 6718], [6717, 6719], [6718, 6720, 6768], [6719, 6721], [6615, 6720, 6722], [6721, 6723], [6722, 6724, 6769], [6723, 6725], [6616, 6724, 6726], [6725, 6727], [6726, 6728, 6770], [6727, 6729], [6617, 6728, 6730], [6729, 6731], [6730, 6732, 6771], [6731, 6733], [6618, 6732, 6734], [6733, 6735], [6734, 6736, 6772], [6735, 6737], [6619, 6736, 6738], [6737, 6739], [6738, 6740, 6773], [6739, 6741], [6620, 6740, 6742], [6741, 6743], [6742, 6774], [6623, 6777], [6627, 6781], [6631, 6785], [6635, 6789], [6639, 6793], [6643, 6797], [6647, 6801], [6651, 6805], [6655, 6809], [6659, 6813], [6663, 6817], [6667, 6821], [6671, 6825], [6675, 6829], [6679, 6833], [6683, 6837], [6687, 6841], [6691, 6845], [6695, 6849], [6699, 6853], [6703, 6857], [6707, 6861], [6711, 6865], [6715, 6869], [6719, 6873], [6723, 6877], [6727, 6881], [6731, 6885], [6735, 6889], [6739, 6893], [6743, 6897], [6776, 6898], [6775, 6777], [6744, 6776, 6778], [6777, 6779], [6778, 6780, 6899], [6779, 6781], [6745, 6780, 6782], [6781, 6783], [6782, 6784, 6900], [6783, 6785], [6746, 6784, 6786], [6785, 6787], [6786, 6788, 6901], [6787, 6789], [6747, 6788, 6790], [6789, 6791], [6790, 6792, 6902], [6791, 6793], [6748, 6792, 6794], [6793, 6795], [6794, 6796, 6903], [6795, 6797], [6749, 6796, 6798], [6797, 6799], [6798, 6800, 6904], [6799, 6801], [6750, 6800, 6802], [6801, 6803], [6802, 6804, 6905], [6803, 6805], [6751, 6804, 6806], [6805, 6807], [6806, 6808, 6906], [6807, 6809], [6752, 6808, 6810], [6809, 6811], [6810, 6812, 6907], [6811, 6813], [6753, 6812, 6814], [6813, 6815], [6814, 6816, 6908], [6815, 6817], [6754, 6816, 6818], [6817, 6819], [6818, 6820, 6909], [6819, 6821], [6755, 6820, 6822], [6821, 6823], [6822, 6824, 6910], [6823, 6825], [6756, 6824, 6826], [6825, 6827], [6826, 6828, 6911], [6827, 6829], [6757, 6828, 6830], [6829, 6831], [6830, 6832, 6912], [6831, 6833], [6758, 6832, 6834], [6833, 6835], [6834, 6836, 6913], [6835, 6837], [6759, 6836, 6838], [6837, 6839], [6838, 6840, 6914], [6839, 6841], [6760, 6840, 6842], [6841, 6843], [6842, 6844, 6915], [6843, 6845], [6761, 6844, 6846], [6845, 6847], [6846, 6848, 6916], [6847, 6849], [6762, 6848, 6850], [6849, 6851], [6850, 6852, 6917], [6851, 6853], [6763, 6852, 6854], [6853, 6855], [6854, 6856, 6918], [6855, 6857], [6764, 6856, 6858], [6857, 6859], [6858, 6860, 6919], [6859, 6861], [6765, 6860, 6862], [6861, 6863], [6862, 6864, 6920], [6863, 6865], [6766, 6864, 6866], [6865, 6867], [6866, 6868, 6921], [6867, 6869], [6767, 6868, 6870], [6869, 6871], [6870, 6872, 6922], [6871, 6873], [6768, 6872, 6874], [6873, 6875], [6874, 6876, 6923], [6875, 6877], [6769, 6876, 6878], [6877, 6879], [6878, 6880, 6924], [6879, 6881], [6770, 6880, 6882], [6881, 6883], [6882, 6884, 6925], [6883, 6885], [6771, 6884, 6886], [6885, 6887], [6886, 6888, 6926], [6887, 6889], [6772, 6888, 6890], [6889, 6891], [6890, 6892, 6927], [6891, 6893], [6773, 6892, 6894], [6893, 6895], [6894, 6896, 6928], [6895, 6897], [6774, 6896], [6775, 6929], [6779, 6933], [6783, 6937], [6787, 6941], [6791, 6945], [6795, 6949], [6799, 6953], [6803, 6957], [6807, 6961], [6811, 6965], [6815, 6969], [6819, 6973], [6823, 6977], [6827, 6981], [6831, 6985], [6835, 6989], [6839, 6993], [6843, 6997], [6847, 7001], [6851, 7005], [6855, 7009], [6859, 7013], [6863, 7017], [6867, 7021], [6871, 7025], [6875, 7029], [6879, 7033], [6883, 7037], [6887, 7041], [6891, 7045], [6895, 7049], [6898, 6930], [6929, 6931], [6930, 6932, 7052], [6931, 6933], [6899, 6932, 6934], [6933, 6935], [6934, 6936, 7053], [6935, 6937], [6900, 6936, 6938], [6937, 6939], [6938, 6940, 7054], [6939, 6941], [6901, 6940, 6942], [6941, 6943], [6942, 6944, 7055], [6943, 6945], [6902, 6944, 6946], [6945, 6947], [6946, 6948, 7056], [6947, 6949], [6903, 6948, 6950], [6949, 6951], [6950, 6952, 7057], [6951, 6953], [6904, 6952, 6954], [6953, 6955], [6954, 6956, 7058], [6955, 6957], [6905, 6956, 6958], [6957, 6959], [6958, 6960, 7059], [6959, 6961], [6906, 6960, 6962], [6961, 6963], [6962, 6964, 7060], [6963, 6965], [6907, 6964, 6966], [6965, 6967], [6966, 6968, 7061], [6967, 6969], [6908, 6968, 6970], [6969, 6971], [6970, 6972, 7062], [6971, 6973], [6909, 6972, 6974], [6973, 6975], [6974, 6976, 7063], [6975, 6977], [6910, 6976, 6978], [6977, 6979], [6978, 6980, 7064], [6979, 6981], [6911, 6980, 6982], [6981, 6983], [6982, 6984, 7065], [6983, 6985], [6912, 6984, 6986], [6985, 6987], [6986, 6988, 7066], [6987, 6989], [6913, 6988, 6990], [6989, 6991], [6990, 6992, 7067], [6991, 6993], [6914, 6992, 6994], [6993, 6995], [6994, 6996, 7068], [6995, 6997], [6915, 6996, 6998], [6997, 6999], [6998, 7000, 7069], [6999, 7001], [6916, 7000, 7002], [7001, 7003], [7002, 7004, 7070], [7003, 7005], [6917, 7004, 7006], [7005, 7007], [7006, 7008, 7071], [7007, 7009], [6918, 7008, 7010], [7009, 7011], [7010, 7012, 7072], [7011, 7013], [6919, 7012, 7014], [7013, 7015], [7014, 7016, 7073], [7015, 7017], [6920, 7016, 7018], [7017, 7019], [7018, 7020, 7074], [7019, 7021], [6921, 7020, 7022], [7021, 7023], [7022, 7024, 7075], [7023, 7025], [6922, 7024, 7026], [7025, 7027], [7026, 7028, 7076], [7027, 7029], [6923, 7028, 7030], [7029, 7031], [7030, 7032, 7077], [7031, 7033], [6924, 7032, 7034], [7033, 7035], [7034, 7036, 7078], [7035, 7037], [6925, 7036, 7038], [7037, 7039], [7038, 7040, 7079], [7039, 7041], [6926, 7040, 7042], [7041, 7043], [7042, 7044, 7080], [7043, 7045], [6927, 7044, 7046], [7045, 7047], [7046, 7048, 7081], [7047, 7049], [6928, 7048, 7050], [7049, 7051], [7050, 7082], [6931, 7085], [6935, 7089], [6939, 7093], [6943, 7097], [6947, 7101], [6951, 7105], [6955, 7109], [6959, 7113], [6963, 7117], [6967, 7121], [6971, 7125], [6975, 7129], [6979, 7133], [6983, 7137], [6987, 7141], [6991, 7145], [6995, 7149], [6999, 7153], [7003, 7157], [7007, 7161], [7011, 7165], [7015, 7169], [7019, 7173], [7023, 7177], [7027, 7181], [7031, 7185], [7035, 7189], [7039, 7193], [7043, 7197], [7047, 7201], [7051, 7205], [7084, 7206], [7083, 7085], [7052, 7084, 7086], [7085, 7087], [7086, 7088, 7207], [7087, 7089], [7053, 7088, 7090], [7089, 7091], [7090, 7092, 7208], [7091, 7093], [7054, 7092, 7094], [7093, 7095], [7094, 7096, 7209], [7095, 7097], [7055, 7096, 7098], [7097, 7099], [7098, 7100, 7210], [7099, 7101], [7056, 7100, 7102], [7101, 7103], [7102, 7104, 7211], [7103, 7105], [7057, 7104, 7106], [7105, 7107], [7106, 7108, 7212], [7107, 7109], [7058, 7108, 7110], [7109, 7111], [7110, 7112, 7213], [7111, 7113], [7059, 7112, 7114], [7113, 7115], [7114, 7116, 7214], [7115, 7117], [7060, 7116, 7118], [7117, 7119], [7118, 7120, 7215], [7119, 7121], [7061, 7120, 7122], [7121, 7123], [7122, 7124, 7216], [7123, 7125], [7062, 7124, 7126], [7125, 7127], [7126, 7128, 7217], [7127, 7129], [7063, 7128, 7130], [7129, 7131], [7130, 7132, 7218], [7131, 7133], [7064, 7132, 7134], [7133, 7135], [7134, 7136, 7219], [7135, 7137], [7065, 7136, 7138], [7137, 7139], [7138, 7140, 7220], [7139, 7141], [7066, 7140, 7142], [7141, 7143], [7142, 7144, 7221], [7143, 7145], [7067, 7144, 7146], [7145, 7147], [7146, 7148, 7222], [7147, 7149], [7068, 7148, 7150], [7149, 7151], [7150, 7152, 7223], [7151, 7153], [7069, 7152, 7154], [7153, 7155], [7154, 7156, 7224], [7155, 7157], [7070, 7156, 7158], [7157, 7159], [7158, 7160, 7225], [7159, 7161], [7071, 7160, 7162], [7161, 7163], [7162, 7164, 7226], [7163, 7165], [7072, 7164, 7166], [7165, 7167], [7166, 7168, 7227], [7167, 7169], [7073, 7168, 7170], [7169, 7171], [7170, 7172, 7228], [7171, 7173], [7074, 7172, 7174], [7173, 7175], [7174, 7176, 7229], [7175, 7177], [7075, 7176, 7178], [7177, 7179], [7178, 7180, 7230], [7179, 7181], [7076, 7180, 7182], [7181, 7183], [7182, 7184, 7231], [7183, 7185], [7077, 7184, 7186], [7185, 7187], [7186, 7188, 7232], [7187, 7189], [7078, 7188, 7190], [7189, 7191], [7190, 7192, 7233], [7191, 7193], [7079, 7192, 7194], [7193, 7195], [7194, 7196, 7234], [7195, 7197], [7080, 7196, 7198], [7197, 7199], [7198, 7200, 7235], [7199, 7201], [7081, 7200, 7202], [7201, 7203], [7202, 7204, 7236], [7203, 7205], [7082, 7204], [7083, 7237], [7087, 7241], [7091, 7245], [7095, 7249], [7099, 7253], [7103, 7257], [7107, 7261], [7111, 7265], [7115, 7269], [7119, 7273], [7123, 7277], [7127, 7281], [7131, 7285], [7135, 7289], [7139, 7293], [7143, 7297], [7147, 7301], [7151, 7305], [7155, 7309], [7159, 7313], [7163, 7317], [7167, 7321], [7171, 7325], [7175, 7329], [7179, 7333], [7183, 7337], [7187, 7341], [7191, 7345], [7195, 7349], [7199, 7353], [7203, 7357], [7206, 7238], [7237, 7239], [7238, 7240, 7360], [7239, 7241], [7207, 7240, 7242], [7241, 7243], [7242, 7244, 7361], [7243, 7245], [7208, 7244, 7246], [7245, 7247], [7246, 7248, 7362], [7247, 7249], [7209, 7248, 7250], [7249, 7251], [7250, 7252, 7363], [7251, 7253], [7210, 7252, 7254], [7253, 7255], [7254, 7256, 7364], [7255, 7257], [7211, 7256, 7258], [7257, 7259], [7258, 7260, 7365], [7259, 7261], [7212, 7260, 7262], [7261, 7263], [7262, 7264, 7366], [7263, 7265], [7213, 7264, 7266], [7265, 7267], [7266, 7268, 7367], [7267, 7269], [7214, 7268, 7270], [7269, 7271], [7270, 7272, 7368], [7271, 7273], [7215, 7272, 7274], [7273, 7275], [7274, 7276, 7369], [7275, 7277], [7216, 7276, 7278], [7277, 7279], [7278, 7280, 7370], [7279, 7281], [7217, 7280, 7282], [7281, 7283], [7282, 7284, 7371], [7283, 7285], [7218, 7284, 7286], [7285, 7287], [7286, 7288, 7372], [7287, 7289], [7219, 7288, 7290], [7289, 7291], [7290, 7292, 7373], [7291, 7293], [7220, 7292, 7294], [7293, 7295], [7294, 7296, 7374], [7295, 7297], [7221, 7296, 7298], [7297, 7299], [7298, 7300, 7375], [7299, 7301], [7222, 7300, 7302], [7301, 7303], [7302, 7304, 7376], [7303, 7305], [7223, 7304, 7306], [7305, 7307], [7306, 7308, 7377], [7307, 7309], [7224, 7308, 7310], [7309, 7311], [7310, 7312, 7378], [7311, 7313], [7225, 7312, 7314], [7313, 7315], [7314, 7316, 7379], [7315, 7317], [7226, 7316, 7318], [7317, 7319], [7318, 7320, 7380], [7319, 7321], [7227, 7320, 7322], [7321, 7323], [7322, 7324, 7381], [7323, 7325], [7228, 7324, 7326], [7325, 7327], [7326, 7328, 7382], [7327, 7329], [7229, 7328, 7330], [7329, 7331], [7330, 7332, 7383], [7331, 7333], [7230, 7332, 7334], [7333, 7335], [7334, 7336, 7384], [7335, 7337], [7231, 7336, 7338], [7337, 7339], [7338, 7340, 7385], [7339, 7341], [7232, 7340, 7342], [7341, 7343], [7342, 7344, 7386], [7343, 7345], [7233, 7344, 7346], [7345, 7347], [7346, 7348, 7387], [7347, 7349], [7234, 7348, 7350], [7349, 7351], [7350, 7352, 7388], [7351, 7353], [7235, 7352, 7354], [7353, 7355], [7354, 7356, 7389], [7355, 7357], [7236, 7356, 7358], [7357, 7359], [7358, 7390], [7239, 7393], [7243, 7397], [7247, 7401], [7251, 7405], [7255, 7409], [7259, 7413], [7263, 7417], [7267, 7421], [7271, 7425], [7275, 7429], [7279, 7433], [7283, 7437], [7287, 7441], [7291, 7445], [7295, 7449], [7299, 7453], [7303, 7457], [7307, 7461], [7311, 7465], [7315, 7469], [7319, 7473], [7323, 7477], [7327, 7481], [7331, 7485], [7335, 7489], [7339, 7493], [7343, 7497], [7347, 7501], [7351, 7505], [7355, 7509], [7359, 7513], [7392, 7514], [7391, 7393], [7360, 7392, 7394], [7393, 7395], [7394, 7396, 7515], [7395, 7397], [7361, 7396, 7398], [7397, 7399], [7398, 7400, 7516], [7399, 7401], [7362, 7400, 7402], [7401, 7403], [7402, 7404, 7517], [7403, 7405], [7363, 7404, 7406], [7405, 7407], [7406, 7408, 7518], [7407, 7409], [7364, 7408, 7410], [7409, 7411], [7410, 7412, 7519], [7411, 7413], [7365, 7412, 7414], [7413, 7415], [7414, 7416, 7520], [7415, 7417], [7366, 7416, 7418], [7417, 7419], [7418, 7420, 7521], [7419, 7421], [7367, 7420, 7422], [7421, 7423], [7422, 7424, 7522], [7423, 7425], [7368, 7424, 7426], [7425, 7427], [7426, 7428, 7523], [7427, 7429], [7369, 7428, 7430], [7429, 7431], [7430, 7432, 7524], [7431, 7433], [7370, 7432, 7434], [7433, 7435], [7434, 7436, 7525], [7435, 7437], [7371, 7436, 7438], [7437, 7439], [7438, 7440, 7526], [7439, 7441], [7372, 7440, 7442], [7441, 7443], [7442, 7444, 7527], [7443, 7445], [7373, 7444, 7446], [7445, 7447], [7446, 7448, 7528], [7447, 7449], [7374, 7448, 7450], [7449, 7451], [7450, 7452, 7529], [7451, 7453], [7375, 7452, 7454], [7453, 7455], [7454, 7456, 7530], [7455, 7457], [7376, 7456, 7458], [7457, 7459], [7458, 7460, 7531], [7459, 7461], [7377, 7460, 7462], [7461, 7463], [7462, 7464, 7532], [7463, 7465], [7378, 7464, 7466], [7465, 7467], [7466, 7468, 7533], [7467, 7469], [7379, 7468, 7470], [7469, 7471], [7470, 7472, 7534], [7471, 7473], [7380, 7472, 7474], [7473, 7475], [7474, 7476, 7535], [7475, 7477], [7381, 7476, 7478], [7477, 7479], [7478, 7480, 7536], [7479, 7481], [7382, 7480, 7482], [7481, 7483], [7482, 7484, 7537], [7483, 7485], [7383, 7484, 7486], [7485, 7487], [7486, 7488, 7538], [7487, 7489], [7384, 7488, 7490], [7489, 7491], [7490, 7492, 7539], [7491, 7493], [7385, 7492, 7494], [7493, 7495], [7494, 7496, 7540], [7495, 7497], [7386, 7496, 7498], [7497, 7499], [7498, 7500, 7541], [7499, 7501], [7387, 7500, 7502], [7501, 7503], [7502, 7504, 7542], [7503, 7505], [7388, 7504, 7506], [7505, 7507], [7506, 7508, 7543], [7507, 7509], [7389, 7508, 7510], [7509, 7511], [7510, 7512, 7544], [7511, 7513], [7390, 7512], [7391, 7545], [7395, 7549], [7399, 7553], [7403, 7557], [7407, 7561], [7411, 7565], [7415, 7569], [7419, 7573], [7423, 7577], [7427, 7581], [7431, 7585], [7435, 7589], [7439, 7593], [7443, 7597], [7447, 7601], [7451, 7605], [7455, 7609], [7459, 7613], [7463, 7617], [7467, 7621], [7471, 7625], [7475, 7629], [7479, 7633], [7483, 7637], [7487, 7641], [7491, 7645], [7495, 7649], [7499, 7653], [7503, 7657], [7507, 7661], [7511, 7665], [7514, 7546], [7545, 7547], [7546, 7548, 7668], [7547, 7549], [7515, 7548, 7550], [7549, 7551], [7550, 7552, 7669], [7551, 7553], [7516, 7552, 7554], [7553, 7555], [7554, 7556, 7670], [7555, 7557], [7517, 7556, 7558], [7557, 7559], [7558, 7560, 7671], [7559, 7561], [7518, 7560, 7562], [7561, 7563], [7562, 7564, 7672], [7563, 7565], [7519, 7564, 7566], [7565, 7567], [7566, 7568, 7673], [7567, 7569], [7520, 7568, 7570], [7569, 7571], [7570, 7572, 7674], [7571, 7573], [7521, 7572, 7574], [7573, 7575], [7574, 7576, 7675], [7575, 7577], [7522, 7576, 7578], [7577, 7579], [7578, 7580, 7676], [7579, 7581], [7523, 7580, 7582], [7581, 7583], [7582, 7584, 7677], [7583, 7585], [7524, 7584, 7586], [7585, 7587], [7586, 7588, 7678], [7587, 7589], [7525, 7588, 7590], [7589, 7591], [7590, 7592, 7679], [7591, 7593], [7526, 7592, 7594], [7593, 7595], [7594, 7596, 7680], [7595, 7597], [7527, 7596, 7598], [7597, 7599], [7598, 7600, 7681], [7599, 7601], [7528, 7600, 7602], [7601, 7603], [7602, 7604, 7682], [7603, 7605], [7529, 7604, 7606], [7605, 7607], [7606, 7608, 7683], [7607, 7609], [7530, 7608, 7610], [7609, 7611], [7610, 7612, 7684], [7611, 7613], [7531, 7612, 7614], [7613, 7615], [7614, 7616, 7685], [7615, 7617], [7532, 7616, 7618], [7617, 7619], [7618, 7620, 7686], [7619, 7621], [7533, 7620, 7622], [7621, 7623], [7622, 7624, 7687], [7623, 7625], [7534, 7624, 7626], [7625, 7627], [7626, 7628, 7688], [7627, 7629], [7535, 7628, 7630], [7629, 7631], [7630, 7632, 7689], [7631, 7633], [7536, 7632, 7634], [7633, 7635], [7634, 7636, 7690], [7635, 7637], [7537, 7636, 7638], [7637, 7639], [7638, 7640, 7691], [7639, 7641], [7538, 7640, 7642], [7641, 7643], [7642, 7644, 7692], [7643, 7645], [7539, 7644, 7646], [7645, 7647], [7646, 7648, 7693], [7647, 7649], [7540, 7648, 7650], [7649, 7651], [7650, 7652, 7694], [7651, 7653], [7541, 7652, 7654], [7653, 7655], [7654, 7656, 7695], [7655, 7657], [7542, 7656, 7658], [7657, 7659], [7658, 7660, 7696], [7659, 7661], [7543, 7660, 7662], [7661, 7663], [7662, 7664, 7697], [7663, 7665], [7544, 7664, 7666], [7665, 7667], [7666, 7698], [7547, 7701], [7551, 7705], [7555, 7709], [7559, 7713], [7563, 7717], [7567, 7721], [7571, 7725], [7575, 7729], [7579, 7733], [7583, 7737], [7587, 7741], [7591, 7745], [7595, 7749], [7599, 7753], [7603, 7757], [7607, 7761], [7611, 7765], [7615, 7769], [7619, 7773], [7623, 7777], [7627, 7781], [7631, 7785], [7635, 7789], [7639, 7793], [7643, 7797], [7647, 7801], [7651, 7805], [7655, 7809], [7659, 7813], [7663, 7817], [7667, 7821], [7700, 7822], [7699, 7701], [7668, 7700, 7702], [7701, 7703], [7702, 7704, 7823], [7703, 7705], [7669, 7704, 7706], [7705, 7707], [7706, 7708, 7824], [7707, 7709], [7670, 7708, 7710], [7709, 7711], [7710, 7712, 7825], [7711, 7713], [7671, 7712, 7714], [7713, 7715], [7714, 7716, 7826], [7715, 7717], [7672, 7716, 7718], [7717, 7719], [7718, 7720, 7827], [7719, 7721], [7673, 7720, 7722], [7721, 7723], [7722, 7724, 7828], [7723, 7725], [7674, 7724, 7726], [7725, 7727], [7726, 7728, 7829], [7727, 7729], [7675, 7728, 7730], [7729, 7731], [7730, 7732, 7830], [7731, 7733], [7676, 7732, 7734], [7733, 7735], [7734, 7736, 7831], [7735, 7737], [7677, 7736, 7738], [7737, 7739], [7738, 7740, 7832], [7739, 7741], [7678, 7740, 7742], [7741, 7743], [7742, 7744, 7833], [7743, 7745], [7679, 7744, 7746], [7745, 7747], [7746, 7748, 7834], [7747, 7749], [7680, 7748, 7750], [7749, 7751], [7750, 7752, 7835], [7751, 7753], [7681, 7752, 7754], [7753, 7755], [7754, 7756, 7836], [7755, 7757], [7682, 7756, 7758], [7757, 7759], [7758, 7760, 7837], [7759, 7761], [7683, 7760, 7762], [7761, 7763], [7762, 7764, 7838], [7763, 7765], [7684, 7764, 7766], [7765, 7767], [7766, 7768, 7839], [7767, 7769], [7685, 7768, 7770], [7769, 7771], [7770, 7772, 7840], [7771, 7773], [7686, 7772, 7774], [7773, 7775], [7774, 7776, 7841], [7775, 7777], [7687, 7776, 7778], [7777, 7779], [7778, 7780, 7842], [7779, 7781], [7688, 7780, 7782], [7781, 7783], [7782, 7784, 7843], [7783, 7785], [7689, 7784, 7786], [7785, 7787], [7786, 7788, 7844], [7787, 7789], [7690, 7788, 7790], [7789, 7791], [7790, 7792, 7845], [7791, 7793], [7691, 7792, 7794], [7793, 7795], [7794, 7796, 7846], [7795, 7797], [7692, 7796, 7798], [7797, 7799], [7798, 7800, 7847], [7799, 7801], [7693, 7800, 7802], [7801, 7803], [7802, 7804, 7848], [7803, 7805], [7694, 7804, 7806], [7805, 7807], [7806, 7808, 7849], [7807, 7809], [7695, 7808, 7810], [7809, 7811], [7810, 7812, 7850], [7811, 7813], [7696, 7812, 7814], [7813, 7815], [7814, 7816, 7851], [7815, 7817], [7697, 7816, 7818], [7817, 7819], [7818, 7820, 7852], [7819, 7821], [7698, 7820], [7699, 7853], [7703, 7857], [7707, 7861], [7711, 7865], [7715, 7869], [7719, 7873], [7723, 7877], [7727, 7881], [7731, 7885], [7735, 7889], [7739, 7893], [7743, 7897], [7747, 7901], [7751, 7905], [7755, 7909], [7759, 7913], [7763, 7917], [7767, 7921], [7771, 7925], [7775, 7929], [7779, 7933], [7783, 7937], [7787, 7941], [7791, 7945], [7795, 7949], [7799, 7953], [7803, 7957], [7807, 7961], [7811, 7965], [7815, 7969], [7819, 7973], [7822, 7854], [7853, 7855], [7854, 7856, 7976], [7855, 7857], [7823, 7856, 7858], [7857, 7859], [7858, 7860, 7977], [7859, 7861], [7824, 7860, 7862], [7861, 7863], [7862, 7864, 7978], [7863, 7865], [7825, 7864, 7866], [7865, 7867], [7866, 7868, 7979], [7867, 7869], [7826, 7868, 7870], [7869, 7871], [7870, 7872, 7980], [7871, 7873], [7827, 7872, 7874], [7873, 7875], [7874, 7876, 7981], [7875, 7877], [7828, 7876, 7878], [7877, 7879], [7878, 7880, 7982], [7879, 7881], [7829, 7880, 7882], [7881, 7883], [7882, 7884, 7983], [7883, 7885], [7830, 7884, 7886], [7885, 7887], [7886, 7888, 7984], [7887, 7889], [7831, 7888, 7890], [7889, 7891], [7890, 7892, 7985], [7891, 7893], [7832, 7892, 7894], [7893, 7895], [7894, 7896, 7986], [7895, 7897], [7833, 7896, 7898], [7897, 7899], [7898, 7900, 7987], [7899, 7901], [7834, 7900, 7902], [7901, 7903], [7902, 7904, 7988], [7903, 7905], [7835, 7904, 7906], [7905, 7907], [7906, 7908, 7989], [7907, 7909], [7836, 7908, 7910], [7909, 7911], [7910, 7912, 7990], [7911, 7913], [7837, 7912, 7914], [7913, 7915], [7914, 7916, 7991], [7915, 7917], [7838, 7916, 7918], [7917, 7919], [7918, 7920, 7992], [7919, 7921], [7839, 7920, 7922], [7921, 7923], [7922, 7924, 7993], [7923, 7925], [7840, 7924, 7926], [7925, 7927], [7926, 7928, 7994], [7927, 7929], [7841, 7928, 7930], [7929, 7931], [7930, 7932, 7995], [7931, 7933], [7842, 7932, 7934], [7933, 7935], [7934, 7936, 7996], [7935, 7937], [7843, 7936, 7938], [7937, 7939], [7938, 7940, 7997], [7939, 7941], [7844, 7940, 7942], [7941, 7943], [7942, 7944, 7998], [7943, 7945], [7845, 7944, 7946], [7945, 7947], [7946, 7948, 7999], [7947, 7949], [7846, 7948, 7950], [7949, 7951], [7950, 7952, 8000], [7951, 7953], [7847, 7952, 7954], [7953, 7955], [7954, 7956, 8001], [7955, 7957], [7848, 7956, 7958], [7957, 7959], [7958, 7960, 8002], [7959, 7961], [7849, 7960, 7962], [7961, 7963], [7962, 7964, 8003], [7963, 7965], [7850, 7964, 7966], [7965, 7967], [7966, 7968, 8004], [7967, 7969], [7851, 7968, 7970], [7969, 7971], [7970, 7972, 8005], [7971, 7973], [7852, 7972, 7974], [7973, 7975], [7974, 8006], [7855, 8009], [7859, 8013], [7863, 8017], [7867, 8021], [7871, 8025], [7875, 8029], [7879, 8033], [7883, 8037], [7887, 8041], [7891, 8045], [7895, 8049], [7899, 8053], [7903, 8057], [7907, 8061], [7911, 8065], [7915, 8069], [7919, 8073], [7923, 8077], [7927, 8081], [7931, 8085], [7935, 8089], [7939, 8093], [7943, 8097], [7947, 8101], [7951, 8105], [7955, 8109], [7959, 8113], [7963, 8117], [7967, 8121], [7971, 8125], [7975, 8129], [8008, 8130], [8007, 8009], [7976, 8008, 8010], [8009, 8011], [8010, 8012, 8131], [8011, 8013], [7977, 8012, 8014], [8013, 8015], [8014, 8016, 8132], [8015, 8017], [7978, 8016, 8018], [8017, 8019], [8018, 8020, 8133], [8019, 8021], [7979, 8020, 8022], [8021, 8023], [8022, 8024, 8134], [8023, 8025], [7980, 8024, 8026], [8025, 8027], [8026, 8028, 8135], [8027, 8029], [7981, 8028, 8030], [8029, 8031], [8030, 8032, 8136], [8031, 8033], [7982, 8032, 8034], [8033, 8035], [8034, 8036, 8137], [8035, 8037], [7983, 8036, 8038], [8037, 8039], [8038, 8040, 8138], [8039, 8041], [7984, 8040, 8042], [8041, 8043], [8042, 8044, 8139], [8043, 8045], [7985, 8044, 8046], [8045, 8047], [8046, 8048, 8140], [8047, 8049], [7986, 8048, 8050], [8049, 8051], [8050, 8052, 8141], [8051, 8053], [7987, 8052, 8054], [8053, 8055], [8054, 8056, 8142], [8055, 8057], [7988, 8056, 8058], [8057, 8059], [8058, 8060, 8143], [8059, 8061], [7989, 8060, 8062], [8061, 8063], [8062, 8064, 8144], [8063, 8065], [7990, 8064, 8066], [8065, 8067], [8066, 8068, 8145], [8067, 8069], [7991, 8068, 8070], [8069, 8071], [8070, 8072, 8146], [8071, 8073], [7992, 8072, 8074], [8073, 8075], [8074, 8076, 8147], [8075, 8077], [7993, 8076, 8078], [8077, 8079], [8078, 8080, 8148], [8079, 8081], [7994, 8080, 8082], [8081, 8083], [8082, 8084, 8149], [8083, 8085], [7995, 8084, 8086], [8085, 8087], [8086, 8088, 8150], [8087, 8089], [7996, 8088, 8090], [8089, 8091], [8090, 8092, 8151], [8091, 8093], [7997, 8092, 8094], [8093, 8095], [8094, 8096, 8152], [8095, 8097], [7998, 8096, 8098], [8097, 8099], [8098, 8100, 8153], [8099, 8101], [7999, 8100, 8102], [8101, 8103], [8102, 8104, 8154], [8103, 8105], [8000, 8104, 8106], [8105, 8107], [8106, 8108, 8155], [8107, 8109], [8001, 8108, 8110], [8109, 8111], [8110, 8112, 8156], [8111, 8113], [8002, 8112, 8114], [8113, 8115], [8114, 8116, 8157], [8115, 8117], [8003, 8116, 8118], [8117, 8119], [8118, 8120, 8158], [8119, 8121], [8004, 8120, 8122], [8121, 8123], [8122, 8124, 8159], [8123, 8125], [8005, 8124, 8126], [8125, 8127], [8126, 8128, 8160], [8127, 8129], [8006, 8128], [8007, 8161], [8011, 8165], [8015, 8169], [8019, 8173], [8023, 8177], [8027, 8181], [8031, 8185], [8035, 8189], [8039, 8193], [8043, 8197], [8047, 8201], [8051, 8205], [8055, 8209], [8059, 8213], [8063, 8217], [8067, 8221], [8071, 8225], [8075, 8229], [8079, 8233], [8083, 8237], [8087, 8241], [8091, 8245], [8095, 8249], [8099, 8253], [8103, 8257], [8107, 8261], [8111, 8265], [8115, 8269], [8119, 8273], [8123, 8277], [8127, 8281], [8130, 8162], [8161, 8163], [8162, 8164, 8284], [8163, 8165], [8131, 8164, 8166], [8165, 8167], [8166, 8168, 8285], [8167, 8169], [8132, 8168, 8170], [8169, 8171], [8170, 8172, 8286], [8171, 8173], [8133, 8172, 8174], [8173, 8175], [8174, 8176, 8287], [8175, 8177], [8134, 8176, 8178], [8177, 8179], [8178, 8180, 8288], [8179, 8181], [8135, 8180, 8182], [8181, 8183], [8182, 8184, 8289], [8183, 8185], [8136, 8184, 8186], [8185, 8187], [8186, 8188, 8290], [8187, 8189], [8137, 8188, 8190], [8189, 8191], [8190, 8192, 8291], [8191, 8193], [8138, 8192, 8194], [8193, 8195], [8194, 8196, 8292], [8195, 8197], [8139, 8196, 8198], [8197, 8199], [8198, 8200, 8293], [8199, 8201], [8140, 8200, 8202], [8201, 8203], [8202, 8204, 8294], [8203, 8205], [8141, 8204, 8206], [8205, 8207], [8206, 8208, 8295], [8207, 8209], [8142, 8208, 8210], [8209, 8211], [8210, 8212, 8296], [8211, 8213], [8143, 8212, 8214], [8213, 8215], [8214, 8216, 8297], [8215, 8217], [8144, 8216, 8218], [8217, 8219], [8218, 8220, 8298], [8219, 8221], [8145, 8220, 8222], [8221, 8223], [8222, 8224, 8299], [8223, 8225], [8146, 8224, 8226], [8225, 8227], [8226, 8228, 8300], [8227, 8229], [8147, 8228, 8230], [8229, 8231], [8230, 8232, 8301], [8231, 8233], [8148, 8232, 8234], [8233, 8235], [8234, 8236, 8302], [8235, 8237], [8149, 8236, 8238], [8237, 8239], [8238, 8240, 8303], [8239, 8241], [8150, 8240, 8242], [8241, 8243], [8242, 8244, 8304], [8243, 8245], [8151, 8244, 8246], [8245, 8247], [8246, 8248, 8305], [8247, 8249], [8152, 8248, 8250], [8249, 8251], [8250, 8252, 8306], [8251, 8253], [8153, 8252, 8254], [8253, 8255], [8254, 8256, 8307], [8255, 8257], [8154, 8256, 8258], [8257, 8259], [8258, 8260, 8308], [8259, 8261], [8155, 8260, 8262], [8261, 8263], [8262, 8264, 8309], [8263, 8265], [8156, 8264, 8266], [8265, 8267], [8266, 8268, 8310], [8267, 8269], [8157, 8268, 8270], [8269, 8271], [8270, 8272, 8311], [8271, 8273], [8158, 8272, 8274], [8273, 8275], [8274, 8276, 8312], [8275, 8277], [8159, 8276, 8278], [8277, 8279], [8278, 8280, 8313], [8279, 8281], [8160, 8280, 8282], [8281, 8283], [8282, 8314], [8163, 8317], [8167, 8321], [8171, 8325], [8175, 8329], [8179, 8333], [8183, 8337], [8187, 8341], [8191, 8345], [8195, 8349], [8199, 8353], [8203, 8357], [8207, 8361], [8211, 8365], [8215, 8369], [8219, 8373], [8223, 8377], [8227, 8381], [8231, 8385], [8235, 8389], [8239, 8393], [8243, 8397], [8247, 8401], [8251, 8405], [8255, 8409], [8259, 8413], [8263, 8417], [8267, 8421], [8271, 8425], [8275, 8429], [8279, 8433], [8283, 8437], [8316, 8438], [8315, 8317], [8284, 8316, 8318], [8317, 8319], [8318, 8320, 8439], [8319, 8321], [8285, 8320, 8322], [8321, 8323], [8322, 8324, 8440], [8323, 8325], [8286, 8324, 8326], [8325, 8327], [8326, 8328, 8441], [8327, 8329], [8287, 8328, 8330], [8329, 8331], [8330, 8332, 8442], [8331, 8333], [8288, 8332, 8334], [8333, 8335], [8334, 8336, 8443], [8335, 8337], [8289, 8336, 8338], [8337, 8339], [8338, 8340, 8444], [8339, 8341], [8290, 8340, 8342], [8341, 8343], [8342, 8344, 8445], [8343, 8345], [8291, 8344, 8346], [8345, 8347], [8346, 8348, 8446], [8347, 8349], [8292, 8348, 8350], [8349, 8351], [8350, 8352, 8447], [8351, 8353], [8293, 8352, 8354], [8353, 8355], [8354, 8356, 8448], [8355, 8357], [8294, 8356, 8358], [8357, 8359], [8358, 8360, 8449], [8359, 8361], [8295, 8360, 8362], [8361, 8363], [8362, 8364, 8450], [8363, 8365], [8296, 8364, 8366], [8365, 8367], [8366, 8368, 8451], [8367, 8369], [8297, 8368, 8370], [8369, 8371], [8370, 8372, 8452], [8371, 8373], [8298, 8372, 8374], [8373, 8375], [8374, 8376, 8453], [8375, 8377], [8299, 8376, 8378], [8377, 8379], [8378, 8380, 8454], [8379, 8381], [8300, 8380, 8382], [8381, 8383], [8382, 8384, 8455], [8383, 8385], [8301, 8384, 8386], [8385, 8387], [8386, 8388, 8456], [8387, 8389], [8302, 8388, 8390], [8389, 8391], [8390, 8392, 8457], [8391, 8393], [8303, 8392, 8394], [8393, 8395], [8394, 8396, 8458], [8395, 8397], [8304, 8396, 8398], [8397, 8399], [8398, 8400, 8459], [8399, 8401], [8305, 8400, 8402], [8401, 8403], [8402, 8404, 8460], [8403, 8405], [8306, 8404, 8406], [8405, 8407], [8406, 8408, 8461], [8407, 8409], [8307, 8408, 8410], [8409, 8411], [8410, 8412, 8462], [8411, 8413], [8308, 8412, 8414], [8413, 8415], [8414, 8416, 8463], [8415, 8417], [8309, 8416, 8418], [8417, 8419], [8418, 8420, 8464], [8419, 8421], [8310, 8420, 8422], [8421, 8423], [8422, 8424, 8465], [8423, 8425], [8311, 8424, 8426], [8425, 8427], [8426, 8428, 8466], [8427, 8429], [8312, 8428, 8430], [8429, 8431], [8430, 8432, 8467], [8431, 8433], [8313, 8432, 8434], [8433, 8435], [8434, 8436, 8468], [8435, 8437], [8314, 8436], [8315, 8469], [8319, 8473], [8323, 8477], [8327, 8481], [8331, 8485], [8335, 8489], [8339, 8493], [8343, 8497], [8347, 8501], [8351, 8505], [8355, 8509], [8359, 8513], [8363, 8517], [8367, 8521], [8371, 8525], [8375, 8529], [8379, 8533], [8383, 8537], [8387, 8541], [8391, 8545], [8395, 8549], [8399, 8553], [8403, 8557], [8407, 8561], [8411, 8565], [8415, 8569], [8419, 8573], [8423, 8577], [8427, 8581], [8431, 8585], [8435, 8589], [8438, 8470], [8469, 8471], [8470, 8472, 8592], [8471, 8473], [8439, 8472, 8474], [8473, 8475], [8474, 8476, 8593], [8475, 8477], [8440, 8476, 8478], [8477, 8479], [8478, 8480, 8594], [8479, 8481], [8441, 8480, 8482], [8481, 8483], [8482, 8484, 8595], [8483, 8485], [8442, 8484, 8486], [8485, 8487], [8486, 8488, 8596], [8487, 8489], [8443, 8488, 8490], [8489, 8491], [8490, 8492, 8597], [8491, 8493], [8444, 8492, 8494], [8493, 8495], [8494, 8496, 8598], [8495, 8497], [8445, 8496, 8498], [8497, 8499], [8498, 8500, 8599], [8499, 8501], [8446, 8500, 8502], [8501, 8503], [8502, 8504, 8600], [8503, 8505], [8447, 8504, 8506], [8505, 8507], [8506, 8508, 8601], [8507, 8509], [8448, 8508, 8510], [8509, 8511], [8510, 8512, 8602], [8511, 8513], [8449, 8512, 8514], [8513, 8515], [8514, 8516, 8603], [8515, 8517], [8450, 8516, 8518], [8517, 8519], [8518, 8520, 8604], [8519, 8521], [8451, 8520, 8522], [8521, 8523], [8522, 8524, 8605], [8523, 8525], [8452, 8524, 8526], [8525, 8527], [8526, 8528, 8606], [8527, 8529], [8453, 8528, 8530], [8529, 8531], [8530, 8532, 8607], [8531, 8533], [8454, 8532, 8534], [8533, 8535], [8534, 8536, 8608], [8535, 8537], [8455, 8536, 8538], [8537, 8539], [8538, 8540, 8609], [8539, 8541], [8456, 8540, 8542], [8541, 8543], [8542, 8544, 8610], [8543, 8545], [8457, 8544, 8546], [8545, 8547], [8546, 8548, 8611], [8547, 8549], [8458, 8548, 8550], [8549, 8551], [8550, 8552, 8612], [8551, 8553], [8459, 8552, 8554], [8553, 8555], [8554, 8556, 8613], [8555, 8557], [8460, 8556, 8558], [8557, 8559], [8558, 8560, 8614], [8559, 8561], [8461, 8560, 8562], [8561, 8563], [8562, 8564, 8615], [8563, 8565], [8462, 8564, 8566], [8565, 8567], [8566, 8568, 8616], [8567, 8569], [8463, 8568, 8570], [8569, 8571], [8570, 8572, 8617], [8571, 8573], [8464, 8572, 8574], [8573, 8575], [8574, 8576, 8618], [8575, 8577], [8465, 8576, 8578], [8577, 8579], [8578, 8580, 8619], [8579, 8581], [8466, 8580, 8582], [8581, 8583], [8582, 8584, 8620], [8583, 8585], [8467, 8584, 8586], [8585, 8587], [8586, 8588, 8621], [8587, 8589], [8468, 8588, 8590], [8589, 8591], [8590, 8622], [8471, 8625], [8475, 8629], [8479, 8633], [8483, 8637], [8487, 8641], [8491, 8645], [8495, 8649], [8499, 8653], [8503, 8657], [8507, 8661], [8511, 8665], [8515, 8669], [8519, 8673], [8523, 8677], [8527, 8681], [8531, 8685], [8535, 8689], [8539, 8693], [8543, 8697], [8547, 8701], [8551, 8705], [8555, 8709], [8559, 8713], [8563, 8717], [8567, 8721], [8571, 8725], [8575, 8729], [8579, 8733], [8583, 8737], [8587, 8741], [8591, 8745], [8624, 8746], [8623, 8625], [8592, 8624, 8626], [8625, 8627], [8626, 8628, 8747], [8627, 8629], [8593, 8628, 8630], [8629, 8631], [8630, 8632, 8748], [8631, 8633], [8594, 8632, 8634], [8633, 8635], [8634, 8636, 8749], [8635, 8637], [8595, 8636, 8638], [8637, 8639], [8638, 8640, 8750], [8639, 8641], [8596, 8640, 8642], [8641, 8643], [8642, 8644, 8751], [8643, 8645], [8597, 8644, 8646], [8645, 8647], [8646, 8648, 8752], [8647, 8649], [8598, 8648, 8650], [8649, 8651], [8650, 8652, 8753], [8651, 8653], [8599, 8652, 8654], [8653, 8655], [8654, 8656, 8754], [8655, 8657], [8600, 8656, 8658], [8657, 8659], [8658, 8660, 8755], [8659, 8661], [8601, 8660, 8662], [8661, 8663], [8662, 8664, 8756], [8663, 8665], [8602, 8664, 8666], [8665, 8667], [8666, 8668, 8757], [8667, 8669], [8603, 8668, 8670], [8669, 8671], [8670, 8672, 8758], [8671, 8673], [8604, 8672, 8674], [8673, 8675], [8674, 8676, 8759], [8675, 8677], [8605, 8676, 8678], [8677, 8679], [8678, 8680, 8760], [8679, 8681], [8606, 8680, 8682], [8681, 8683], [8682, 8684, 8761], [8683, 8685], [8607, 8684, 8686], [8685, 8687], [8686, 8688, 8762], [8687, 8689], [8608, 8688, 8690], [8689, 8691], [8690, 8692, 8763], [8691, 8693], [8609, 8692, 8694], [8693, 8695], [8694, 8696, 8764], [8695, 8697], [8610, 8696, 8698], [8697, 8699], [8698, 8700, 8765], [8699, 8701], [8611, 8700, 8702], [8701, 8703], [8702, 8704, 8766], [8703, 8705], [8612, 8704, 8706], [8705, 8707], [8706, 8708, 8767], [8707, 8709], [8613, 8708, 8710], [8709, 8711], [8710, 8712, 8768], [8711, 8713], [8614, 8712, 8714], [8713, 8715], [8714, 8716, 8769], [8715, 8717], [8615, 8716, 8718], [8717, 8719], [8718, 8720, 8770], [8719, 8721], [8616, 8720, 8722], [8721, 8723], [8722, 8724, 8771], [8723, 8725], [8617, 8724, 8726], [8725, 8727], [8726, 8728, 8772], [8727, 8729], [8618, 8728, 8730], [8729, 8731], [8730, 8732, 8773], [8731, 8733], [8619, 8732, 8734], [8733, 8735], [8734, 8736, 8774], [8735, 8737], [8620, 8736, 8738], [8737, 8739], [8738, 8740, 8775], [8739, 8741], [8621, 8740, 8742], [8741, 8743], [8742, 8744, 8776], [8743, 8745], [8622, 8744], [8623, 8777], [8627, 8781], [8631, 8785], [8635, 8789], [8639, 8793], [8643, 8797], [8647, 8801], [8651, 8805], [8655, 8809], [8659, 8813], [8663, 8817], [8667, 8821], [8671, 8825], [8675, 8829], [8679, 8833], [8683, 8837], [8687, 8841], [8691, 8845], [8695, 8849], [8699, 8853], [8703, 8857], [8707, 8861], [8711, 8865], [8715, 8869], [8719, 8873], [8723, 8877], [8727, 8881], [8731, 8885], [8735, 8889], [8739, 8893], [8743, 8897], [8746, 8778], [8777, 8779], [8778, 8780, 8900], [8779, 8781], [8747, 8780, 8782], [8781, 8783], [8782, 8784, 8901], [8783, 8785], [8748, 8784, 8786], [8785, 8787], [8786, 8788, 8902], [8787, 8789], [8749, 8788, 8790], [8789, 8791], [8790, 8792, 8903], [8791, 8793], [8750, 8792, 8794], [8793, 8795], [8794, 8796, 8904], [8795, 8797], [8751, 8796, 8798], [8797, 8799], [8798, 8800, 8905], [8799, 8801], [8752, 8800, 8802], [8801, 8803], [8802, 8804, 8906], [8803, 8805], [8753, 8804, 8806], [8805, 8807], [8806, 8808, 8907], [8807, 8809], [8754, 8808, 8810], [8809, 8811], [8810, 8812, 8908], [8811, 8813], [8755, 8812, 8814], [8813, 8815], [8814, 8816, 8909], [8815, 8817], [8756, 8816, 8818], [8817, 8819], [8818, 8820, 8910], [8819, 8821], [8757, 8820, 8822], [8821, 8823], [8822, 8824, 8911], [8823, 8825], [8758, 8824, 8826], [8825, 8827], [8826, 8828, 8912], [8827, 8829], [8759, 8828, 8830], [8829, 8831], [8830, 8832, 8913], [8831, 8833], [8760, 8832, 8834], [8833, 8835], [8834, 8836, 8914], [8835, 8837], [8761, 8836, 8838], [8837, 8839], [8838, 8840, 8915], [8839, 8841], [8762, 8840, 8842], [8841, 8843], [8842, 8844, 8916], [8843, 8845], [8763, 8844, 8846], [8845, 8847], [8846, 8848, 8917], [8847, 8849], [8764, 8848, 8850], [8849, 8851], [8850, 8852, 8918], [8851, 8853], [8765, 8852, 8854], [8853, 8855], [8854, 8856, 8919], [8855, 8857], [8766, 8856, 8858], [8857, 8859], [8858, 8860, 8920], [8859, 8861], [8767, 8860, 8862], [8861, 8863], [8862, 8864, 8921], [8863, 8865], [8768, 8864, 8866], [8865, 8867], [8866, 8868, 8922], [8867, 8869], [8769, 8868, 8870], [8869, 8871], [8870, 8872, 8923], [8871, 8873], [8770, 8872, 8874], [8873, 8875], [8874, 8876, 8924], [8875, 8877], [8771, 8876, 8878], [8877, 8879], [8878, 8880, 8925], [8879, 8881], [8772, 8880, 8882], [8881, 8883], [8882, 8884, 8926], [8883, 8885], [8773, 8884, 8886], [8885, 8887], [8886, 8888, 8927], [8887, 8889], [8774, 8888, 8890], [8889, 8891], [8890, 8892, 8928], [8891, 8893], [8775, 8892, 8894], [8893, 8895], [8894, 8896, 8929], [8895, 8897], [8776, 8896, 8898], [8897, 8899], [8898, 8930], [8779, 8933], [8783, 8937], [8787, 8941], [8791, 8945], [8795, 8949], [8799, 8953], [8803, 8957], [8807, 8961], [8811, 8965], [8815, 8969], [8819, 8973], [8823, 8977], [8827, 8981], [8831, 8985], [8835, 8989], [8839, 8993], [8843, 8997], [8847, 9001], [8851, 9005], [8855, 9009], [8859, 9013], [8863, 9017], [8867, 9021], [8871, 9025], [8875, 9029], [8879, 9033], [8883, 9037], [8887, 9041], [8891, 9045], [8895, 9049], [8899, 9053], [8932, 9054], [8931, 8933], [8900, 8932, 8934], [8933, 8935], [8934, 8936, 9055], [8935, 8937], [8901, 8936, 8938], [8937, 8939], [8938, 8940, 9056], [8939, 8941], [8902, 8940, 8942], [8941, 8943], [8942, 8944, 9057], [8943, 8945], [8903, 8944, 8946], [8945, 8947], [8946, 8948, 9058], [8947, 8949], [8904, 8948, 8950], [8949, 8951], [8950, 8952, 9059], [8951, 8953], [8905, 8952, 8954], [8953, 8955], [8954, 8956, 9060], [8955, 8957], [8906, 8956, 8958], [8957, 8959], [8958, 8960, 9061], [8959, 8961], [8907, 8960, 8962], [8961, 8963], [8962, 8964, 9062], [8963, 8965], [8908, 8964, 8966], [8965, 8967], [8966, 8968, 9063], [8967, 8969], [8909, 8968, 8970], [8969, 8971], [8970, 8972, 9064], [8971, 8973], [8910, 8972, 8974], [8973, 8975], [8974, 8976, 9065], [8975, 8977], [8911, 8976, 8978], [8977, 8979], [8978, 8980, 9066], [8979, 8981], [8912, 8980, 8982], [8981, 8983], [8982, 8984, 9067], [8983, 8985], [8913, 8984, 8986], [8985, 8987], [8986, 8988, 9068], [8987, 8989], [8914, 8988, 8990], [8989, 8991], [8990, 8992, 9069], [8991, 8993], [8915, 8992, 8994], [8993, 8995], [8994, 8996, 9070], [8995, 8997], [8916, 8996, 8998], [8997, 8999], [8998, 9000, 9071], [8999, 9001], [8917, 9000, 9002], [9001, 9003], [9002, 9004, 9072], [9003, 9005], [8918, 9004, 9006], [9005, 9007], [9006, 9008, 9073], [9007, 9009], [8919, 9008, 9010], [9009, 9011], [9010, 9012, 9074], [9011, 9013], [8920, 9012, 9014], [9013, 9015], [9014, 9016, 9075], [9015, 9017], [8921, 9016, 9018], [9017, 9019], [9018, 9020, 9076], [9019, 9021], [8922, 9020, 9022], [9021, 9023], [9022, 9024, 9077], [9023, 9025], [8923, 9024, 9026], [9025, 9027], [9026, 9028, 9078], [9027, 9029], [8924, 9028, 9030], [9029, 9031], [9030, 9032, 9079], [9031, 9033], [8925, 9032, 9034], [9033, 9035], [9034, 9036, 9080], [9035, 9037], [8926, 9036, 9038], [9037, 9039], [9038, 9040, 9081], [9039, 9041], [8927, 9040, 9042], [9041, 9043], [9042, 9044, 9082], [9043, 9045], [8928, 9044, 9046], [9045, 9047], [9046, 9048, 9083], [9047, 9049], [8929, 9048, 9050], [9049, 9051], [9050, 9052, 9084], [9051, 9053], [8930, 9052], [8931, 9085], [8935, 9089], [8939, 9093], [8943, 9097], [8947, 9101], [8951, 9105], [8955, 9109], [8959, 9113], [8963, 9117], [8967, 9121], [8971, 9125], [8975, 9129], [8979, 9133], [8983, 9137], [8987, 9141], [8991, 9145], [8995, 9149], [8999, 9153], [9003, 9157], [9007, 9161], [9011, 9165], [9015, 9169], [9019, 9173], [9023, 9177], [9027, 9181], [9031, 9185], [9035, 9189], [9039, 9193], [9043, 9197], [9047, 9201], [9051, 9205], [9054, 9086], [9085, 9087], [9086, 9088, 9208], [9087, 9089], [9055, 9088, 9090], [9089, 9091], [9090, 9092, 9209], [9091, 9093], [9056, 9092, 9094], [9093, 9095], [9094, 9096, 9210], [9095, 9097], [9057, 9096, 9098], [9097, 9099], [9098, 9100, 9211], [9099, 9101], [9058, 9100, 9102], [9101, 9103], [9102, 9104, 9212], [9103, 9105], [9059, 9104, 9106], [9105, 9107], [9106, 9108, 9213], [9107, 9109], [9060, 9108, 9110], [9109, 9111], [9110, 9112, 9214], [9111, 9113], [9061, 9112, 9114], [9113, 9115], [9114, 9116, 9215], [9115, 9117], [9062, 9116, 9118], [9117, 9119], [9118, 9120, 9216], [9119, 9121], [9063, 9120, 9122], [9121, 9123], [9122, 9124, 9217], [9123, 9125], [9064, 9124, 9126], [9125, 9127], [9126, 9128, 9218], [9127, 9129], [9065, 9128, 9130], [9129, 9131], [9130, 9132, 9219], [9131, 9133], [9066, 9132, 9134], [9133, 9135], [9134, 9136, 9220], [9135, 9137], [9067, 9136, 9138], [9137, 9139], [9138, 9140, 9221], [9139, 9141], [9068, 9140, 9142], [9141, 9143], [9142, 9144, 9222], [9143, 9145], [9069, 9144, 9146], [9145, 9147], [9146, 9148, 9223], [9147, 9149], [9070, 9148, 9150], [9149, 9151], [9150, 9152, 9224], [9151, 9153], [9071, 9152, 9154], [9153, 9155], [9154, 9156, 9225], [9155, 9157], [9072, 9156, 9158], [9157, 9159], [9158, 9160, 9226], [9159, 9161], [9073, 9160, 9162], [9161, 9163], [9162, 9164, 9227], [9163, 9165], [9074, 9164, 9166], [9165, 9167], [9166, 9168, 9228], [9167, 9169], [9075, 9168, 9170], [9169, 9171], [9170, 9172, 9229], [9171, 9173], [9076, 9172, 9174], [9173, 9175], [9174, 9176, 9230], [9175, 9177], [9077, 9176, 9178], [9177, 9179], [9178, 9180, 9231], [9179, 9181], [9078, 9180, 9182], [9181, 9183], [9182, 9184, 9232], [9183, 9185], [9079, 9184, 9186], [9185, 9187], [9186, 9188, 9233], [9187, 9189], [9080, 9188, 9190], [9189, 9191], [9190, 9192, 9234], [9191, 9193], [9081, 9192, 9194], [9193, 9195], [9194, 9196, 9235], [9195, 9197], [9082, 9196, 9198], [9197, 9199], [9198, 9200, 9236], [9199, 9201], [9083, 9200, 9202], [9201, 9203], [9202, 9204, 9237], [9203, 9205], [9084, 9204, 9206], [9205, 9207], [9206, 9238], [9087, 9240], [9091, 9244], [9095, 9248], [9099, 9252], [9103, 9256], [9107, 9260], [9111, 9264], [9115, 9268], [9119, 9272], [9123, 9276], [9127, 9280], [9131, 9284], [9135, 9288], [9139, 9292], [9143, 9296], [9147, 9300], [9151, 9304], [9155, 9308], [9159, 9312], [9163, 9316], [9167, 9320], [9171, 9324], [9175, 9328], [9179, 9332], [9183, 9336], [9187, 9340], [9191, 9344], [9195, 9348], [9199, 9352], [9203, 9356], [9207, 9360], [9240], [9208, 9239, 9241], [9240, 9242], [9241, 9243], [9242, 9244], [9209, 9243, 9245], [9244, 9246], [9245, 9247], [9246, 9248], [9210, 9247, 9249], [9248, 9250], [9249, 9251], [9250, 9252], [9211, 9251, 9253], [9252, 9254], [9253, 9255], [9254, 9256], [9212, 9255, 9257], [9256, 9258], [9257, 9259], [9258, 9260], [9213, 9259, 9261], [9260, 9262], [9261, 9263], [9262, 9264], [9214, 9263, 9265], [9264, 9266], [9265, 9267], [9266, 9268], [9215, 9267, 9269], [9268, 9270], [9269, 9271], [9270, 9272], [9216, 9271, 9273], [9272, 9274], [9273, 9275], [9274, 9276], [9217, 9275, 9277], [9276, 9278], [9277, 9279], [9278, 9280], [9218, 9279, 9281], [9280, 9282], [9281, 9283], [9282, 9284], [9219, 9283, 9285], [9284, 9286], [9285, 9287], [9286, 9288], [9220, 9287, 9289], [9288, 9290], [9289, 9291], [9290, 9292], [9221, 9291, 9293], [9292, 9294], [9293, 9295], [9294, 9296], [9222, 9295, 9297], [9296, 9298], [9297, 9299], [9298, 9300], [9223, 9299, 9301], [9300, 9302], [9301, 9303], [9302, 9304], [9224, 9303, 9305], [9304, 9306], [9305, 9307], [9306, 9308], [9225, 9307, 9309], [9308, 9310], [9309, 9311], [9310, 9312], [9226, 9311, 9313], [9312, 9314], [9313, 9315], [9314, 9316], [9227, 9315, 9317], [9316, 9318], [9317, 9319], [9318, 9320], [9228, 9319, 9321], [9320, 9322], [9321, 9323], [9322, 9324], [9229, 9323, 9325], [9324, 9326], [9325, 9327], [9326, 9328], [9230, 9327, 9329], [9328, 9330], [9329, 9331], [9330, 9332], [9231, 9331, 9333], [9332, 9334], [9333, 9335], [9334, 9336], [9232, 9335, 9337], [9336, 9338], [9337, 9339], [9338, 9340], [9233, 9339, 9341], [9340, 9342], [9341, 9343], [9342, 9344], [9234, 9343, 9345], [9344, 9346], [9345, 9347], [9346, 9348], [9235, 9347, 9349], [9348, 9350], [9349, 9351], [9350, 9352], [9236, 9351, 9353], [9352, 9354], [9353, 9355], [9354, 9356], [9237, 9355, 9357], [9356, 9358], [9357, 9359], [9358, 9360], [9238, 9359]] +CNOTERROR: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] +CNOTTIME: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] diff --git a/benchmark/topology/washington_127.layout b/benchmark/topology/washington_127.layout index fc58eb797..ebe790346 100644 --- a/benchmark/topology/washington_127.layout +++ b/benchmark/topology/washington_127.layout @@ -4,5 +4,5 @@ GATESET: {x, rz, h, id, sx, cnot} COUPLINGMAP: [[1, 14], [0, 2], [1, 3], [2, 4], [3, 5, 15], [4, 6], [5, 7], [6, 8], [7, 16], [10], [9, 11], [10, 12], [11, 13, 17], [12], [0, 18], [4, 22], [8, 26], [12, 30], [14, 19], [18, 20], [19, 21, 33], [20, 22], [21, 15, 23], [22, 24], [23, 25, 34], [24, 26], [16, 25, 27], [26, 28], [27, 29, 35], [28, 30], [17, 29, 31], [30, 32], [31, 36], [20, 39], [24, 43], [28, 47], [32, 51], [38, 52], [37, 39], [33, 38, 40], [39, 41], [40, 42, 53], [41, 43], [34, 42, 44], [43, 45], [44, 46, 54], [45, 47], [35, 46, 48], [47, 49], [48, 50, 55], [49, 51], [50, 36], [37, 56], [41, 60], [45, 64], [49, 68], [52, 57], [56, 58], [57, 59, 71], [58, 60], [53, 59, 61], [60, 62], [61, 63, 72], [62, 64], [54, 63, 65], [64, 66], [65, 67, 73], [66, 68], [55, 67, 69], [68, 70], [69, 74], [58, 77], [62, 81], [66, 85], [70, 89], [76, 90], [75, 77], [71, 76, 78], [77, 79], [78, 80, 91], [79, 81], [72, 80, 82], [81, 83], [82, 84, 92], [83, 85], [73, 84, 86], [85, 87], [86, 88, 93], [87, 89], [74, 88], [75, 94], [79, 98], [83, 102], [87, 106], [90, 95], [94, 96], [95, 97, 109], [96, 98], [91, 97, 99], [98, 100], [99, 101, 110], [100, 102], [92, 101, 103], [102, 104], [103, 105, 111], [104, 106], [93, 105, 107], [106, 108], [107, 112], [96], [100, 118], [104, 122], [108, 126], [114], [113, 115], [114, 116], [115, 117], [116, 118], [110, 117, 119], [118, 120], [119, 121], [120, 122], [111, 121, 123], [122, 124], [123, 125], [124, 126], [112, 12]] SGERROR: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] SGTIME: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] -CNOTERROR: [[1, 14], [0, 2], [1, 3], [2, 4], [3, 5, 15], [4, 6], [5, 7], [6, 8], [7, 16], [10], [9, 11], [10, 12], [11, 13, 17], [12], [0, 18], [4, 22], [8, 26], [12, 30], [14, 19], [18, 20], [19, 21, 33], [20, 22], [21, 15, 23], [22, 24], [23, 25, 34], [24, 26], [16, 25, 27], [26, 28], [27, 29, 35], [28, 30], [17, 29, 31], [30, 32], [31, 36], [20, 39], [24, 43], [28, 47], [32, 51], [38, 52], [37, 39], [33, 38, 40], [39, 41], [40, 42, 53], [41, 43], [34, 42, 44], [43, 45], [44, 46, 54], [45, 47], [35, 46, 48], [47, 49], [48, 50, 55], [49, 51], [50, 36], [37, 56], [41, 60], [45, 64], [49, 68], [52, 57], [56, 58], [57, 59, 71], [58, 60], [53, 59, 61], [60, 62], [61, 63, 72], [62, 64], [54, 63, 65], [64, 66], [65, 67, 73], [66, 68], [55, 67, 69], [68, 70], [69, 74], [58, 77], [62, 81], [66, 85], [70, 89], [76, 90], [75, 77], [71, 76, 78], [77, 79], [78, 80, 91], [79, 81], [72, 80, 82], [81, 83], [82, 84, 92], [83, 85], [73, 84, 86], [85, 87], [86, 88, 93], [87, 89], [74, 88], [75, 94], [79, 98], [83, 102], [87, 106], [90, 95], [94, 96], [95, 97, 109], [96, 98], [91, 97, 99], [98, 100], [99, 101, 110], [100, 102], [92, 101, 103], [102, 104], [103, 105, 111], [104, 106], [93, 105, 107], [106, 108], [107, 112], [96], [100, 118], [104, 122], [108, 126], [114], [113, 115], [114, 116], [115, 117], [116, 118], [110, 117, 119], [118, 120], [119, 121], [120, 122], [111, 121, 123], [122, 124], [123, 125], [124, 126], [112, 12]] -CNOTTIME: [[1, 14], [0, 2], [1, 3], [2, 4], [3, 5, 15], [4, 6], [5, 7], [6, 8], [7, 16], [10], [9, 11], [10, 12], [11, 13, 17], [12], [0, 18], [4, 22], [8, 26], [12, 30], [14, 19], [18, 20], [19, 21, 33], [20, 22], [21, 15, 23], [22, 24], [23, 25, 34], [24, 26], [16, 25, 27], [26, 28], [27, 29, 35], [28, 30], [17, 29, 31], [30, 32], [31, 36], [20, 39], [24, 43], [28, 47], [32, 51], [38, 52], [37, 39], [33, 38, 40], [39, 41], [40, 42, 53], [41, 43], [34, 42, 44], [43, 45], [44, 46, 54], [45, 47], [35, 46, 48], [47, 49], [48, 50, 55], [49, 51], [50, 36], [37, 56], [41, 60], [45, 64], [49, 68], [52, 57], [56, 58], [57, 59, 71], [58, 60], [53, 59, 61], [60, 62], [61, 63, 72], [62, 64], [54, 63, 65], [64, 66], [65, 67, 73], [66, 68], [55, 67, 69], [68, 70], [69, 74], [58, 77], [62, 81], [66, 85], [70, 89], [76, 90], [75, 77], [71, 76, 78], [77, 79], [78, 80, 91], [79, 81], [72, 80, 82], [81, 83], [82, 84, 92], [83, 85], [73, 84, 86], [85, 87], [86, 88, 93], [87, 89], [74, 88], [75, 94], [79, 98], [83, 102], [87, 106], [90, 95], [94, 96], [95, 97, 109], [96, 98], [91, 97, 99], [98, 100], [99, 101, 110], [100, 102], [92, 101, 103], [102, 104], [103, 105, 111], [104, 106], [93, 105, 107], [106, 108], [107, 112], [96], [100, 118], [104, 122], [108, 126], [114], [113, 115], [114, 116], [115, 117], [116, 118], [110, 117, 119], [118, 120], [119, 121], [120, 122], [111, 121, 123], [122, 124], [123, 125], [124, 126], [112, 12]] +CNOTERROR: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0], [0, 0], [0, 0], [0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] +CNOTTIME: [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0], [0, 0], [0, 0], [0, 0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0], [0, 0], [0, 0], [0, 0], [0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] diff --git a/docker/test-entrypoint.sh b/docker/test-entrypoint.sh index f37fdb57f..bc7a98e4c 100755 --- a/docker/test-entrypoint.sh +++ b/docker/test-entrypoint.sh @@ -1,8 +1,65 @@ #! /usr/bin/env bash +set -euo pipefail -# in /app -cmake -B /app/build -S /app/qsyn || exit 1 -cmake --build /app/build --parallel "$(nproc)" || exit 1 +# Ensure clean build directory to avoid CMake cache issues +# CMake caches compiler choice in CMakeCache.txt, so we need to remove +# the build directory to ensure we use the compiler specified in ENV +rm -rf /app/build + +# Get compiler paths from environment (set in Dockerfile) +# Use absolute paths to ensure we get the right compiler +CC_COMPILER="${CC:-/usr/bin/gcc}" +CXX_COMPILER="${CXX:-/usr/bin/g++}" + +# If CC/CXX are not set, try to infer from which command +if [ -z "${CC:-}" ] || [ -z "${CXX:-}" ]; then + # Check if we're in a gcc or clang container by checking the Dockerfile ENV + # This is a fallback if ENV variables aren't properly set + if command -v g++ >/dev/null 2>&1 && command -v clang++ >/dev/null 2>&1; then + # Both exist, prefer g++ for gcc-test, clang++ for clang-test + # Check the actual executable to determine + if [ -f "/usr/bin/g++" ]; then + CC_COMPILER="/usr/bin/gcc" + CXX_COMPILER="/usr/bin/g++" + elif [ -f "/usr/bin/clang++" ]; then + CC_COMPILER="/usr/bin/clang" + CXX_COMPILER="/usr/bin/clang++" + fi + fi +fi + +# Verify compiler exists and is executable +if [ ! -x "$CC_COMPILER" ]; then + echo "Error: C compiler not found or not executable: $CC_COMPILER" + exit 1 +fi +if [ ! -x "$CXX_COMPILER" ]; then + echo "Error: C++ compiler not found or not executable: $CXX_COMPILER" + exit 1 +fi + +# Print compiler info for debugging +echo "=== Compiler Configuration ===" +echo "CC: $CC_COMPILER ($($CC_COMPILER --version | head -1))" +echo "CXX: $CXX_COMPILER ($($CXX_COMPILER --version | head -1))" +echo "===============================" + +# Explicitly specify compiler to ensure deterministic builds +# This overrides any CMake cache and ensures we use the compiler +# specified in the Dockerfile (gcc/g++ or clang/clang++) +cmake -B /app/build -S /app/qsyn \ + -DCMAKE_C_COMPILER="$CC_COMPILER" \ + -DCMAKE_CXX_COMPILER="$CXX_COMPILER" \ + -DCMAKE_BUILD_TYPE=Release + +# Verify compiler selection (for debugging) +echo "" +echo "=== CMake Compiler Selection ===" +grep -E "CMAKE_(C|CXX)_COMPILER:" /app/build/CMakeCache.txt || true +echo "================================" +echo "" + +cmake --build /app/build --parallel "$(nproc)" cd /app/qsyn || exit 1 /app/build/qsyn-unit-test || exit 1 diff --git a/examples/qbham.qsyn b/examples/qbham.qsyn new file mode 100644 index 000000000..4966197e7 --- /dev/null +++ b/examples/qbham.qsyn @@ -0,0 +1,23 @@ +//!ARGS INPUT OUTPUT +qbham read ${INPUT} +qbham print + +// sort your terms for better circuits +qbham sort magnitude + +// trotterize the Hamiltonian to a tableau +qbham trotterize 0.1 10 +tableau print + +// latest tableau -> qcir algorithm +tableau opt collapse +convert tableau qcir -s unified -r pmst + +qcir print --gates + +// to map to a device +device read benchmark/topology/guadalupe_16.layout +duostra + +// to write circuit +qcir write ${OUTPUT} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..d0c1c087f --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,21 @@ +[project] +name = "qsyn" +version = "0.1.0" +description = "Quantum circuit synthesis and optimization toolkit" +requires-python = ">=3.12" +dependencies = [ + "qiskit>=2.3.0", + "qiskit-ibm-runtime>=0.45.0", + "pylatexenc>=2.10", + "matplotlib>=3.8.0", + "pillow>=12.1.0", + "dotenv>=0.9.9", +] + +[dependency-groups] +dev = [] + +[tool.hatch.build.targets.wheel] +# This is a C++ project with Python helper scripts, not a Python package +# Skip packaging by specifying empty packages list +packages = [] diff --git a/scripts/LINT b/scripts/LINT index 598f2b609..9dc4900b4 100755 --- a/scripts/LINT +++ b/scripts/LINT @@ -1,5 +1,62 @@ #!/usr/bin/env bash +# Default versions (empty means use default command) +CLANG_FORMAT_CMD="clang-format" +CLANG_TIDY_CMD="clang-tidy" + +# Parse command-line arguments +while [[ $# -gt 0 ]]; do + case $1 in + --clang-format-version|-f) + if [ -n "$2" ] && [ "${2:0:1}" != "-" ]; then + CLANG_FORMAT_CMD="clang-format-$2" + shift 2 + else + echo "Error: --clang-format-version requires a version number" + exit 1 + fi + ;; + --clang-tidy-version|-t) + if [ -n "$2" ] && [ "${2:0:1}" != "-" ]; then + CLANG_TIDY_CMD="clang-tidy-$2" + shift 2 + else + echo "Error: --clang-tidy-version requires a version number" + exit 1 + fi + ;; + --help|-h) + echo "Usage: $0 [OPTIONS]" + echo "" + echo "Options:" + echo " --clang-format-version, -f VERSION Specify clang-format version (e.g., 15, 16)" + echo " --clang-tidy-version, -t VERSION Specify clang-tidy version (e.g., 15, 16)" + echo " --help, -h Show this help message" + echo "" + echo "Examples:" + echo " $0 -f 15 -t 15 # Use clang-format-15 and clang-tidy-15" + echo " $0 -f 16 # Use clang-format-16 and default clang-tidy" + exit 0 + ;; + *) + echo "Unknown option: $1" + echo "Use --help for usage information" + exit 1 + ;; + esac +done + +# Verify that the specified commands exist +if [ ! -x "$(command -v "$CLANG_FORMAT_CMD")" ]; then + echo "Error: $CLANG_FORMAT_CMD is not installed or not found in PATH" + exit 1 +fi + +if [ ! -x "$(command -v "$CLANG_TIDY_CMD")" ]; then + echo "Error: $CLANG_TIDY_CMD is not installed or not found in PATH" + exit 1 +fi + function num_procs() { if [ "$(uname)" == "Darwin" ]; then sysctl -n hw.logicalcpu @@ -14,14 +71,16 @@ if [ ! -x "$(command -v parallel)" ]; then fi format_one() { - clang-format -i "$1" + "$CLANG_FORMAT_CMD" -i "$1" } export -f format_one +export CLANG_FORMAT_CMD lint_one() { - clang-tidy -p build "$1" --quiet 2>&1 | grep -v -E "warnings? generated" + "$CLANG_TIDY_CMD" -p build "$1" --quiet 2>&1 | grep -v -E "warnings? generated" } export -f lint_one +export CLANG_TIDY_CMD FILES=$(find ./src -regex '.*\.[ch]pp' -type f) CPPS=$(find ./src -regex '.*\.cpp' -type f) @@ -31,6 +90,28 @@ echo "Formatting files..." parallel -j"$(num_procs)" format_one ::: "$FILES" echo "Generating compile commands..." cmake -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=1 > /dev/null + +# Create a temporary build directory for linting with sanitized compile commands +LINT_BUILD_DIR=$(mktemp -d) +export LINT_BUILD_DIR +trap "rm -rf '$LINT_BUILD_DIR'" EXIT + +# Copy and sanitize compile_commands.json for clang-tidy +# Remove GCC-specific flags that clang-tidy doesn't recognize +if [ -f build/compile_commands.json ]; then + if ! command -v python3 &> /dev/null; then + echo "Error: python3 is required but not found. Please install python3." + exit 1 + fi + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + python3 "$SCRIPT_DIR/sanitize_compile_commands.py" \ + build/compile_commands.json \ + "$LINT_BUILD_DIR/compile_commands.json" +else + echo "Warning: compile_commands.json not found" + exit 1 +fi + echo "Linting files..." parallel -j"$(num_procs)" lint_one ::: "$CPPS" echo "Done" diff --git a/scripts/get_backend.py b/scripts/get_backend.py new file mode 100644 index 000000000..3fd61f7ac --- /dev/null +++ b/scripts/get_backend.py @@ -0,0 +1,69 @@ +#! /usr/bin/env python3 + +''' +retrieves the attributes of an IBM backend and dumps them into a JSON file +''' + +import logging +import os +import sys + +from dotenv import load_dotenv + +# Silence QiskitRuntimeService warnings (instance selection, saved account, etc.) +logging.getLogger("qiskit_ibm_runtime.qiskit_runtime_service").setLevel(logging.ERROR) +from qiskit_ibm_runtime import IBMBackend, QiskitRuntimeService +import qiskit_ibm_runtime.fake_provider as fake_provider + +def load_service() -> QiskitRuntimeService: + load_dotenv() # loads .env from current dir (or parent dirs) + token = os.getenv("IBMQ_API_KEY") + if not token: + print("IBMQ_API_KEY not set in environment or .env", file=sys.stderr) + return None + service = QiskitRuntimeService( + token=token, + ) + return service + +def print_available_backends() -> None: + service = load_service() + print("Available backends:", file=sys.stderr) + for b in service.backends(): + print(f" {b.name}", file=sys.stderr) + +def get_real_backend(backend_name: str, verbose = False) -> IBMBackend: + service = load_service() + try: + backend = service.backend(backend_name) + return backend + except Exception: + if verbose: + print(f"Error: Failed to get backend {backend_name}.", file=sys.stderr) + print_available_backends(service) + return None + + +def get_fake_backend(backend_name: str, verbose = False) -> IBMBackend: + try: + # Convert backend name to fake backend class name + # e.g., "fake_manila" -> "FakeManilaV2" or "FakeManila" + backend_parts = backend_name.replace("fake_", "").replace("_", " ").title().replace(" ", "") + + # Try V2 version first, then fall back to V1 + backend_class_name = f"Fake{backend_parts}V2" + try: + backend_class = getattr(fake_provider, backend_class_name) + return backend_class() + except AttributeError: + # Try without V2 suffix + backend_class_name = f"Fake{backend_parts}" + backend_class = getattr(fake_provider, backend_class_name) + return backend_class() + except (AttributeError, Exception) as e: + if verbose: + print(f"Error: Failed to get backend {backend_name}.") + print(f"Please provide a valid fake backend name (e.g., fake_manila, fake_oslo)") + print("\nAvailable fake backends can be found at:") + print("https://docs.quantum.ibm.com/api/qiskit-ibm-runtime/fake_provider") + return None \ No newline at end of file diff --git a/scripts/get_ibm_backend_attrs.py b/scripts/get_ibm_backend_attrs.py new file mode 100644 index 000000000..1eda39281 --- /dev/null +++ b/scripts/get_ibm_backend_attrs.py @@ -0,0 +1,92 @@ +#! /usr/bin/env python3 + +''' +retrieves the attributes of an IBM backend and dumps them into a JSON file +''' + +import argparse +import json + +from qiskit_ibm_runtime import RuntimeEncoder, IBMBackend + +from get_backend import get_fake_backend, get_real_backend, print_available_backends + +import os + +def save_jsons(backend_name: str, backend_obj: IBMBackend, output_dir: str) -> None: + ''' + save the backend attributes to a JSON file + the path is ~/.config/qsyn/cached_backend_attrs/_.json + and ~/.config/qsyn/cached_backend_attrs/_properties_.json + ''' + output_dir = os.path.expanduser(output_dir) + # if the cached directory does not exist, create it + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + # if cached files for this backend already exists, delete it + if os.path.exists(os.path.expanduser(f"{output_dir}/{backend_name}_*.json")): + os.remove(os.path.expanduser(f"{output_dir}/{backend_name}_*.json")) + + device_file = os.path.join(output_dir, f"{backend_name}.json") + with open(device_file, "w") as f: + json.dump(backend_obj.to_dict(), f, cls=RuntimeEncoder) + + props_file = os.path.join(output_dir, f"{backend_name}_properties.json") + with open(props_file, "w") as f: + json.dump(backend_obj.properties().to_dict(), f, cls=RuntimeEncoder) + +def main() -> int: + + parser = argparse.ArgumentParser( + description='Dump the attributes of an IBM backend', + formatter_class=argparse.RawTextHelpFormatter + ) + parser.add_argument( + "backend", + type=str, + help='the name of the IBM backend to dump' + ) + parser.add_argument( + "-f", "--fake", + action="store_true", + help='use fake backend' + ) + parser.add_argument( + "-o", "--output", + type=str, + help='The output directory to save the backend attributes. Required unless --print-available-backends is specified. ' + ) + parser.add_argument( + "--print-available-backends", + action="store_true", + help='print the available backends' + ) + args = parser.parse_args() + + if args.print_available_backends: + print_available_backends() + return 0 + + if args.backend is None: + parser.print_help() + return 1 + + # normalize the backend name + + if not args.fake: + backend_obj = get_real_backend(args.backend) + if backend_obj is not None: + save_jsons(args.backend, backend_obj, args.output) + else: + return 1 + else: + backend_obj = get_fake_backend(args.backend) + if backend_obj is not None: + save_jsons(args.backend, backend_obj, args.output) + else: + return 1 + return 0 + +if __name__ == "__main__": + exit(main()) \ No newline at end of file diff --git a/scripts/qiskit_transpile.py b/scripts/qiskit_transpile.py new file mode 100644 index 000000000..10ae1886a --- /dev/null +++ b/scripts/qiskit_transpile.py @@ -0,0 +1,93 @@ +''' +calls qiskit to transpile a qcir circuit to a qiskit circuit +supports selecting backend and optimization levels +uses fake provider for transpilation (no IBM Quantum credentials required) +''' + +import argparse +from qiskit import QuantumCircuit, transpile +from qiskit import qasm2 +from typing import Optional +import qiskit_ibm_runtime.fake_provider as fake_provider + +def transpile_qcir_to_qiskit(input_file: str, output_file: str, backend: Optional[str], optimization_level: int) -> bool: + ''' + returns true if the transpilation is successful, false otherwise + ''' + try: + qc = QuantumCircuit.from_qasm_file(input_file) + + # Use fake provider for transpilation if backend is specified + backend_obj = None + if backend: + try: + # Convert backend name to fake backend class name + # e.g., "fake_manila" -> "FakeManilaV2" or "FakeManila" + backend_parts = backend.replace("fake_", "").replace("_", " ").title().replace(" ", "") + + # Try V2 version first, then fall back to V1 + backend_class_name = f"Fake{backend_parts}V2" + try: + backend_class = getattr(fake_provider, backend_class_name) + backend_obj = backend_class() + except AttributeError: + # Try without V2 suffix + backend_class_name = f"Fake{backend_parts}" + backend_class = getattr(fake_provider, backend_class_name) + backend_obj = backend_class() + except (AttributeError, Exception) as e: + print(f"Error: Failed to get backend {backend}.") + print(f"Please provide a valid fake backend name (e.g., fake_manila, fake_oslo)") + print("\nAvailable fake backends can be found at:") + print("https://docs.quantum.ibm.com/api/qiskit-ibm-runtime/fake_provider") + return False + + # Transpile the circuit + # If no backend is specified, transpile without qubit routing + transpiled_qc = transpile(qc, backend=backend_obj, optimization_level=optimization_level) + + # Write the transpiled circuit to file + qasm2.dump(transpiled_qc, output_file) + return True + except FileNotFoundError as e: + print(f"Error: Input file not found: {e}") + return False + except Exception as e: + print(f"Error during transpilation: {e}") + return False + +def main(): + parser = argparse.ArgumentParser( + description='Transpile a qcir circuit to a qiskit circuit', + formatter_class=argparse.RawTextHelpFormatter + ) + parser.add_argument( + "-input", + type=str, + required=True, + help='the input .qasm file' + ) + parser.add_argument( + "-output", + type=str, + required=True, + help='the output .qasm file' + ) + parser.add_argument( + "-backend", + type=str, + default=None, + help='the backend to use for transpilation (optional; if omitted, transpiles without qubit routing)' + ) + parser.add_argument( + "-optimization_level", + type=int, + required=True, + help='the optimization level to use for transpilation' + ) + args = parser.parse_args() + + return transpile_qcir_to_qiskit(args.input, args.output, args.backend, args.optimization_level) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/sanitize_compile_commands.py b/scripts/sanitize_compile_commands.py new file mode 100755 index 000000000..e3323d8bd --- /dev/null +++ b/scripts/sanitize_compile_commands.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +""" +Sanitize compile_commands.json by removing compiler-specific flags +that clang-tidy doesn't recognize (e.g., -Wno-restrict from GCC). +This script is used by scripts/LINT to sanitize the compile_commands.json +file for clang-tidy. +""" + +import json +import sys +import argparse + + +def sanitize_compile_commands(input_file: str, output_file: str) -> None: + """Remove GCC-specific flags from compile commands.""" + try: + with open(input_file, 'r') as f: + data = json.load(f) + + for entry in data: + if 'command' in entry: + # Remove -Wno-restrict flag (GCC-specific, not supported by clang) + entry['command'] = ( + entry['command'] + .replace(' -Wno-restrict ', ' ') + .replace(' -Wno-restrict', '') + .replace('-Wno-restrict ', '') + ) + + with open(output_file, 'w') as f: + json.dump(data, f, indent=2) + except Exception as e: + print(f'Error processing compile_commands.json: {e}', file=sys.stderr) + sys.exit(1) + + +def main(): + parser = argparse.ArgumentParser( + description='Sanitize compile_commands.json for clang-tidy' + ) + parser.add_argument( + 'input', + help='Input compile_commands.json file path' + ) + parser.add_argument( + 'output', + help='Output compile_commands.json file path' + ) + + args = parser.parse_args() + sanitize_compile_commands(args.input, args.output) + + +if __name__ == '__main__': + main() + diff --git a/src/argparse/arg_parser_print.cpp b/src/argparse/arg_parser_print.cpp index 48c7791db..cc906ca02 100644 --- a/src/argparse/arg_parser_print.cpp +++ b/src/argparse/arg_parser_print.cpp @@ -9,7 +9,6 @@ #include #include -#include #include #include #include @@ -18,6 +17,7 @@ #include "./argparse.hpp" #include "unicode/display_width.hpp" #include "util/dvlab_string.hpp" +#include "util/tabler.hpp" #include "util/terminal_attributes.hpp" #include "util/text_format.hpp" #include "util/util.hpp" @@ -194,27 +194,35 @@ std::string wrap_text(std::string_view str, size_t max_help_width) { * * @param arg */ -void tabulate_help_string(ArgumentParser const& parser, fort::utf8_table& table, size_t max_help_string_width, Argument const& arg) { +void tabulate_help_string(ArgumentParser const& parser, Tabler& table, size_t max_help_string_width, Argument const& arg) { auto usage_string = arg.get_usage().value_or(metavar_styled(arg.get_metavar())); - table << type_styled(arg.get_nargs().upper > 0 ? arg.get_type_string() : "flag"); + std::vector row; + row.reserve(4); + + row.emplace_back(type_styled(arg.get_nargs().upper > 0 ? arg.get_type_string() : "flag")); if (arg.is_option()) { if (arg.get_nargs().upper > 0) { - table << styled_option_name_and_aliases(parser, arg) << usage_string; + row.emplace_back(styled_option_name_and_aliases(parser, arg)); + row.emplace_back(usage_string); } else { - table << styled_option_name_and_aliases(parser, arg) << ""; + row.emplace_back(styled_option_name_and_aliases(parser, arg)); + row.emplace_back(""); } } else { - table << usage_string << ""; + row.emplace_back(usage_string); + row.emplace_back(""); } - table << wrap_text(arg.get_help(), max_help_string_width) << fort::endr; + row.emplace_back(wrap_text(arg.get_help(), max_help_string_width)); + table.add_row(row); } -fort::utf8_table create_parser_help_table() { - fort::utf8_table table; - table.set_border_style(FT_EMPTY_STYLE); - table.set_left_margin(1); +Tabler create_parser_help_table() { + Tabler table; + table.left_margin() = 1; + table.cell_left_padding() = 1; + table.cell_right_padding() = 1; return table; } @@ -272,15 +280,6 @@ void ArgumentParser::print_summary() const { * */ void ArgumentParser::print_help() const { - ft_set_u8strwid_func( - [](void const* beg, void const* end, size_t* width) -> int { - std::string const tmp_str(static_cast(beg), static_cast(end)); - - *width = unicode::display_width(tmp_str); - - return 0; - }); - print_usage(); if (!get_description().empty()) { @@ -331,7 +330,11 @@ void ArgumentParser::print_help() const { auto table = detail::create_parser_help_table(); for (auto& [_, parser] : _pimpl->subparsers->get_subparsers()) { if (!parser.get_description().empty()) { - table.write_ln(" " + detail::styled_parser_name(parser), detail::wrap_text(parser.get_description(), max_help_string_width)); + std::vector row; + row.reserve(2); + row.emplace_back(" " + detail::styled_parser_name(parser)); + row.emplace_back(detail::wrap_text(parser.get_description(), max_help_string_width)); + table.add_row(row); } } diff --git a/src/cli/cli_tab.cpp b/src/cli/cli_tab.cpp index 7414c9322..aabd7bbdc 100644 --- a/src/cli/cli_tab.cpp +++ b/src/cli/cli_tab.cpp @@ -9,16 +9,15 @@ #include #include -#include #include #include #include #include #include "./cli.hpp" -#include "fmt/color.h" #include "unicode/display_width.hpp" #include "util/dvlab_string.hpp" +#include "util/tabler.hpp" #include "util/terminal_attributes.hpp" #include "util/text_format.hpp" #include "util/util.hpp" @@ -234,7 +233,7 @@ dvlab::CommandLineInterface::TabActionResult dvlab::CommandLineInterface::_match for (auto& file : files) { for (size_t i = 0; i < file.size(); ++i) { if (_is_special_char(file[i])) { - file.insert(i, "\\"); + file.insert(i, 1, '\\'); ++i; } } @@ -341,31 +340,24 @@ bool dvlab::CommandLineInterface::_autocomplete(std::string prefix_copy, std::ve void dvlab::CommandLineInterface::_print_as_table(std::vector words) const { // calculate an lower bound to the spacing first - fort::utf8_table table; - table.set_border_style(FT_EMPTY_STYLE); - table.set_cell_left_padding(0); - table.set_cell_right_padding(2); - - ft_set_u8strwid_func( - [](void const* beg, void const* end, size_t* width) -> int { - std::string const tmp_str(static_cast(beg), static_cast(end)); - - *width = unicode::display_width(tmp_str); - - return 0; - }); - auto const longest_word_len = std::ranges::max( words | std::views::transform([](std::string const& str) { return unicode::display_width(str); })); auto const num_columns = dvlab::utils::get_terminal_size().width / (longest_word_len + 2); - auto const num_rows = 1 + (words.size() - 1) / num_columns; + auto const num_rows = (words.size() - 1) / num_columns + 1; + + Tabler table; + table.left_margin() = 1; + table.cell_left_padding() = 0; + table.cell_right_padding() = 2; for (size_t i = 0; i < num_rows; ++i) { + std::vector row; + row.reserve(num_columns); for (size_t j = i; j < words.size(); j += num_rows) { - table << words[j]; + row.emplace_back(words[j]); } - table << fort::endr; + table.add_row(row); } fmt::print("\n{}", table.to_string()); } diff --git a/src/cmd/conversion_cmd.cpp b/src/cmd/conversion_cmd.cpp index 6cc85bd36..8e4a153d2 100644 --- a/src/cmd/conversion_cmd.cpp +++ b/src/cmd/conversion_cmd.cpp @@ -14,10 +14,12 @@ #include "argparse/arg_parser.hpp" #include "argparse/arg_type.hpp" #include "cli/cli.hpp" +#include "cmd/qbham_mgr.hpp" #include "cmd/qcir_mgr.hpp" #include "cmd/tableau_mgr.hpp" #include "cmd/tensor_mgr.hpp" #include "cmd/zxgraph_mgr.hpp" +#include "convert/qbham_to_tensor.hpp" #include "convert/qcir_to_tableau.hpp" #include "convert/qcir_to_tensor.hpp" #include "convert/qcir_to_zxgraph.hpp" @@ -46,7 +48,7 @@ Command convert_from_qcir_cmd( qcir::QCirMgr& qcir_mgr, zx::ZXGraphMgr& zxgraph_mgr, tensor::TensorMgr& tensor_mgr, - experimental::TableauMgr& tableau_mgr) { + tableau::TableauMgr& tableau_mgr) { return { "qcir", [&](ArgumentParser& parser) { @@ -75,9 +77,9 @@ Command convert_from_qcir_cmd( if (graph.has_value()) { zxgraph_mgr.add(zxgraph_mgr.get_next_id(), std::make_unique(std::move(graph.value()))); - zxgraph_mgr.get()->set_filename(qcir_mgr.get()->get_filename()); - zxgraph_mgr.get()->add_procedures(qcir_mgr.get()->get_procedures()); - zxgraph_mgr.get()->add_procedure("QC2ZX"); + zxgraph_mgr.set_filename(qcir_mgr.get_filename()); + zxgraph_mgr.add_procedures(qcir_mgr.get_procedures()); + zxgraph_mgr.add_procedure("QC2ZX"); } return CmdExecResult::done; } @@ -90,22 +92,22 @@ Command convert_from_qcir_cmd( tensor_mgr.add(tensor_mgr.get_next_id()); tensor_mgr.set(std::make_unique>(std::move(tensor.value()))); - tensor_mgr.get()->set_filename(qcir_mgr.get()->get_filename()); - tensor_mgr.get()->add_procedures(qcir_mgr.get()->get_procedures()); - tensor_mgr.get()->add_procedure("QC2TS"); + tensor_mgr.set_filename(qcir_mgr.get_filename()); + tensor_mgr.add_procedures(qcir_mgr.get_procedures()); + tensor_mgr.add_procedure("QC2TS"); } return CmdExecResult::done; } if (to_type == "tableau") { spdlog::info("Converting to QCir {} to Tableau {}...", qcir_mgr.focused_id(), tableau_mgr.get_next_id()); - auto tableau = experimental::to_tableau(*qcir_mgr.get()); + auto tableau = tableau::to_tableau(*qcir_mgr.get()); if (tableau.has_value()) { - tableau_mgr.add(tableau_mgr.get_next_id(), std::make_unique(std::move(tableau.value()))); + tableau_mgr.add(tableau_mgr.get_next_id(), std::make_unique(std::move(tableau.value()))); - tableau_mgr.get()->set_filename(qcir_mgr.get()->get_filename()); - tableau_mgr.get()->add_procedures(qcir_mgr.get()->get_procedures()); - tableau_mgr.get()->add_procedure("QC2TABL"); + tableau_mgr.set_filename(qcir_mgr.get_filename()); + tableau_mgr.add_procedures(qcir_mgr.get_procedures()); + tableau_mgr.add_procedure("QC2TABL"); } return CmdExecResult::done; } @@ -151,16 +153,16 @@ Command convert_from_zx_cmd(zx::ZXGraphMgr& zxgraph_mgr, QCirMgr& qcir_mgr, tens qcir::QCir* result = ext.extract(); if (result != nullptr) { qcir_mgr.add(qcir_mgr.get_next_id(), std::unique_ptr(result)); - qcir_mgr.get()->set_filename(zxgraph_mgr.get()->get_filename()); - qcir_mgr.get()->add_procedures(zxgraph_mgr.get()->get_procedures()); + qcir_mgr.set_filename(zxgraph_mgr.get_filename()); + qcir_mgr.add_procedures(zxgraph_mgr.get_procedures()); if (!extractor::EXTRACTOR_CONFIG.permute_qubits) { spdlog::warn("The extracted circuit is up to a qubit permutation."); spdlog::warn("Remaining permutation information is in ZXGraph id {}.", zxgraph_mgr.get_next_id()); zxgraph_mgr.add(zxgraph_mgr.get_next_id(), std::make_unique(std::move(target))); - zxgraph_mgr.get()->add_procedure("ZX2QC-Unpermuted"); - qcir_mgr.get()->add_procedure("ZX2QC-Unpermuted"); + zxgraph_mgr.add_procedure("ZX2QC-Unpermuted"); + qcir_mgr.add_procedure("ZX2QC-Unpermuted"); } else - qcir_mgr.get()->add_procedure("ZX2QC"); + qcir_mgr.add_procedure("ZX2QC"); assert(std::ranges::all_of(qcir_mgr.get()->get_gates(), [&](auto* gate) { return gate->get_id() == qcir_mgr.get()->get_gate(gate->get_id())->get_id(); })); } @@ -173,9 +175,9 @@ Command convert_from_zx_cmd(zx::ZXGraphMgr& zxgraph_mgr, QCirMgr& qcir_mgr, tens if (tensor.has_value()) { tensor_mgr.add(tensor_mgr.get_next_id(), std::make_unique>(std::move(tensor.value()))); - tensor_mgr.get()->set_filename(zxgraph_mgr.get()->get_filename()); - tensor_mgr.get()->add_procedures(zxgraph_mgr.get()->get_procedures()); - tensor_mgr.get()->add_procedure("ZX2TS"); + tensor_mgr.set_filename(zxgraph_mgr.get_filename()); + tensor_mgr.add_procedures(zxgraph_mgr.get_procedures()); + tensor_mgr.add_procedure("ZX2TS"); } return CmdExecResult::done; } @@ -206,9 +208,9 @@ Command convert_from_tensor_cmd(tensor::TensorMgr& tensor_mgr, QCirMgr& qcir_mgr if (result) { qcir_mgr.add(qcir_mgr.get_next_id(), std::make_unique(std::move(*result))); - qcir_mgr.get()->add_procedures(tensor_mgr.get()->get_procedures()); - qcir_mgr.get()->add_procedure("TS2QC"); - qcir_mgr.get()->set_filename(tensor_mgr.get()->get_filename()); + qcir_mgr.add_procedures(tensor_mgr.get_procedures()); + qcir_mgr.add_procedure("TS2QC"); + qcir_mgr.set_filename(tensor_mgr.get_filename()); } return CmdExecResult::done; @@ -218,7 +220,7 @@ Command convert_from_tensor_cmd(tensor::TensorMgr& tensor_mgr, QCirMgr& qcir_mgr }}; } -Command convert_from_tableau_cmd(experimental::TableauMgr& tableau_mgr, qcir::QCirMgr& qcir_mgr) { +Command convert_from_tableau_cmd(tableau::TableauMgr& tableau_mgr, qcir::QCirMgr& qcir_mgr) { return { "tableau", [&](ArgumentParser& parser) { @@ -231,51 +233,168 @@ Command convert_from_tableau_cmd(experimental::TableauMgr& tableau_mgr, qcir::QC .description("convert from Tableau to QCir"); to_qcir.add_argument("-c", "--clifford") - .constraint(choices_allow_prefix({"hopt", "ag", "hstair"})) + .constraint(choices_allow_prefix({"hopt", "ag", "hstair", "ag+"})) .default_value("hopt") .help("specify the Clifford synthesis strategy (default: hopt)."); to_qcir.add_argument("-r", "--rotation") - .constraint(choices_allow_prefix({"naive", "tpar", "graysynth", "gstair", "mst"})) + .constraint(choices_allow_prefix({"naive", "basic", "graysynth", "gstair", "mst", "pmst"})) .default_value("naive") .help("specify the rotation synthesis strategy (default: naive)."); + + to_qcir.add_argument("-s", "--synthesis-type") + .constraint(choices_allow_prefix({"eager", "lazy", "unified"})) + .default_value("eager") + .help("specify the synthesis type (default: eager)."); }, [&](ArgumentParser const& parser) { using namespace dvlab::str; + using namespace qsyn::tableau; if (!dvlab::utils::mgr_has_data(tableau_mgr)) return CmdExecResult::error; auto to_type = parser.get("to-type"); if (to_type == "qcir") { - auto const clifford_strategy = std::invoke([&]() -> std::unique_ptr { - auto const clifford_strategy_str = parser.get("--clifford"); - if (is_prefix_of(clifford_strategy_str, "hopt")) return std::make_unique(); - if (is_prefix_of(clifford_strategy_str, "ag")) return std::make_unique(); - if (is_prefix_of(clifford_strategy_str, "hstair")) return std::make_unique(experimental::HOptSynthesisStrategy::Mode::staircase); - DVLAB_UNREACHABLE("Invalid clifford strategy!!"); - return nullptr; - }); - - auto const rotation_strategy = std::invoke([&]() -> std::unique_ptr { - auto const rotation_strategy_str = parser.get("--rotation"); - if (is_prefix_of(rotation_strategy_str, "naive")) return std::make_unique(); - if (is_prefix_of(rotation_strategy_str, "tpar")) return std::make_unique(); - if (is_prefix_of(rotation_strategy_str, "graysynth")) return std::make_unique(); - if (is_prefix_of(rotation_strategy_str, "gstair")) return std::make_unique(experimental::GraySynthPauliRotationsSynthesisStrategy::Mode::staircase); - if (is_prefix_of(rotation_strategy_str, "mst")) return std::make_unique(); - DVLAB_UNREACHABLE("Invalid rotation strategy!!"); - return nullptr; - }); + auto const synthesis_type_str = parser.get("--synthesis-type"); + auto const clifford_strategy_str = parser.get("--clifford"); + auto const rotation_strategy_str = parser.get("--rotation"); + + // lazy synthesis requires hopt/hstair for Clifford synthesis + // and gray/gstair/mst for rotation synthesis + if (is_prefix_of(synthesis_type_str, "lazy")) { + if (!is_prefix_of(clifford_strategy_str, "hopt") && + !is_prefix_of(clifford_strategy_str, "hstair")) { + spdlog::error("Lazy synthesis requires hopt/hstair for Clifford synthesis!!"); + return CmdExecResult::error; + } + + if (!is_prefix_of(rotation_strategy_str, "graysynth") && + !is_prefix_of(rotation_strategy_str, "gstair") && + !is_prefix_of(rotation_strategy_str, "mst")) { + spdlog::error("Lazy synthesis requires graysynth/gstair/mst for rotation synthesis!!"); + return CmdExecResult::error; + } + } + + if (is_prefix_of(synthesis_type_str, "unified")) { + if (!is_prefix_of(rotation_strategy_str, "pmst") && + !is_prefix_of(rotation_strategy_str, "basic")) { + spdlog::error("Unified synthesis requires pmst/basic for rotation synthesis!!"); + return CmdExecResult::error; + } + } + + auto const clifford_strategy = std::invoke( + [&]() -> std::unique_ptr< + StabilizerTableauSynthesisStrategy> { + using HOptMode = HOptSynthesisStrategy::Mode; + if (is_prefix_of(clifford_strategy_str, "hopt")) + return std::make_unique(); + if (is_prefix_of(clifford_strategy_str, "ag")) + return std::make_unique(); + if (is_prefix_of(clifford_strategy_str, "hstair")) + return std::make_unique< + HOptSynthesisStrategy>(HOptMode::staircase); + if (is_prefix_of(clifford_strategy_str, "ag+")) + return std::make_unique(AGSynthesisStrategy::Mode::ag_plus); + DVLAB_UNREACHABLE("Invalid clifford strategy!!"); + return nullptr; + }); + + auto const rotation_strategy = std::invoke( + [&]() -> std::unique_ptr { + using GrayMode = GraySynthStrategy::Mode; + if (is_prefix_of(rotation_strategy_str, "naive")) + return std::make_unique< + NaivePauliRotationsSynthesisStrategy>(); + if (is_prefix_of(rotation_strategy_str, "basic")) + return std::make_unique< + BasicPauliRotationsSynthesisStrategy>(); + if (is_prefix_of(rotation_strategy_str, "graysynth")) + return std::make_unique(); + if (is_prefix_of(rotation_strategy_str, "gstair")) + return std::make_unique< + GraySynthStrategy>(GrayMode::staircase); + if (is_prefix_of(rotation_strategy_str, "mst")) + return std::make_unique(); + if (is_prefix_of(rotation_strategy_str, "pmst")) + return std::make_unique(); + DVLAB_UNREACHABLE("Invalid rotation strategy!!"); + return nullptr; + }); + + auto const synthesis_type = std::invoke( + [&]() -> SynthesisType { + if (synthesis_type_str == "eager") + return SynthesisType::eager; + if (synthesis_type_str == "lazy") + return SynthesisType::lazy; + if (synthesis_type_str == "unified") + return SynthesisType::unified; + DVLAB_UNREACHABLE("Invalid synthesis type!!"); + return SynthesisType::eager; + }); spdlog::info("Converting to Tableau {} to QCir {}...", tableau_mgr.focused_id(), qcir_mgr.get_next_id()); - auto qcir = experimental::to_qcir(*tableau_mgr.get(), *clifford_strategy, *rotation_strategy); + auto qcir = tableau::to_qcir( + *tableau_mgr.get(), + *clifford_strategy, + *rotation_strategy, + synthesis_type); if (qcir.has_value()) { qcir_mgr.add(qcir_mgr.get_next_id(), std::make_unique(std::move(qcir.value()))); + qcir_mgr.set_filename(tableau_mgr.get_filename()); + qcir_mgr.add_procedures(tableau_mgr.get_procedures()); + qcir_mgr.add_procedure("TABL2QC"); + } + + return CmdExecResult::done; + } + + spdlog::error("The conversion is not supported yet!!"); + return CmdExecResult::error; + }}; +} - qcir_mgr.get()->set_filename(tableau_mgr.get()->get_filename()); - qcir_mgr.get()->add_procedures(tableau_mgr.get()->get_procedures()); - qcir_mgr.get()->add_procedure("TABL2QC"); +Command convert_from_qbham_cmd(hamiltonian::QubitHamiltonianMgr& qbham_mgr, tensor::TensorMgr& tensor_mgr) { + return { + "qbham", + [&](ArgumentParser& parser) { + parser.description("convert from QubitHamiltonian to other data structures"); + + auto subparsers = parser.add_subparsers("to-type") + .required(true); + + auto to_tensor = subparsers.add_parser("tensor") + .description("convert from QubitHamiltonian to Tensor. Note that this outputs the "); + (void)to_tensor; + }, + [&](ArgumentParser const& parser) { + if (!dvlab::utils::mgr_has_data(qbham_mgr)) return CmdExecResult::error; + auto const to_type = parser.get("to-type"); + + if (to_type == "tensor") { + auto const* hamilt = qbham_mgr.get(); + + spdlog::info( + "Converting QubitHamiltonian {} ({} qubits, {} terms) to Tensor {}...", + qbham_mgr.focused_id(), + (hamilt->begin() != hamilt->end()) ? hamilt->begin()->n_qubits() : 0, + hamilt->n_terms(), + tensor_mgr.get_next_id()); + + auto tensor = qsyn::to_tensor(*hamilt); + if (!tensor.has_value()) { + spdlog::warn("QubitHamiltonian {} is empty; no tensor created.", qbham_mgr.focused_id()); + return CmdExecResult::done; } + tensor_mgr.add(tensor_mgr.get_next_id()); + tensor_mgr.set(std::make_unique>(std::move(tensor.value()))); + + tensor_mgr.set_filename(qbham_mgr.get_filename()); + tensor_mgr.add_procedures(qbham_mgr.get_procedures()); + tensor_mgr.add_procedure("QBHAM2TS"); + return CmdExecResult::done; } @@ -284,7 +403,11 @@ Command convert_from_tableau_cmd(experimental::TableauMgr& tableau_mgr, qcir::QC }}; } -Command conversion_cmd(QCirMgr& qcir_mgr, qsyn::tensor::TensorMgr& tensor_mgr, qsyn::zx::ZXGraphMgr& zxgraph_mgr, experimental::TableauMgr& tableau_mgr) { +Command conversion_cmd(QCirMgr& qcir_mgr, + qsyn::tensor::TensorMgr& tensor_mgr, + qsyn::zx::ZXGraphMgr& zxgraph_mgr, + tableau::TableauMgr& tableau_mgr, + hamiltonian::QubitHamiltonianMgr& qbham_mgr) { auto cmd = dvlab::Command{ "convert", [&](ArgumentParser& parser) { @@ -299,6 +422,7 @@ Command conversion_cmd(QCirMgr& qcir_mgr, qsyn::tensor::TensorMgr& tensor_mgr, q cmd.add_subcommand("from-type", convert_from_zx_cmd(zxgraph_mgr, qcir_mgr, tensor_mgr)); cmd.add_subcommand("from-type", convert_from_tensor_cmd(tensor_mgr, qcir_mgr)); cmd.add_subcommand("from-type", convert_from_tableau_cmd(tableau_mgr, qcir_mgr)); + cmd.add_subcommand("from-type", convert_from_qbham_cmd(qbham_mgr, tensor_mgr)); return cmd; } @@ -323,17 +447,22 @@ Command sk_decompose_cmd(qsyn::tensor::TensorMgr& tensor_mgr, QCirMgr& qcir_mgr) if (result) { qcir_mgr.add(qcir_mgr.get_next_id(), std::make_unique(std::move(*result))); - qcir_mgr.get()->add_procedures(tensor_mgr.get()->get_procedures()); - qcir_mgr.get()->add_procedure("Solovay-Kitaev"); - qcir_mgr.get()->set_filename(tensor_mgr.get()->get_filename()); + qcir_mgr.add_procedures(tensor_mgr.get_procedures()); + qcir_mgr.add_procedure("Solovay-Kitaev"); + qcir_mgr.set_filename(tensor_mgr.get_filename()); } return CmdExecResult::done; }}; } -bool add_conversion_cmds(dvlab::CommandLineInterface& cli, QCirMgr& qcir_mgr, qsyn::tensor::TensorMgr& tensor_mgr, qsyn::zx::ZXGraphMgr& zxgraph_mgr, experimental::TableauMgr& tableau_mgr) { - if (!(cli.add_command(conversion_cmd(qcir_mgr, tensor_mgr, zxgraph_mgr, tableau_mgr)) && +bool add_conversion_cmds(dvlab::CommandLineInterface& cli, + QCirMgr& qcir_mgr, + qsyn::tensor::TensorMgr& tensor_mgr, + qsyn::zx::ZXGraphMgr& zxgraph_mgr, + tableau::TableauMgr& tableau_mgr, + hamiltonian::QubitHamiltonianMgr& qbham_mgr) { + if (!(cli.add_command(conversion_cmd(qcir_mgr, tensor_mgr, zxgraph_mgr, tableau_mgr, qbham_mgr)) && cli.add_command(sk_decompose_cmd(tensor_mgr, qcir_mgr)) && cli.add_alias("qc2zx", "convert qcir zx") && cli.add_alias("qc2ts", "convert qcir tensor") && @@ -341,7 +470,8 @@ bool add_conversion_cmds(dvlab::CommandLineInterface& cli, QCirMgr& qcir_mgr, qs cli.add_alias("zx2qc", "convert zx qcir") && cli.add_alias("ts2qc", "convert tensor qcir") && cli.add_alias("qc2tabl", "convert qcir tableau") && - cli.add_alias("tabl2qc", "convert tableau qcir"))) { + cli.add_alias("tabl2qc", "convert tableau qcir") && + cli.add_alias("qbham2ts", "convert qbham tensor"))) { fmt::println(stderr, "Registering \"conversion\" commands fails... exiting"); return false; } diff --git a/src/cmd/conversion_cmd.hpp b/src/cmd/conversion_cmd.hpp index 940ee82d1..0519a789b 100644 --- a/src/cmd/conversion_cmd.hpp +++ b/src/cmd/conversion_cmd.hpp @@ -11,9 +11,15 @@ #include "cmd/tableau_mgr.hpp" #include "cmd/tensor_mgr.hpp" #include "cmd/zxgraph_mgr.hpp" +#include "cmd/qbham_mgr.hpp" namespace qsyn { -bool add_conversion_cmds(dvlab::CommandLineInterface& cli, qcir::QCirMgr& qcir_mgr, tensor::TensorMgr& tensor_mgr, zx::ZXGraphMgr& zxgraph_mgr, experimental::TableauMgr& tableau_mgr); +bool add_conversion_cmds(dvlab::CommandLineInterface& cli, + qcir::QCirMgr& qcir_mgr, + tensor::TensorMgr& tensor_mgr, + zx::ZXGraphMgr& zxgraph_mgr, + tableau::TableauMgr& tableau_mgr, + hamiltonian::QubitHamiltonianMgr& qbham_mgr); } diff --git a/src/cmd/device_cmd.cpp b/src/cmd/device_cmd.cpp index 414ed71a0..7bb033dab 100644 --- a/src/cmd/device_cmd.cpp +++ b/src/cmd/device_cmd.cpp @@ -7,6 +7,7 @@ #include "./device_cmd.hpp" +#include #include #include @@ -14,8 +15,15 @@ #include "./device_mgr.hpp" #include "device/device.hpp" +#include "device/device_analysis.hpp" +#include "device/ibmq_devices.hpp" +#include "hamiltonian/bonsai.hpp" +#include "hamiltonian/ternary_tree.hpp" #include "qsyn/qsyn_type.hpp" #include "util/data_structure_manager_common_cmd.hpp" +#include "util/spinner.hpp" +#include "util/sysdep.hpp" +#include "util/tmp_files.hpp" using namespace dvlab::argparse; using dvlab::CmdExecResult; @@ -30,45 +38,112 @@ std::function valid_device_id(qsyn::device::DeviceMgr const }; }; -dvlab::Command device_checkout_cmd(qsyn::device::DeviceMgr& device_mgr) { - return {"checkout", - [&device_mgr](ArgumentParser& parser) { - parser.description("checkout to Device in DeviceMgr"); +dvlab::Command device_print_cmd(qsyn::device::DeviceMgr& device_mgr) { + return { + "print", + [](ArgumentParser& parser) { + parser.description("print Device information"); + parser.add_argument("ids") + .nargs(NArgsOption::zero_or_more) + .help( + "if not specified, print basic information about the device;\n" + "if one ID is specified, print information about the qubit with the ID; \n" + "if two IDs are specified, print information about the adjacency between the two qubits." + "An error will be reported if the two qubits are not adjacent."); + parser.add_argument("--centers") + .action(store_true) + .help("print the centers of the device"); + parser.add_argument("--connected-components") + .action(store_true) + .help("print the connected components of the device"); + parser.add_argument("--cost-fn") + .constraint(choices_allow_prefix({"log_success_rate", "default"})) + .default_value("default") + .help("the cost function to use for the Floyd-Warshall algorithm"); + }, + [&device_mgr](ArgumentParser const& parser) { + auto const cost_fn_str = parser.get("--cost-fn"); + auto cost_fn = default_floyd_warshall_cost; + if (dvlab::str::is_prefix_of(dvlab::str::tolower_string(cost_fn_str), "log_success_rate")) { + cost_fn = log_success_rate_floyd_warshall_cost; + } - parser.add_argument("id") - .constraint(valid_device_id(device_mgr)) - .help("the ID of the device"); - }, - [&device_mgr](ArgumentParser const& parser) { - device_mgr.checkout(parser.get("id")); + auto apsp = floyd_warshall(*device_mgr.get(), cost_fn); + if (parser.parsed("--centers")) { + auto const& device = *device_mgr.get(); + auto const connected_components = get_connected_components(apsp, device); + auto const eccentricities = get_eccentricities(apsp, device); + for (size_t c = 0; c < connected_components.size(); ++c) { + auto const& component = connected_components[c]; + auto radius = std::numeric_limits::infinity(); + for (auto q : component) radius = std::min(radius, eccentricities[q]); + std::vector centers; + for (auto q : component) { + if (eccentricities[q] == radius) centers.push_back(q); + } + fmt::println("Component {} (size {}): centers = {}", c, component.size(), centers); + } return CmdExecResult::done; - }}; -} + } -dvlab::Command device_clear_cmd(qsyn::device::DeviceMgr& device_mgr) { - return {"clear", - [](ArgumentParser& parser) { - parser.description("clear DeviceMgr"); - }, - [&device_mgr](ArgumentParser const& /*parser*/) { - device_mgr.clear(); + if (parser.parsed("--connected-components")) { + auto const ids = parser.get>("ids"); + auto const filter_fn = [&](QubitIdType const& qubit_id) { + if (ids.size() == 0) return true; + return dvlab::contains(ids, qubit_id); + }; + + auto const connected_components = + get_connected_components(apsp, *device_mgr.get(), filter_fn); + for (auto const& component : connected_components) { + fmt::println("Component (size {}): [{}]", + component.size(), fmt::join(component, ", ")); + } return CmdExecResult::done; - }}; -} + } -dvlab::Command device_delete_cmd(qsyn::device::DeviceMgr& device_mgr) { - return {"delete", - [&device_mgr](ArgumentParser& parser) { - parser.description("remove a Device from DeviceMgr"); + auto const ids = parser.get>("ids"); - parser.add_argument("id") - .constraint(valid_device_id(device_mgr)) - .help("the ID of the device"); - }, - [&device_mgr](ArgumentParser const& parser) { - device_mgr.remove(parser.get("id")); - return CmdExecResult::done; - }}; + if (ids.size() > 2) { + spdlog::error("Too many qubit IDs specified. Please specify at most two qubit IDs."); + return CmdExecResult::error; + } + + if (ids.size() == 0) { + fmt::println("{}", device_mgr.get()->info_string()); + + } else if (ids.size() == 1) { + auto gate_info = device_mgr.get()->gate_info_string(ids[0]); + if (!gate_info.has_value()) { + spdlog::error("Qubit {} does not exist", ids[0]); + return CmdExecResult::error; + } + fmt::println("{}", gate_info.value()); + } else { + auto gate_info = device_mgr.get()->gate_info_string(Device::QubitPair{ids[0], ids[1]}); + if (!gate_info.has_value()) { + switch (gate_info.error()) { + case TwoQubitGateInfoAccessError::invalid_first_qubit_id: + spdlog::error("Qubit {} does not exist", ids[0]); + return CmdExecResult::error; + case TwoQubitGateInfoAccessError::invalid_second_qubit_id: + spdlog::error("Qubit {} does not exist", ids[1]); + return CmdExecResult::error; + case TwoQubitGateInfoAccessError::invalid_qubit_pair: + fmt::println("({}, {}) is not adjacent", ids[0], ids[1]); + auto const path = get_shortest_path(apsp, ids[0], ids[1]); + if (path.has_value()) { + fmt::println("Shortest path: [{}]", fmt::join(path.value(), ", ")); + } else { + spdlog::error("No path found between {} and {}", ids[0], ids[1]); + } + return CmdExecResult::done; + } + } + fmt::println("{}", gate_info.value()); + } + return CmdExecResult::done; + }}; } dvlab::Command device_read_cmd(qsyn::device::DeviceMgr& device_mgr) { @@ -84,94 +159,184 @@ dvlab::Command device_read_cmd(qsyn::device::DeviceMgr& device_mgr) { .help("if specified, replace the current device; otherwise store to a new one"); }, [&device_mgr](ArgumentParser const& parser) { - qsyn::device::Device buffer_device; auto filepath = parser.get("filepath"); auto replace = parser.get("--replace"); - if (!buffer_device.read_device(filepath)) { + auto device = read_qsyn_device_file(filepath); + + if (!device.has_value()) { spdlog::error("the format in \"{}\" has something wrong!!", filepath); return CmdExecResult::error; } if (device_mgr.empty() || !replace) { - device_mgr.add(device_mgr.get_next_id(), std::make_unique(std::move(buffer_device))); + device_mgr.add(device_mgr.get_next_id(), std::make_unique(std::move(device.value()))); } else { - device_mgr.set(std::make_unique(std::move(buffer_device))); + device_mgr.set(std::make_unique(std::move(device.value()))); } return CmdExecResult::done; }}; } -dvlab::Command device_list_cmd(qsyn::device::DeviceMgr& device_mgr) { - return {"list", - [](ArgumentParser& parser) { - parser.description("list info about Devices"); - }, - [&device_mgr](ArgumentParser const& /* parser */) { - device_mgr.print_list(); - - return CmdExecResult::done; - }}; +dvlab::Command device_bonsai_cmd(qsyn::device::DeviceMgr& device_mgr) { + return { + "bonsai", + [](ArgumentParser& parser) { + parser.description("build and print a Bonsai ternary tree for the current device"); + parser.add_argument("-n", "--n-qubits") + .default_value(std::numeric_limits::max()) + .help("number of qubits in the Bonsai tree. If not specified, all qubits in the device will be used."); + parser.add_argument("-r", "--root-qubit-id") + .help("ID of the qubit to root the tree at. If not specified, a center of the device coupling graph will be the root."); + parser.add_argument("--cost-fn") + .constraint(choices_allow_prefix({"log_success_rate", "default"})) + .default_value("default") + .help("cost function for Floyd-Warshall (used to pick tree center and order)"); + }, + [&device_mgr](ArgumentParser const& parser) { + if (device_mgr.empty()) { + spdlog::error("No device loaded. Read or fetch a device first."); + return CmdExecResult::error; + } + auto const n_qubits = parser.get("--n-qubits"); + auto const cost_fn_str = parser.get("--cost-fn"); + auto cost_fn = default_floyd_warshall_cost; + if (dvlab::str::is_prefix_of(dvlab::str::tolower_string(cost_fn_str), "log_success_rate")) { + cost_fn = log_success_rate_floyd_warshall_cost; + } + auto const apsp = floyd_warshall(*device_mgr.get(), cost_fn); + auto tree = [&]() { + if (parser.parsed("--root-qubit-id")) { + auto const root_qubit_id = parser.get("--root-qubit-id"); + return qsyn::hamiltonian::build_bonsai_ternary_tree( + root_qubit_id, *device_mgr.get(), apsp, n_qubits); + } else { + return qsyn::hamiltonian::build_bonsai_ternary_tree( + *device_mgr.get(), apsp, n_qubits); + } + }(); + if (!tree.has_value()) { + switch (tree.error()) { + case qsyn::hamiltonian::BonsaiFailReason::not_enough_qubits: + spdlog::error("Failed to build Bonsai ternary tree: not enough qubits in the device"); + spdlog::error("(Potentially disconnected device?)"); + return CmdExecResult::error; + case qsyn::hamiltonian::BonsaiFailReason::invalid_root_qubit: + spdlog::error("Failed to build Bonsai ternary tree: invalid root qubit"); + return CmdExecResult::error; + } + return CmdExecResult::error; + } + fmt::println("{}", qsyn::hamiltonian::to_string(tree.value())); + return CmdExecResult::done; + }}; } -dvlab::Command device_print_cmd(qsyn::device::DeviceMgr& device_mgr) { - return {"print", - [](ArgumentParser& parser) { - parser.description("print info of device topology"); - - auto mutex = parser.add_mutually_exclusive_group().required(false); - - mutex.add_argument("-e", "--edges") - .nargs(0, 2) - .help( - "print information of edges. " - "If no qubit ID is specified, print for all edges; " - "if one qubit ID specified, list the adjacent edges to the qubit; " - "if two qubit IDs are specified, list the edge between them"); - - mutex.add_argument("-q", "--qubits") - .nargs(NArgsOption::zero_or_more) - .help( - "print information of qubits. " - "If no qubit ID is specified, print for all qubits;" - "otherwise, print information of the specified qubit IDs"); - - mutex.add_argument("-p", "--path") - .nargs(2) - .metavar("(q1, q2)") - .help( - "print routing paths between q1 and q2"); - }, - [&device_mgr](ArgumentParser const& parser) { - if (!dvlab::utils::mgr_has_data(device_mgr)) return CmdExecResult::error; +dvlab::Command device_fetch_cmd(qsyn::device::DeviceMgr& device_mgr) { + return { + "fetch", [](ArgumentParser& parser) { + parser.description( + "fetch and create a device. Currently only supports " + "IBM backends. This command tries to retrieve the device " + "by connecting to the IBM Quantum Platform. An " + "`IBMQ_API_KEY` needs to be set in the `.env` file. If the " + "backend is not found, this command will try to retrieve " + "cached attributes from " + "`~/.config/qsyn/cached_backend_attrs/`, saved by previous " + "calls to this command. If that fails, the command will try " + "to use a fake backend. If that still fails, the command " + "gives up and returns an error."); - if (parser.parsed("--edges")) { - device_mgr.get()->print_edges(parser.get>("--edges")); - return CmdExecResult::done; - } - if (parser.parsed("--qubits")) { - device_mgr.get()->print_qubits(parser.get>("--qubits")); - return CmdExecResult::done; - } - if (parser.parsed("--path")) { - auto qids = parser.get>("--path"); - device_mgr.get()->print_path(qids[0], qids[1]); - return CmdExecResult::done; + parser.add_argument("backend") + .help( + "the name of the IBM backend to fetch. This function " + "tries to normalize the backend to the format expected by " + "the IBM Quantum Platform/Qiskit. For example, `fez` will " + "be normalized to `ibm_fez` or `fake_fez`."); + + parser.add_argument("-f", "--fake") + .action(store_true) + .help( + "Only use fake backend. Note that fake backends will " + "not be cached."); + + parser.add_argument("-c", "--cached") + .action(store_true) + .help( + "Use cached backend if available; only fetch if " + "a cached backend is not available. This flag is " + "ignored if `--fake` is specified."); }, + [&device_mgr](ArgumentParser const& parser) { + (void)device_mgr; // reserved for device loading when hooked up + auto const backend_name = parser.get("backend"); + auto const fake = parser.get("--fake"); + auto const cached = parser.get("--cached"); + + auto const home_dir = dvlab::utils::get_home_directory(); + if (!home_dir) { + spdlog::error("Cannot find home directory"); + return CmdExecResult::error; + } + // set the cached directory. using make_optional to avoid copying + auto const cached_dir = std::make_optional(( + std::filesystem::path(home_dir.value()) / + ".config/qsyn/cached_backend_attrs/")); + + auto const result = dvlab::utils::with_spinner( + [&]() { + return fetch_ibmq_device_attrs_with_fallback( + backend_name, fake, cached, cached_dir); + }, + "Fetching IBM backend attributes..."); + + if (!result) { + spdlog::error("Failed to fetch IBM backend attributes for {}", backend_name); + + if (fake) { + fmt::println("Please provide a valid fake backend name (e.g., fake_manila, fake_oslo)"); + } else { + dvlab::utils::uv_run_script("scripts/get_ibm_backend_attrs.py", {backend_name, "--print-available-backends"}); + fmt::println("Alternatively, fetch fake backends (e.g., fake_manila, fake_oslo) by specifying the -f/--fake flag."); } + fmt::println("Available fake backends can be found at:"); + fmt::println("https://docs.quantum.ibm.com/api/qiskit-ibm-runtime/fake_provider"); + return CmdExecResult::error; + } - device_mgr.get()->print_topology(); - return CmdExecResult::done; - }}; + if (result->source == IBMQDeviceJsonsSource::cached && !cached) { + spdlog::warn( + "Failed to fetch real backend attributes for {}. " + "Using cached backend attributes instead...", + backend_name); + } + + if (result->source == IBMQDeviceJsonsSource::fake && !fake) { + spdlog::warn( + "Failed to fetch real backend attributes for {}. " + "Using fake backend attributes instead...", + backend_name); + } + + auto device = read_ibmq_device(result.value()); + if (!device.has_value()) { + spdlog::error("Failed to parse IBM backend attributes for {}", backend_name); + return CmdExecResult::error; + } + device_mgr.add(device_mgr.get_next_id(), std::make_unique(std::move(device.value()))); + + return CmdExecResult::done; + }}; } dvlab::Command device_cmd(qsyn::device::DeviceMgr& device_mgr) { auto cmd = dvlab::utils::mgr_root_cmd(device_mgr); - // print functions cmd.add_subcommand("device-cmd-group", dvlab::utils::mgr_list_cmd(device_mgr)); cmd.add_subcommand("device-cmd-group", device_print_cmd(device_mgr)); - cmd.add_subcommand("device-cmd-group", device_checkout_cmd(device_mgr)); + cmd.add_subcommand("device-cmd-group", device_bonsai_cmd(device_mgr)); + cmd.add_subcommand("device-cmd-group", dvlab::utils::mgr_checkout_cmd(device_mgr)); cmd.add_subcommand("device-cmd-group", device_read_cmd(device_mgr)); + cmd.add_subcommand("device-cmd-group", device_fetch_cmd(device_mgr)); cmd.add_subcommand("device-cmd-group", dvlab::utils::mgr_delete_cmd(device_mgr)); return cmd; } diff --git a/src/cmd/device_mgr.hpp b/src/cmd/device_mgr.hpp index 69f928857..b0f81ff19 100644 --- a/src/cmd/device_mgr.hpp +++ b/src/cmd/device_mgr.hpp @@ -21,13 +21,17 @@ using DeviceMgr = dvlab::utils::DataStructureManager; } // namespace qsyn::device template <> -inline std::string dvlab::utils::data_structure_info_string(qsyn::device::Device const& t) { +inline std::string dvlab::utils::data_structure_info_string(dvlab::utils::DataStructureManager const& mgr, size_t id) { + auto* device = mgr.find_by_id(id); + if (!device) return {}; return fmt::format("{:<19} #Q: {:>4}", - t.get_name().substr(0, 19), // NOLINT(cppcoreguidelines-avoid-magic-numbers) - t.get_num_qubits()); + device->get_name().substr(0, 19), // NOLINT(cppcoreguidelines-avoid-magic-numbers) + device->get_num_qubits()); } template <> -inline std::string dvlab::utils::data_structure_name(qsyn::device::Device const& t) { - return t.get_name(); +inline std::string dvlab::utils::data_structure_name(dvlab::utils::DataStructureManager const& mgr, size_t id) { + auto* device = mgr.find_by_id(id); + if (!device) return {}; + return device->get_name(); } diff --git a/src/cmd/duostra_cmd.cpp b/src/cmd/duostra_cmd.cpp index 9fe321199..5e56f81f5 100644 --- a/src/cmd/duostra_cmd.cpp +++ b/src/cmd/duostra_cmd.cpp @@ -9,7 +9,9 @@ #include #include +#include #include +#include #include #include "cli/cli.hpp" @@ -213,7 +215,7 @@ Command mapping_equivalence_check_cmd(qcir::QCirMgr& qcir_mgr, device::DeviceMgr if (physical_qc == nullptr || logical_qc == nullptr) { return CmdExecResult::error; } - MappingEquivalenceChecker mpeqc(physical_qc, logical_qc, *device_mgr.get(), DUOSTRA_CONFIG.placer_type, {}); + MappingEquivalenceChecker mpeqc(physical_qc, logical_qc, qsyn::duostra::DeviceState(*device_mgr.get()), DUOSTRA_CONFIG.placer_type, {}); if (mpeqc.check()) { fmt::println("{}", styled_if_ansi_supported("Equivalent up to permutation", fmt::fg(fmt::terminal_color::green) | fmt::emphasis::bold)); } else { @@ -256,8 +258,10 @@ Command duostra_cmd(qcir::QCirMgr& qcir_mgr, device::DeviceMgr& device_mgr) { // } // #endif qcir::QCir* logical_qcir = qcir_mgr.get(); + auto filename = qcir_mgr.get_filename(); + auto procedures = qcir_mgr.get_procedures(); Duostra duo{logical_qcir, - *device_mgr.get(), + qsyn::duostra::DeviceState(*device_mgr.get()), DUOSTRA_CONFIG, {.verify_result = parser.get("--check"), .silent = parser.get("--silent"), @@ -272,9 +276,9 @@ Command duostra_cmd(qcir::QCirMgr& qcir_mgr, device::DeviceMgr& device_mgr) { auto const id = qcir_mgr.get_next_id(); qcir_mgr.add(id, std::move(duo.get_physical_circuit())); - qcir_mgr.get()->set_filename(logical_qcir->get_filename()); - qcir_mgr.get()->add_procedures(logical_qcir->get_procedures()); - qcir_mgr.get()->add_procedure("Duostra"); + qcir_mgr.set_filename(filename); + qcir_mgr.add_procedures(procedures); + qcir_mgr.add_procedure("Duostra"); return CmdExecResult::done; }}; diff --git a/src/cmd/fham_cmd.cpp b/src/cmd/fham_cmd.cpp new file mode 100644 index 000000000..520f3a3a9 --- /dev/null +++ b/src/cmd/fham_cmd.cpp @@ -0,0 +1,297 @@ +/**************************************************************************** + PackageName [ hamiltonian ] + Synopsis [ Define fermionic Hamiltonian commands ] + Author [ Design Verification Lab ] +****************************************************************************/ + +#include "./fham_cmd.hpp" + +#include +#include + +#include "argparse/arg_parser.hpp" +#include "cli/cli.hpp" +#include "cmd/device_mgr.hpp" +#include "cmd/fham_mgr.hpp" +#include "hamiltonian/f2q_mappings.hpp" +#include "hamiltonian/fermionic_hamiltonian.hpp" +#include "hamiltonian/qubit_hamiltonian.hpp" +#include "hamiltonian/treespile.hpp" +#include "qcir/qcir.hpp" +#include "util/data_structure_manager_common_cmd.hpp" +#include "hamiltonian/ternary_tree.hpp" +#include "hamiltonian/bonsai.hpp" +#include "device/device_analysis.hpp" + +using namespace dvlab::argparse; + +namespace qsyn::hamiltonian { + +namespace { + +dvlab::Command fham_read_cmd(FermionHamiltonianMgr& fham_mgr) { + return dvlab::Command( + "read", + [](ArgumentParser& parser) { + parser.description("Read a fermionic Hamiltonian from a text file"); + + parser.add_argument("filepath") + .help( + "The path to the input file. " + "File format: '(re, im) ops' per line, e.g. '(0.5, 0.5) 0^ 1'"); + }, + [&](ArgumentParser const& parser) { + auto const filepath = std::filesystem::path(parser.get("filepath")); + + auto ferm_opt = read_fermionic_hamiltonian(filepath); + if (!ferm_opt.has_value()) { + return dvlab::CmdExecResult::error; + } + + size_t new_id = fham_mgr.get_next_id(); + fham_mgr.add(new_id, std::make_unique(std::move(*ferm_opt))); + fham_mgr.set_filename(std::filesystem::path{filepath}.stem().string()); + + return dvlab::CmdExecResult::done; + }); +} + +dvlab::Command fham_qubitize_cmd(FermionHamiltonianMgr& fham_mgr, QubitHamiltonianMgr& qbham_mgr, device::DeviceMgr& device_mgr) { + return dvlab::Command( + "qubitize", + [](ArgumentParser& parser) { + parser.description( + "Transform the focused fermionic Hamiltonian to a qubit Hamiltonian"); + + parser.add_argument("-s", "--strategy") + .default_value("jw") + .constraint(choices_allow_prefix({"jw", "ternary_tree"})) + .help("Fermion-to-qubit mapping strategy: 'jw' (Jordan-Wigner, default) or 'ternary_tree'"); + + parser.add_argument("-o", "--optimize") + .action(store_true) + .help("Run simulated annealing to minimize Pauli weight (only applies to ternary_tree strategy)"); + }, + [&](ArgumentParser const& parser) { + if (!dvlab::utils::mgr_has_data(fham_mgr)) { + return dvlab::CmdExecResult::error; + } + + auto const* f_ham = fham_mgr.get(); + + auto const strategy = parser.get("--strategy"); + bool optimize = parser.get("--optimize"); + + QubitHamiltonian q_ham = [&]() { + if (strategy == "jw") { + return qubitize(*f_ham, JordanWignerMapping{f_ham->n_modes()}); + } + + // strategy == "ternary_tree" + std::optional initial_tree = std::nullopt; + device::Device const* dev_ptr = nullptr; + + if (!device_mgr.empty()) { + dev_ptr = device_mgr.get(); + if (dev_ptr->get_num_qubits() < f_ham->n_modes()) { + fmt::println("Warning: Device ({} qubits) is too small for Hamiltonian ({} modes).", dev_ptr->get_num_qubits(), f_ham->n_modes()); + fmt::println("Using standard ternary tree..."); + dev_ptr = nullptr; + } else { + fmt::println("Using device topology to build ternary tree."); + + auto apsp = device::floyd_warshall(*dev_ptr, device::default_floyd_warshall_cost); + auto tree_result = build_bonsai_ternary_tree(*dev_ptr, apsp, f_ham->n_modes()); + + if (tree_result.has_value()) { + initial_tree = std::move(tree_result.value()); + } else { + spdlog::warn("Failed to build Bonsai tree (device too small/disconnected?). Using standard ternary tree."); + } + } + } + + if (!initial_tree.has_value()) { + if (device_mgr.empty()) { + fmt::println("No device. Using standard ternary tree."); + } + initial_tree = TernaryTree(f_ham->n_modes()); + } + TernaryTree tree = std::move(initial_tree.value()); + + if (optimize) { + fmt::println("Optimizing ternary tree mapping to minimize Pauli weight..."); + device::Device const* dev_ptr = device_mgr.empty() ? nullptr : device_mgr.get(); + + tree = optimize_mapping(tree, *f_ham, dev_ptr); + } + return qubitize(*f_ham, TernaryTreeMapping{std::move(tree)}); + }(); + + size_t id = qbham_mgr.get_next_id(); + qbham_mgr.add(id, std::make_unique(std::move(q_ham))); + qbham_mgr.set_filename(fham_mgr.get_filename()); + qbham_mgr.add_procedures(fham_mgr.get_procedures()); + + std::string proc_name = strategy == "ternary_tree" ? "fham_qubitize_ternary_tree" : "fham_qubitize_jw"; + if (strategy == "ternary_tree" && optimize) proc_name += "_optimized"; + qbham_mgr.add_procedure(proc_name); + + fmt::println("Transformed focused fermionic Hamiltonian to QubitHamiltonian with ID: {}", id); + + return dvlab::CmdExecResult::done; + }); +} + +} // namespace + +namespace { + +dvlab::Command fham_print_cmd(FermionHamiltonianMgr const& fham_mgr) { + return dvlab::Command{ + "print", + [](ArgumentParser& parser) { + parser.description("Print the focused fermionic Hamiltonian"); + }, + [&](ArgumentParser const& /*parser*/) { + if (!dvlab::utils::mgr_has_data(fham_mgr)) { + return dvlab::CmdExecResult::error; + } + + auto const* f_ham = fham_mgr.get(); + fmt::println("Fermionic Hamiltonian ({} modes, {} terms)", + f_ham->n_modes(), + f_ham->get_terms().size()); + + auto const& terms = f_ham->get_terms(); + for (std::size_t i = 0; i < terms.size(); ++i) { + auto const& [coeff, ops] = terms[i]; + fmt::print(" Term {}: ({}, {}) ", i, coeff.real(), coeff.imag()); + for (auto const& [mode, is_creation] : ops) { + fmt::print("{}{}", mode, is_creation ? "^ " : " "); + } + fmt::println(""); + } + + return dvlab::CmdExecResult::done; + }}; +} + +dvlab::Command fham_treespile_cmd( + device::DeviceMgr& device_mgr, + FermionHamiltonianMgr& fham_mgr, + qcir::QCirMgr& qcir_mgr) { + return dvlab::Command( + "treespile", + [](ArgumentParser& parser) { + parser.description( + "Apply treespile mapping from the focused fermionic Hamiltonian on the currently loaded device"); + parser.add_argument("time") + .help("Time for the Hamiltonian to evolve for"); + parser.add_argument("n-steps") + .help("Number of trotterization steps to apply"); + parser.add_argument("--cost-fn") + .constraint(choices_allow_prefix({"log_success_rate", "default"})) + .default_value("default") + .help("cost function for Floyd-Warshall used inside treespile"); + parser.add_argument("-o", "--optimize") + .action(store_true) + .help("Run simulated annealing to minimize Pauli weight"); + }, + [&](ArgumentParser const& parser) { + if (device_mgr.empty()) { + spdlog::error("No device loaded. Read or fetch a device first."); + return dvlab::CmdExecResult::error; + } + + if (!dvlab::utils::mgr_has_data(fham_mgr)) { + spdlog::error("No fermionic Hamiltonian loaded. Read or create one first."); + return dvlab::CmdExecResult::error; + } + + auto const& device = *device_mgr.get(); + auto const* f_ham = fham_mgr.get(); + + auto const n_steps = parser.get("n-steps"); + if (n_steps == 0) { + spdlog::error("Number of trotterization steps must be greater than 0"); + return dvlab::CmdExecResult::error; + } + + auto const time = parser.get("time"); + auto const cost_fn_str = parser.get("--cost-fn"); + bool optimize = parser.get("--optimize"); + auto cost_fn = device::default_floyd_warshall_cost; + if (dvlab::str::is_prefix_of(dvlab::str::tolower_string(cost_fn_str), "log_success_rate")) { + cost_fn = device::log_success_rate_floyd_warshall_cost; + } + + auto const result = treespile(*f_ham, device, time, n_steps, cost_fn, optimize); + + if (!result.has_value()) { + auto const reason = result.error(); + switch (reason) { + case TreespileFailReason::empty_hamiltonian: + spdlog::error("treespile failed: empty Hamiltonian"); + break; + case TreespileFailReason::device_too_small: + spdlog::error("treespile failed: device too small"); + break; + case TreespileFailReason::tt_build_failed_not_enough_qubits: + spdlog::error("treespile failed: could not build ternary tree (not enough qubits / disconnected)"); + break; + case TreespileFailReason::invalid_n_trotterization_steps: + spdlog::error("treespile failed: invalid number of trotterization steps"); + break; + } + return dvlab::CmdExecResult::error; + } + + auto circuit = result.value(); + auto const new_id = qcir_mgr.get_next_id(); + + qcir_mgr.add(new_id, std::make_unique(std::move(circuit))); + qcir_mgr.set_filename(fham_mgr.get_filename()); + qcir_mgr.add_procedures(fham_mgr.get_procedures()); + qcir_mgr.add_procedure("fham_treespile"); + + return dvlab::CmdExecResult::done; + }); +} + +} // namespace + +dvlab::Command fham_cmd( + FermionHamiltonianMgr& fham_mgr, + QubitHamiltonianMgr& qbham_mgr, + qcir::QCirMgr& qcir_mgr, + device::DeviceMgr& device_mgr) { + auto cmd = dvlab::utils::mgr_root_cmd(fham_mgr); + + cmd.add_subcommand("fham-cmd-group", dvlab::utils::mgr_list_cmd(fham_mgr)); + cmd.add_subcommand("fham-cmd-group", dvlab::utils::mgr_delete_cmd(fham_mgr)); + cmd.add_subcommand("fham-cmd-group", dvlab::utils::mgr_checkout_cmd(fham_mgr)); + cmd.add_subcommand("fham-cmd-group", dvlab::utils::mgr_copy_cmd(fham_mgr)); + cmd.add_subcommand("fham-cmd-group", fham_read_cmd(fham_mgr)); + cmd.add_subcommand("fham-cmd-group", fham_qubitize_cmd(fham_mgr, qbham_mgr, device_mgr)); + cmd.add_subcommand("fham-cmd-group", fham_treespile_cmd(device_mgr, fham_mgr, qcir_mgr)); + cmd.add_subcommand("fham-cmd-group", fham_print_cmd(fham_mgr)); + + return cmd; +} + +bool add_fham_cmds( + dvlab::CommandLineInterface& cli, + FermionHamiltonianMgr& fham_mgr, + QubitHamiltonianMgr& qbham_mgr, + qcir::QCirMgr& qcir_mgr, + device::DeviceMgr& device_mgr) { + if (!cli.add_command(fham_cmd(fham_mgr, qbham_mgr, qcir_mgr, device_mgr))) { + spdlog::error("Registering \"fham\" commands fails... exiting"); + return false; + } + + return true; +} + +} // namespace qsyn::hamiltonian diff --git a/src/cmd/fham_cmd.hpp b/src/cmd/fham_cmd.hpp new file mode 100644 index 000000000..ef0ed7821 --- /dev/null +++ b/src/cmd/fham_cmd.hpp @@ -0,0 +1,31 @@ +/**************************************************************************** + PackageName [ hamiltonian ] + Synopsis [ Define fermionic Hamiltonian commands ] + Author [ Design Verification Lab ] +****************************************************************************/ + +#pragma once + +#include "cli/cli.hpp" +#include "cmd/device_mgr.hpp" +#include "cmd/fham_mgr.hpp" +#include "cmd/qbham_mgr.hpp" +#include "cmd/qcir_mgr.hpp" + +namespace qsyn::hamiltonian { + +dvlab::Command fham_cmd( + FermionHamiltonianMgr& fham_mgr, + QubitHamiltonianMgr& qbham_mgr, + qcir::QCirMgr& qcir_mgr, + device::DeviceMgr& device_mgr); + +bool add_fham_cmds( + dvlab::CommandLineInterface& cli, + FermionHamiltonianMgr& fham_mgr, + QubitHamiltonianMgr& qbham_mgr, + qcir::QCirMgr& qcir_mgr, + device::DeviceMgr& device_mgr); + +} // namespace qsyn::hamiltonian + diff --git a/src/cmd/fham_mgr.hpp b/src/cmd/fham_mgr.hpp new file mode 100644 index 000000000..bb7ba1289 --- /dev/null +++ b/src/cmd/fham_mgr.hpp @@ -0,0 +1,32 @@ +/**************************************************************************** + PackageName [ hamiltonian ] + Synopsis [ Define class FermionHamiltonian manager structure ] + Author [ Design Verification Lab ] +****************************************************************************/ + +#pragma once + +#include "hamiltonian/fermionic_hamiltonian.hpp" +#include "util/data_structure_manager.hpp" + +namespace qsyn::hamiltonian { + +using FermionHamiltonianMgr = dvlab::utils::DataStructureManager; + +} // namespace qsyn::hamiltonian + +template <> +inline std::string dvlab::utils::data_structure_info_string( + dvlab::utils::DataStructureManager const& mgr, size_t id) { + return fmt::format( + "{:<19} {}", + mgr.get_filename(id).substr(0, 19), + fmt::join(mgr.get_procedures(id), " ➔ ")); +} + +template <> +inline std::string dvlab::utils::data_structure_name( + dvlab::utils::DataStructureManager const& mgr, size_t id) { + return mgr.get_filename(id); +} + diff --git a/src/cmd/qbham/ferm_to_qubit.cpp b/src/cmd/qbham/ferm_to_qubit.cpp new file mode 100644 index 000000000..1a188fd19 --- /dev/null +++ b/src/cmd/qbham/ferm_to_qubit.cpp @@ -0,0 +1,86 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Implement command to lower fermionic hamiltonian to qubit hamiltonian ] + Author [ April Wang (april864) ] +*/ + +#include "./ferm_to_qubit.hpp" + +#include + +#include "cmd/device_mgr.hpp" +#include "hamiltonian/f2q_mappings.hpp" +#include "hamiltonian/fermionic_hamiltonian.hpp" +#include "hamiltonian/treespile.hpp" + +using namespace dvlab::argparse; + +namespace qsyn::hamiltonian { + +dvlab::Command qbham_jw_cmd(QubitHamiltonianMgr& qbham_mgr) { + return dvlab::Command( + "jw", + [](ArgumentParser& parser) { + parser.description( + "Transform fermionic Hamiltonian to qubit Hamiltonian " + "using Jordan-Wigner. Currently testing with a hard-coded fermionic Hamiltonian"); + }, + [&](ArgumentParser const& /*parser*/) { + // Hard coded fermionic Hamiltonians: + // fmt::println("Fermionic Hamiltonian: a0^ a1 + a1^ a0"); + // FermionHamiltonian f_ham(2); + // f_ham.add_term(1.0, {{0, true}, {1, false}}); + // f_ham.add_term(1.0, {{1, true}, {0, false}}); + + // fmt::println("Fermionic Hamiltonian: a_5^ a_5"); + // FermionHamiltonian f_ham(6); + // f_ham.add_term(1.0, {{5, true}, {5, false}}); + + fmt::println("Fermionic Hamiltonian: a0^ a2 + a2^ a0"); + FermionHamiltonian f_ham(3); + f_ham.add_term(1.0, {{0, true}, {2, false}}); + f_ham.add_term(1.0, {{2, true}, {0, false}}); + + // JW transformation + QubitHamiltonian q_ham = qubitize(f_ham, JordanWignerMapping{f_ham.n_modes()}); + + size_t id = qbham_mgr.get_next_id(); + qbham_mgr.add(id, std::make_unique(std::move(q_ham))); + + fmt::println("Transformed to QubitHamiltonian with ID: {}", id); + return dvlab::CmdExecResult::done; + }); +} + +dvlab::Command qbham_ternary_tree_cmd(QubitHamiltonianMgr& qbham_mgr) { + return dvlab::Command( + "ternary_tree", + [](ArgumentParser& parser) { + parser.description( + "Transform fermionic Hamiltonian to qubit Hamiltonian " + "using ternary tree mapping. Currently testing with a hard-coded fermionic Hamiltonian"); + }, + [&](ArgumentParser const& /*parser*/) { + // Hard coded fermionic Hamiltonians: + fmt::println("Fermionic Hamiltonian: a0^ a9 + a9^ a0"); + FermionHamiltonian f_ham(11); + f_ham.add_term(1.0, {{0, true}, {9, false}}); + f_ham.add_term(1.0, {{9, true}, {0, false}}); + + // fmt::println("Fermionic Hamiltonian: a0^ a2 + a2^ a0"); + // FermionHamiltonian f_ham(3); + // f_ham.add_term(1.0, {{0, true}, {2, false}}); + // f_ham.add_term(1.0, {{2, true}, {0, false}}); + + // Ternary tree transformation + QubitHamiltonian q_ham = qubitize(f_ham, TernaryTreeMapping{f_ham.n_modes()}); + + size_t id = qbham_mgr.get_next_id(); + qbham_mgr.add(id, std::make_unique(std::move(q_ham))); + + fmt::println("Transformed to QubitHamiltonian with ID: {}", id); + return dvlab::CmdExecResult::done; + }); +} + +} // namespace qsyn::hamiltonian diff --git a/src/cmd/qbham/ferm_to_qubit.hpp b/src/cmd/qbham/ferm_to_qubit.hpp new file mode 100644 index 000000000..1661605a9 --- /dev/null +++ b/src/cmd/qbham/ferm_to_qubit.hpp @@ -0,0 +1,19 @@ +/** + PackageName [ hamiltonian ] + Synopsis [ Define command to lower fermionic hamiltonian to qubit hamiltonian ] + Author [ April Wang (april864) ] +*/ + +#pragma once + +#include "cli/cli.hpp" +#include "cmd/device_mgr.hpp" +#include "cmd/qbham_mgr.hpp" + +namespace qsyn::hamiltonian { + +dvlab::Command qbham_jw_cmd(QubitHamiltonianMgr& qbham_mgr); + +dvlab::Command qbham_ternary_tree_cmd(QubitHamiltonianMgr& qbham_mgr); + +} // namespace qsyn::hamiltonian diff --git a/src/cmd/qbham/read.cpp b/src/cmd/qbham/read.cpp new file mode 100644 index 000000000..c9a61a23a --- /dev/null +++ b/src/cmd/qbham/read.cpp @@ -0,0 +1,52 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Implement command to read hamiltonian from file ] + Author [ April Wang (april864) ] +*/ + +#include "./read.hpp" + +#include +#include + +#include "hamiltonian/qubit_hamiltonian.hpp" + +using namespace dvlab::argparse; +using dvlab::CmdExecResult; +using dvlab::Command; + +namespace qsyn::hamiltonian { + +dvlab::Command qbham_read_cmd(QubitHamiltonianMgr& qbham_mgr) { + return Command( + "read", + [](ArgumentParser& parser) { + parser.description("Read a hamiltonian from a text file"); + + parser.add_argument("filepath") + .help( + "The path to the input file. " + "File format must be: 'Coefficient PauliString' per line."); + }, + [&](ArgumentParser const& parser) { + auto const filepath = std::filesystem::path(parser.get("filepath")); + + auto hamilt = read_qubit_hamiltonian(filepath); + if (!hamilt.has_value()) { + return CmdExecResult::error; + } + + size_t new_id = qbham_mgr.get_next_id(); + + auto hamilt_ptr = std::make_unique(std::move(*hamilt)); + qbham_mgr.add(new_id, std::move(hamilt_ptr)); + + qbham_mgr.checkout(new_id); + + qbham_mgr.set_filename(filepath.string()); + + return CmdExecResult::done; + }); +} + +} // namespace qsyn::hamiltonian diff --git a/src/cmd/qbham/read.hpp b/src/cmd/qbham/read.hpp new file mode 100644 index 000000000..38b55230a --- /dev/null +++ b/src/cmd/qbham/read.hpp @@ -0,0 +1,16 @@ +/** + PackageName [ hamiltonian ] + Synopsis [ Define command to read hamiltonian from file ] + Author [ April Wang (april864) ] +*/ + +#pragma once + +#include "cli/cli.hpp" +#include "cmd/qbham_mgr.hpp" + +namespace qsyn::hamiltonian { + +dvlab::Command qbham_read_cmd(QubitHamiltonianMgr& qbham_mgr); + +} // namespace qsyn::hamiltonian diff --git a/src/cmd/qbham/sort.cpp b/src/cmd/qbham/sort.cpp new file mode 100644 index 000000000..d6f4fb842 --- /dev/null +++ b/src/cmd/qbham/sort.cpp @@ -0,0 +1,63 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Implement hamiltonian test commands ] + Author [ Mu-Te Lau (joshmtlau) ] +*/ + +#include "./sort.hpp" + +#include "hamiltonian/qbham_transformations.hpp" +#include "hamiltonian/qubit_hamiltonian.hpp" +#include "util/data_structure_manager_common_cmd.hpp" + +using namespace dvlab::argparse; +using dvlab::CmdExecResult; +using dvlab::Command; + +namespace qsyn::hamiltonian { + +dvlab::Command qbham_sort_cmd(QubitHamiltonianMgr const& qbham_mgr) { + return Command( + "sort", + [](ArgumentParser& parser) { + parser.description("Sort the hamiltonian"); + + parser.add_argument("strategy") + .help( + "The sorting strategy to use. " + "Currently, only 'lex' and 'magnitude' are supported.") + .constraint(choices_allow_prefix({"lex", "magnitude"})); + + parser.add_argument("--order") + .help( + "The order of the Pauli terms for the `lex` strategy. " + "Case-sensitive. Must contains all characters in 'xyzi' exactly once." + "Default is 'xyzi'. This option is ignored for other strategies.") + .default_value("xyzi") + .constraint(is_valid_pauli_letter_order); + }, + [&](ArgumentParser const& parser) { + if (!dvlab::utils::mgr_has_data(qbham_mgr)) { + return CmdExecResult::error; + } + + fmt::println("Hamiltonian before sorting:\n{}", + qbham_mgr.get()->to_string()); + + auto const strategy = parser.get("strategy"); + auto const order_str = parser.get("--order"); + + if (dvlab::str::is_prefix_of(strategy, "lex")) { + lexicographic_sort(*qbham_mgr.get(), order_str); + } else if (dvlab::str::is_prefix_of(strategy, "magnitude")) { + magnitude_sort(*qbham_mgr.get()); + } + + fmt::println("Hamiltonian after sorting:\n{}", + qbham_mgr.get()->to_string()); + + return CmdExecResult::done; + }); +} + +} // namespace qsyn::hamiltonian diff --git a/src/cmd/qbham/sort.hpp b/src/cmd/qbham/sort.hpp new file mode 100644 index 000000000..a2696f20a --- /dev/null +++ b/src/cmd/qbham/sort.hpp @@ -0,0 +1,16 @@ +/** + PackageName [ hamiltonian ] + Synopsis [ Define hamiltonian test commands ] + Author [ Mu-Te Lau (joshmtlau) ] +*/ + +#pragma once + +#include "cli/cli.hpp" +#include "cmd/qbham_mgr.hpp" + +namespace qsyn::hamiltonian { + +dvlab::Command qbham_sort_cmd(QubitHamiltonianMgr const& qbham_mgr); + +} // namespace qsyn::hamiltonian diff --git a/src/cmd/qbham/trotterize.cpp b/src/cmd/qbham/trotterize.cpp new file mode 100644 index 000000000..66a6cc69f --- /dev/null +++ b/src/cmd/qbham/trotterize.cpp @@ -0,0 +1,56 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Implement hamiltonian test commands ] + Author [ Mu-Te Lau (joshmtlau) ] +*/ + +#include "./trotterize.hpp" + +#include + +#include "hamiltonian/qubit_hamiltonian.hpp" +#include "hamiltonian/trotterize.hpp" +#include "tableau/tableau.hpp" +#include "util/data_structure_manager_common_cmd.hpp" + +using namespace dvlab::argparse; +using dvlab::CmdExecResult; +using dvlab::Command; + +namespace qsyn::hamiltonian { + +dvlab::Command qbham_trotterize_cmd(QubitHamiltonianMgr const& qbham_mgr, tableau::TableauMgr& tableau_mgr) { + return Command( + "trotterize", + [](ArgumentParser& parser) { + parser.description("Trotterize the focused Hamiltonian"); + + parser.add_argument("time") + .help("Time to trotterize for"); + + parser.add_argument("n-steps") + .help("Number of steps to trotterize for"); + }, + [&](ArgumentParser const& parser) { + if (!dvlab::utils::mgr_has_data(qbham_mgr)) { + return CmdExecResult::error; + } + + auto const* hamiltonian = qbham_mgr.get(); + + auto time = parser.get("time"); + auto n_steps = parser.get("n-steps"); + + spdlog::info("Trotterizing Hamiltonian. Steps: {}, Time: {}", n_steps, time); + auto prtabl = trotterize(*hamiltonian, time, n_steps); + + // Add the trotterization result as a tableau + auto const tableau_id = tableau_mgr.get_next_id(); + tableau_mgr.add(tableau_id, std::make_unique(std::initializer_list{prtabl})); + spdlog::info("Added Trotterization result to Tableau {}", tableau_id); + + return CmdExecResult::done; + }); +} + +} // namespace qsyn::hamiltonian diff --git a/src/cmd/qbham/trotterize.hpp b/src/cmd/qbham/trotterize.hpp new file mode 100644 index 000000000..86e273a36 --- /dev/null +++ b/src/cmd/qbham/trotterize.hpp @@ -0,0 +1,17 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Define hamiltonian test commands ] + Author [ Mu-Te Lau (joshmtlau) ] +*/ + +#pragma once + +#include "cli/cli.hpp" +#include "cmd/qbham_mgr.hpp" +#include "cmd/tableau_mgr.hpp" + +namespace qsyn::hamiltonian { + +dvlab::Command qbham_trotterize_cmd(QubitHamiltonianMgr const& qbham_mgr, tableau::TableauMgr& tableau_mgr); + +} // namespace qsyn::hamiltonian diff --git a/src/cmd/qbham_cmd.cpp b/src/cmd/qbham_cmd.cpp new file mode 100644 index 000000000..0350c7d48 --- /dev/null +++ b/src/cmd/qbham_cmd.cpp @@ -0,0 +1,77 @@ +/**************************************************************************** + PackageName [ hamiltonian ] + Synopsis [ Define hamiltonian commands ] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#include "./qbham_cmd.hpp" + +#include + +#include "argparse/arg_parser.hpp" +#include "cli/cli.hpp" +#include "cmd/device_mgr.hpp" +#include "cmd/qbham/ferm_to_qubit.hpp" +#include "cmd/qbham/read.hpp" +#include "cmd/qbham/sort.hpp" +#include "cmd/qbham/trotterize.hpp" +#include "cmd/qbham_mgr.hpp" +#include "cmd/tableau_mgr.hpp" +#include "hamiltonian/qubit_hamiltonian.hpp" +#include "util/data_structure_manager_common_cmd.hpp" + +using namespace dvlab::argparse; + +namespace qsyn::hamiltonian { + +dvlab::Command qbham_print_cmd(QubitHamiltonianMgr const& qbham_mgr) { + return dvlab::Command{ + "print", + [](ArgumentParser& parser) { + parser.description("Print the hamiltonian"); + }, + [&](ArgumentParser const& /* parser */) { + if (!dvlab::utils::mgr_has_data(qbham_mgr)) { + return dvlab::CmdExecResult::error; + } + + fmt::println("Qubit Hamiltonian ({} qubits, {} terms)", + qbham_mgr.get()->n_qubits(), + qbham_mgr.get()->n_terms()); + fmt::println("{}", qbham_mgr.get()->to_string()); + + return dvlab::CmdExecResult::done; + }}; +} + +dvlab::Command qbham_cmd(device::DeviceMgr& device_mgr, QubitHamiltonianMgr& qbham_mgr, tableau::TableauMgr& tableau_mgr) { + (void)device_mgr; // reserved for future qbham commands that need a device + auto cmd = dvlab::utils::mgr_root_cmd(qbham_mgr); + + cmd.add_subcommand("qbham-cmd-group", dvlab::utils::mgr_list_cmd(qbham_mgr)); + // cmd.add_subcommand("qbham-cmd-group", qbham_new_cmd(qbham_mgr)); + cmd.add_subcommand("qbham-cmd-group", dvlab::utils::mgr_delete_cmd(qbham_mgr)); + cmd.add_subcommand("qbham-cmd-group", dvlab::utils::mgr_checkout_cmd(qbham_mgr)); + cmd.add_subcommand("qbham-cmd-group", dvlab::utils::mgr_copy_cmd(qbham_mgr)); + cmd.add_subcommand("qbham-cmd-group", qbham_jw_cmd(qbham_mgr)); + cmd.add_subcommand("qbham-cmd-group", qbham_ternary_tree_cmd(qbham_mgr)); + cmd.add_subcommand("qbham-cmd-group", qbham_read_cmd(qbham_mgr)); + // cmd.add_subcommand("qbham-cmd-group", qbham_write_cmd(qbham_mgr)); + cmd.add_subcommand("qbham-cmd-group", qbham_print_cmd(qbham_mgr)); + cmd.add_subcommand("qbham-cmd-group", qbham_trotterize_cmd(qbham_mgr, tableau_mgr)); + cmd.add_subcommand("qbham-cmd-group", qbham_sort_cmd(qbham_mgr)); + + return cmd; +} + +bool add_qbham_cmds(dvlab::CommandLineInterface& cli, device::DeviceMgr& device_mgr, QubitHamiltonianMgr& qbham_mgr, tableau::TableauMgr& tableau_mgr) { + if (!cli.add_command(qbham_cmd(device_mgr, qbham_mgr, tableau_mgr))) { + spdlog::error("Registering \"qbham\" commands fails... exiting"); + return false; + } + + return true; +} + +} // namespace qsyn::hamiltonian diff --git a/src/cmd/qbham_cmd.hpp b/src/cmd/qbham_cmd.hpp new file mode 100644 index 000000000..e23525e96 --- /dev/null +++ b/src/cmd/qbham_cmd.hpp @@ -0,0 +1,21 @@ +/**************************************************************************** + PackageName [ hamiltonian ] + Synopsis [ Define hamiltonian commands ] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#pragma once + +#include "cli/cli.hpp" +#include "cmd/device_mgr.hpp" +#include "cmd/qbham_mgr.hpp" +#include "cmd/tableau_mgr.hpp" + +namespace qsyn::hamiltonian { + +dvlab::Command qbham_cmd(device::DeviceMgr& device_mgr, QubitHamiltonianMgr& qbham_mgr, tableau::TableauMgr& tableau_mgr); + +bool add_qbham_cmds(dvlab::CommandLineInterface& cli, device::DeviceMgr& device_mgr, QubitHamiltonianMgr& qbham_mgr, tableau::TableauMgr& tableau_mgr); + +} // namespace qsyn::hamiltonian diff --git a/src/cmd/qbham_mgr.hpp b/src/cmd/qbham_mgr.hpp new file mode 100644 index 000000000..35383e0e6 --- /dev/null +++ b/src/cmd/qbham_mgr.hpp @@ -0,0 +1,30 @@ +/**************************************************************************** + PackageName [ hamiltonian ] + Synopsis [ Define class QubitHamiltonian manager structure ] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#pragma once + +#include "hamiltonian/qubit_hamiltonian.hpp" +#include "util/data_structure_manager.hpp" + +namespace qsyn::hamiltonian { + +using QubitHamiltonianMgr = dvlab::utils::DataStructureManager; + +} // namespace qsyn::hamiltonian + +template <> +inline std::string dvlab::utils::data_structure_info_string( + dvlab::utils::DataStructureManager const& mgr, size_t id) { + return fmt::format("{:<19} {}", mgr.get_filename(id).substr(0, 19), + fmt::join(mgr.get_procedures(id), " ➔ ")); +} + +template <> +inline std::string dvlab::utils::data_structure_name( + dvlab::utils::DataStructureManager const& mgr, size_t id) { + return mgr.get_filename(id); +} diff --git a/src/cmd/qcir/optimizer_cmd.cpp b/src/cmd/qcir/optimizer_cmd.cpp index 6d4850258..b97a9bec4 100644 --- a/src/cmd/qcir/optimizer_cmd.cpp +++ b/src/cmd/qcir/optimizer_cmd.cpp @@ -67,9 +67,10 @@ Command qcir_optimize_cmd(QCirMgr& qcir_mgr) { if (!dvlab::utils::mgr_has_data(qcir_mgr)) return CmdExecResult::error; Optimizer optimizer; std::optional result; - std::string procedure_str{}; + std::string const filename = qcir_mgr.get_filename(); + std::vector procedures = qcir_mgr.get_procedures(); - enum class Strategy { + enum struct Strategy : std::uint8_t { basic, teleport, blaqsmith @@ -88,21 +89,22 @@ Command qcir_optimize_cmd(QCirMgr& qcir_mgr) { switch (strategy) { case Strategy::teleport: phase_teleport(*qcir_mgr.get()); - procedure_str = "Phase Teleport"; + procedures.emplace_back("Phase Teleport"); break; case Strategy::blaqsmith: optimize_2q_count(*qcir_mgr.get(), parser.get("--init-temp"), 2, 2); - procedure_str = "Blaqsmith"; + procedures.emplace_back("Blaqsmith"); + break; case Strategy::basic: { if (parser.get("--tech") || !qcir_mgr.get()->get_gate_set().empty()) { - result = optimizer.trivial_optimization(*qcir_mgr.get()); - procedure_str = "Tech Optimize"; + result = optimizer.trivial_optimization(*qcir_mgr.get()); + procedures.emplace_back("Tech Optimize"); } else { - result = optimizer.basic_optimization(*qcir_mgr.get(), {.doSwap = !parser.get("--physical"), - .maxIter = 1000, - .printStatistics = parser.get("--statistics")}); - procedure_str = "Optimize"; + result = optimizer.basic_optimization(*qcir_mgr.get(), {.doSwap = !parser.get("--physical"), + .maxIter = 1000, + .printStatistics = parser.get("--statistics")}); + procedures.emplace_back("Optimize"); } if (result == std::nullopt) { spdlog::error("Fail to optimize circuit."); @@ -117,9 +119,10 @@ Command qcir_optimize_cmd(QCirMgr& qcir_mgr) { } } if (stop_requested()) { - procedure_str += "[INT]"; + procedures.emplace_back("[INT]"); } - qcir_mgr.get()->add_procedure(procedure_str); + qcir_mgr.set_filename(filename); + qcir_mgr.set_procedures(procedures); return CmdExecResult::done; }}; diff --git a/src/cmd/qcir/oracle_cmd.cpp b/src/cmd/qcir/oracle_cmd.cpp index c6b012a22..92fae639b 100644 --- a/src/cmd/qcir/oracle_cmd.cpp +++ b/src/cmd/qcir/oracle_cmd.cpp @@ -117,9 +117,9 @@ Command qcir_oracle_cmd(QCirMgr& qcir_mgr) { if (qcir.has_value()) { qcir_mgr.add(qcir_mgr.get_next_id(), std::make_unique(std::move(qcir.value()))); if (parser.parsed("--xag")) { - qcir_mgr.get()->set_filename(parser.get("--xag")); + qcir_mgr.set_filename(parser.get("--xag")); } else if (parser.parsed("--tt")) { - qcir_mgr.get()->set_filename(parser.get("--tt")); + qcir_mgr.set_filename(parser.get("--tt")); } } diff --git a/src/cmd/qcir/transpile_qiskit_cmd.cpp b/src/cmd/qcir/transpile_qiskit_cmd.cpp new file mode 100644 index 000000000..a0cbb0cc6 --- /dev/null +++ b/src/cmd/qcir/transpile_qiskit_cmd.cpp @@ -0,0 +1,110 @@ +/**************************************************************************** + PackageName [ qcir/transpile_qiskit ] + Synopsis [ Define transpile_qiskit command ] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#include "./transpile_qiskit_cmd.hpp" + +#include +#include + +#include +#include +#include +#include + +#include "../qcir_mgr.hpp" +#include "argparse/arg_parser.hpp" +#include "argparse/arg_type.hpp" +#include "cli/cli.hpp" +#include "qcir/qcir.hpp" +#include "qcir/qcir_io.hpp" +#include "util/data_structure_manager_common_cmd.hpp" +#include "util/sysdep.hpp" +#include "util/tmp_files.hpp" +#include "util/util.hpp" + +using namespace dvlab::argparse; +using dvlab::CmdExecResult; +using dvlab::Command; + +namespace qsyn::qcir { + +Command qcir_transpile_qiskit_cmd(QCirMgr& qcir_mgr) { + return { + "transpile-qiskit", + [](ArgumentParser& parser) { + parser.description("Transpile the current QCir using Qiskit and checks the resulting circuit to a new QCir"); + + parser.add_argument("-b", "--backend") + .default_value("") + .help("the backend to use for transpilation (optional; if omitted, transpiles without qubit routing)"); + + parser.add_argument("-o", "--optimization-level") + .choices({0, 1, 2, 3}) + .default_value(2) + .help("optimization level (0-3, default: 2)"); + }, + [&](ArgumentParser const& parser) -> CmdExecResult { + namespace fs = std::filesystem; + namespace dv = dvlab::utils; + + // Check if QCir is loaded + if (!dvlab::utils::mgr_has_data(qcir_mgr)) { + return CmdExecResult::error; + } + + // Get arguments + auto const backend = parser.get("--backend"); + auto const opt_level = parser.get("--optimization-level"); + + // Create temporary directory and file for temporary QASMs + dv::TmpDir const tmp_dir; + fs::path const tmp_qasm_input = tmp_dir.path() / "input.qasm"; + fs::path const tmp_qasm_output = tmp_dir.path() / "output.qasm"; + + // Write current QCir to temp QASM file + if (!qcir_mgr.get()->write_qasm(tmp_qasm_input)) { + spdlog::error("Failed to write QCir to temporary QASM file"); + return CmdExecResult::error; + } + + // Build command to call the Python script + auto const path_to_script = "scripts/qiskit_transpile.py"; + auto args = std::vector{ + "-input", + tmp_qasm_input.string(), + "-output", + tmp_qasm_output.string(), + "-optimization_level", + std::to_string(opt_level), + }; + if (backend.empty()) { + spdlog::info("Transpiling QCir using Qiskit without qubit routing (optimization level {})...", opt_level); + } else { + args.push_back("-backend"); + args.push_back(backend); + spdlog::info("Transpiling QCir using Qiskit with backend '{}' and optimization level {}...", backend, opt_level); + } + + if (auto result = dvlab::utils::uv_run_script(path_to_script, args) == 0) { + auto new_qcir = qcir::from_qasm(tmp_qasm_output.string()); + if (!new_qcir.has_value()) { + spdlog::error("Failed to read the output QASM file"); + return CmdExecResult::error; + } + auto new_id = qcir_mgr.get_next_id(); + qcir_mgr.add(new_id, std::make_unique(std::move(*new_qcir))); + spdlog::info("Successfully transpiled QCir and checked the resulting circuit to QCir {}", new_id); + qcir_mgr.checkout(new_id); + return CmdExecResult::done; + } else { + spdlog::error("Transpilation failed with exit code {}", result); + return CmdExecResult::error; + } + }}; +} + +} // namespace qsyn::qcir diff --git a/src/cmd/qcir/transpile_qiskit_cmd.hpp b/src/cmd/qcir/transpile_qiskit_cmd.hpp new file mode 100644 index 000000000..6a66512b6 --- /dev/null +++ b/src/cmd/qcir/transpile_qiskit_cmd.hpp @@ -0,0 +1,17 @@ +/**************************************************************************** + PackageName [ qcir/transpile_qiskit ] + Synopsis [ Define transpile_qiskit command header ] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#pragma once + +#include "cli/cli.hpp" +#include "cmd/qcir_mgr.hpp" + +namespace qsyn::qcir { + +dvlab::Command qcir_transpile_qiskit_cmd(QCirMgr& qcir_mgr); + +} // namespace qsyn::qcir diff --git a/src/cmd/qcir_cmd.cpp b/src/cmd/qcir_cmd.cpp index f6adedfc0..9c7225ac9 100644 --- a/src/cmd/qcir_cmd.cpp +++ b/src/cmd/qcir_cmd.cpp @@ -18,6 +18,7 @@ #include "./qcir/optimizer_cmd.hpp" #include "./qcir/oracle_cmd.hpp" +#include "./qcir/transpile_qiskit_cmd.hpp" #include "argparse/arg_parser.hpp" #include "argparse/arg_type.hpp" #include "cli/cli.hpp" @@ -146,7 +147,7 @@ dvlab::Command qcir_read_cmd(QCirMgr& qcir_mgr) { } else { qcir_mgr.set(std::make_unique(std::move(*qcir))); } - qcir_mgr.get()->set_filename(std::filesystem::path{filepath}.stem()); + qcir_mgr.set_filename(std::filesystem::path{filepath}.stem()); return CmdExecResult::done; }}; } @@ -592,9 +593,9 @@ dvlab::Command qcir_translate_cmd(QCirMgr& qcir_mgr) { spdlog::error("Translation fails!!"); return CmdExecResult::error; } - std::string const filename = qcir_mgr.get()->get_filename(); + std::string const filename = qcir_mgr.get_filename(); qcir_mgr.set(std::make_unique(*std::move(translated_qcir))); - qcir_mgr.get()->set_filename(filename); + qcir_mgr.set_filename(filename); return CmdExecResult::done; }}; } @@ -679,6 +680,7 @@ Command qcir_cmd(QCirMgr& qcir_mgr) { cmd.add_subcommand("qcir-cmd-group", qcir_oracle_cmd(qcir_mgr)); cmd.add_subcommand("qcir-cmd-group", qcir_equiv_cmd(qcir_mgr)); cmd.add_subcommand("qcir-cmd-group", qcir_to_basic_cmd(qcir_mgr)); + cmd.add_subcommand("qcir-cmd-group", qcir_transpile_qiskit_cmd(qcir_mgr)); return cmd; } diff --git a/src/cmd/qcir_mgr.hpp b/src/cmd/qcir_mgr.hpp index 461c1d04c..2878d6ec4 100644 --- a/src/cmd/qcir_mgr.hpp +++ b/src/cmd/qcir_mgr.hpp @@ -21,12 +21,12 @@ using QCirMgr = dvlab::utils::DataStructureManager; } // namespace qsyn::qcir template <> -inline std::string dvlab::utils::data_structure_info_string(qsyn::qcir::QCir const& t) { - return fmt::format("{:<19} {}", t.get_filename().substr(0, 19), - fmt::join(t.get_procedures(), " ➔ ")); +inline std::string dvlab::utils::data_structure_info_string(dvlab::utils::DataStructureManager const& mgr, size_t id) { + return fmt::format("{:<19} {}", mgr.get_filename(id).substr(0, 19), + fmt::join(mgr.get_procedures(id), " ➔ ")); } template <> -inline std::string dvlab::utils::data_structure_name(qsyn::qcir::QCir const& t) { - return t.get_filename(); +inline std::string dvlab::utils::data_structure_name(dvlab::utils::DataStructureManager const& mgr, size_t id) { + return mgr.get_filename(id); } diff --git a/src/cmd/tableau_cmd.cpp b/src/cmd/tableau_cmd.cpp index e14177148..8989c3830 100644 --- a/src/cmd/tableau_cmd.cpp +++ b/src/cmd/tableau_cmd.cpp @@ -25,7 +25,7 @@ using namespace dvlab::argparse; -namespace qsyn::experimental { +namespace qsyn::tableau { ArgType::ConstraintType valid_tableau_qubit_id(TableauMgr const& tableau_mgr) { return [&tableau_mgr](size_t const& id) -> bool { @@ -294,25 +294,25 @@ dvlab::Command tableau_optimization_cmd(TableauMgr& tableau_mgr) { break; case OptimizationMethod::collapse: collapse(*tableau_mgr.get()); - tableau_mgr.get()->add_procedure("collapse"); + tableau_mgr.add_procedure("collapse"); break; case OptimizationMethod::t_merge: merge_rotations(*tableau_mgr.get()); - tableau_mgr.get()->add_procedure("MergeT"); + tableau_mgr.add_procedure("MergeT"); break; case OptimizationMethod::internal_h_opt: minimize_internal_hadamards(*tableau_mgr.get()); - tableau_mgr.get()->add_procedure("InternalHOpt"); + tableau_mgr.add_procedure("InternalHOpt"); break; case OptimizationMethod::phase_polynomial_optimization: do_phase_polynomial_optimization(); - tableau_mgr.get()->add_procedure("PhasePolyOpt"); + tableau_mgr.add_procedure("PhasePolyOpt"); break; case OptimizationMethod::matroid_partition: if (!do_matroid_partition()) { return dvlab::CmdExecResult::error; } - tableau_mgr.get()->add_procedure("MatroidPartition"); + tableau_mgr.add_procedure("MatroidPartition"); break; } @@ -340,4 +340,4 @@ bool add_tableau_command(dvlab::CommandLineInterface& cli, TableauMgr& tableau_m return cli.add_command(tableau_cmd(tableau_mgr)); } -} // namespace qsyn::experimental +} // namespace qsyn::tableau diff --git a/src/cmd/tableau_cmd.hpp b/src/cmd/tableau_cmd.hpp index dad6b315d..314f52ce4 100644 --- a/src/cmd/tableau_cmd.hpp +++ b/src/cmd/tableau_cmd.hpp @@ -13,12 +13,12 @@ namespace qsyn { -namespace experimental { +namespace tableau { dvlab::Command tableau_cmd(); bool add_tableau_command(dvlab::CommandLineInterface& cli, TableauMgr& tableau_mgr); -} // namespace experimental +} // namespace tableau } // namespace qsyn diff --git a/src/cmd/tableau_mgr.hpp b/src/cmd/tableau_mgr.hpp index d4cd9cffb..414cb7747 100644 --- a/src/cmd/tableau_mgr.hpp +++ b/src/cmd/tableau_mgr.hpp @@ -14,19 +14,19 @@ #include "tableau/tableau.hpp" #include "util/data_structure_manager.hpp" -namespace qsyn::experimental { +namespace qsyn::tableau { using TableauMgr = dvlab::utils::DataStructureManager; -} // namespace qsyn::experimental +} // namespace qsyn::tableau template <> -inline std::string dvlab::utils::data_structure_info_string(qsyn::experimental::Tableau const& t) { - return fmt::format("{:<19} {}", t.get_filename().substr(0, 19), - fmt::join(t.get_procedures(), " ➔ ")); +inline std::string dvlab::utils::data_structure_info_string(dvlab::utils::DataStructureManager const& mgr, size_t id) { + return fmt::format("{:<19} {}", mgr.get_filename(id).substr(0, 19), + fmt::join(mgr.get_procedures(id), " ➔ ")); } template <> -inline std::string dvlab::utils::data_structure_name(qsyn::experimental::Tableau const& t) { - return t.get_filename(); +inline std::string dvlab::utils::data_structure_name(dvlab::utils::DataStructureManager const& mgr, size_t id) { + return mgr.get_filename(id); } diff --git a/src/cmd/tensor_mgr.hpp b/src/cmd/tensor_mgr.hpp index 4c78eb9dd..b22f0988c 100644 --- a/src/cmd/tensor_mgr.hpp +++ b/src/cmd/tensor_mgr.hpp @@ -23,14 +23,16 @@ using TensorMgr = dvlab::utils::DataStructureManager>; } // namespace qsyn::tensor template <> -inline std::string dvlab::utils::data_structure_info_string(qsyn::tensor::QTensor const& tensor) { +inline std::string dvlab::utils::data_structure_info_string(dvlab::utils::DataStructureManager> const& mgr, size_t id) { + auto* tensor = mgr.find_by_id(id); + if (!tensor) return {}; return fmt::format("{:<19} #Dim: {} {}", - tensor.get_filename().substr(0, 19), - tensor.dimension(), - fmt::join(tensor.get_procedures(), " ➔ ")); + mgr.get_filename(id).substr(0, 19), + tensor->dimension(), + fmt::join(mgr.get_procedures(id), " ➔ ")); } template <> -inline std::string dvlab::utils::data_structure_name(qsyn::tensor::QTensor const& tensor) { - return tensor.get_filename(); +inline std::string dvlab::utils::data_structure_name(dvlab::utils::DataStructureManager> const& mgr, size_t id) { + return mgr.get_filename(id); } diff --git a/src/cmd/zx/simp_cmd.cpp b/src/cmd/zx/simp_cmd.cpp index 6d8cabfc9..3bdf8c1d8 100644 --- a/src/cmd/zx/simp_cmd.cpp +++ b/src/cmd/zx/simp_cmd.cpp @@ -101,7 +101,7 @@ Command zxgraph_optimize_cmd(zx::ZXGraphMgr& zxgraph_mgr) { procedure_str += "[INT]"; } - zxgraph_mgr.get()->add_procedure(procedure_str); + zxgraph_mgr.add_procedure(procedure_str); return CmdExecResult::done; }}; } diff --git a/src/cmd/zx_cmd.cpp b/src/cmd/zx_cmd.cpp index 81da665cc..dc008bf36 100644 --- a/src/cmd/zx_cmd.cpp +++ b/src/cmd/zx_cmd.cpp @@ -258,7 +258,7 @@ Command zxgraph_read_cmd(ZXGraphMgr& zxgraph_mgr) { } else { zxgraph_mgr.add(zxgraph_mgr.get_next_id(), std::make_unique(std::move(graph.value()))); } - zxgraph_mgr.get()->set_filename(std::filesystem::path{filepath}.stem()); + zxgraph_mgr.set_filename(std::filesystem::path{filepath}.stem()); return CmdExecResult::done; }}; } diff --git a/src/cmd/zxgraph_mgr.hpp b/src/cmd/zxgraph_mgr.hpp index bc7f2872b..8404bf5f9 100644 --- a/src/cmd/zxgraph_mgr.hpp +++ b/src/cmd/zxgraph_mgr.hpp @@ -17,12 +17,12 @@ using ZXGraphMgr = dvlab::utils::DataStructureManager; } // namespace qsyn::zx template <> -inline std::string dvlab::utils::data_structure_info_string(qsyn::zx::ZXGraph const& t) { - return fmt::format("{:<19} {}", t.get_filename().substr(0, 19), - fmt::join(t.get_procedures(), " ➔ ")); +inline std::string dvlab::utils::data_structure_info_string(dvlab::utils::DataStructureManager const& mgr, size_t id) { + return fmt::format("{:<19} {}", mgr.get_filename(id).substr(0, 19), + fmt::join(mgr.get_procedures(id), " ➔ ")); } template <> -inline std::string dvlab::utils::data_structure_name(qsyn::zx::ZXGraph const& t) { - return t.get_filename(); +inline std::string dvlab::utils::data_structure_name(dvlab::utils::DataStructureManager const& mgr, size_t id) { + return mgr.get_filename(id); } diff --git a/src/convert/pauli_rotation_tableau_resyn/basic.cpp b/src/convert/pauli_rotation_tableau_resyn/basic.cpp new file mode 100644 index 000000000..5dadef7b4 --- /dev/null +++ b/src/convert/pauli_rotation_tableau_resyn/basic.cpp @@ -0,0 +1,85 @@ +#include "convert/tableau_to_qcir.hpp" +#include "qcir/basic_gate_type.hpp" +#include "qcir/qcir.hpp" +#include "util/phase.hpp" + +namespace qsyn::tableau { + +// dirty code, TODO: clean up +std::optional +BasicPauliRotationsSynthesisStrategy::_partial_synthesize( + PauliRotationTableau const& rotations, StabilizerTableau& residual_clifford, bool backward) const { + auto pop_target_rotation = [&](PauliRotationTableau& rots) { + auto rot = backward ? std::move(rots.back()) : std::move(rots.front()); + if (backward) { + rots.pop_back(); + } else { + rots.erase(rots.begin()); + } + return rot; + }; + + if (rotations.empty()) { + return qcir::QCir{0}; + } + + size_t num_qubits = rotations.front().n_qubits(); + + auto qcir = qcir::QCir{num_qubits}; + auto copy_rotations = rotations; + + while (!copy_rotations.empty()) { + auto target_rotation = pop_target_rotation(copy_rotations); + auto [ops, qubit] = extract_clifford_operators(target_rotation); + Phase phase = target_rotation.phase(); + + for (auto op : ops) { + detail::add_clifford_gate(copy_rotations, op); + if (!backward) { + detail::add_clifford_gate(qcir, op); + } else { + detail::add_clifford_gate(residual_clifford, op); + } + } + + if (!backward) { + qcir.append(qcir::PZGate(phase), {qubit}); + } + + adjoint_inplace(ops); + for (auto op : std::views::reverse(ops)) { + if (!backward) { + detail::prepend_clifford_gate(residual_clifford, op); + } else { + detail::prepend_clifford_gate(qcir, op); + } + } + + if (backward) { + qcir.prepend(qcir::PZGate(phase), {qubit}); + } + } + + return qcir; +} + +std::optional +BasicPauliRotationsSynthesisStrategy::synthesize( + PauliRotationTableau const& rotations) const { + auto partial_result = partial_synthesize(rotations); + if (!partial_result) { + return std::nullopt; + } + + auto [qcir, final_clifford] = std::move(*partial_result); + + auto const final_clifford_circ = to_qcir(final_clifford, AGSynthesisStrategy{}); + if (!final_clifford_circ) { + return std::nullopt; + } + qcir.compose(*final_clifford_circ); + + return qcir; +} + +} // namespace qsyn::tableau diff --git a/src/convert/pauli_rotation_tableau_resyn/generalized_mst_resyn.cpp b/src/convert/pauli_rotation_tableau_resyn/generalized_mst_resyn.cpp new file mode 100644 index 000000000..6d03fce1d --- /dev/null +++ b/src/convert/pauli_rotation_tableau_resyn/generalized_mst_resyn.cpp @@ -0,0 +1,331 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "convert/tableau_to_qcir.hpp" +#include "qcir/basic_gate_type.hpp" +#include "qcir/qcir.hpp" +#include "tableau/stabilizer_tableau.hpp" +#include "util/graph/dag_peeler.hpp" +#include "util/graph/digraph.hpp" +#include "util/graph/minimum_spanning_arborescence.hpp" +#include "util/phase.hpp" +#include "util/util.hpp" + +extern bool stop_requested(); + +namespace qsyn::tableau { + +namespace detail::mst { + +size_t qubit_weight( + PauliRotation const& rotation) { + auto const num_qubits = rotation.n_qubits(); + auto num_qubit_has_ones = 0ul; + for (auto i : std::views::iota(0ul, num_qubits)) { + if (rotation.pauli_product().is_z_set(i) || rotation.pauli_product().is_x_set(i)) { + num_qubit_has_ones++; + } + } + return num_qubit_has_ones; +} + +// get the index of the rotation with the minimum number of qubit with 1s in the first layer +size_t get_best_rotation_idx(std::vector const& rotations, std::vector const& first_layer) { + auto min_ones = SIZE_MAX; + auto best_idx = SIZE_MAX; + for (auto const& idx : first_layer) { + auto const num_ones = qubit_weight(rotations[idx]); + if (num_ones < min_ones) { + min_ones = num_ones; + best_idx = idx; + } + } + return best_idx; +} + +size_t cx_distance( + StabilizerTableau const& st, + size_t q1_idx, + size_t q2_idx) { + auto w = 0ul; + for (auto i : std::views::iota(0ul, st.n_qubits())) { + if (st.stabilizer(i).is_z_set(q1_idx) != st.stabilizer(i).is_z_set(q2_idx)) { + w++; + } + if (st.destabilizer(i).is_z_set(q1_idx) != st.destabilizer(i).is_z_set(q2_idx)) { + w++; + } + if (st.stabilizer(i).is_x_set(q1_idx) != st.stabilizer(i).is_x_set(q2_idx)) { + w++; + } + if (st.destabilizer(i).is_x_set(q1_idx) != st.destabilizer(i).is_x_set(q2_idx)) { + w++; + } + } + return w; +} + +// compute the trace different of operation cx_ij on the stabilizer tableau +size_t delta_trace( + StabilizerTableau const& st, + size_t q1_idx, + size_t q2_idx) { + size_t delta = 0; + if (st.stabilizer(q2_idx).is_z_set(q1_idx)) { + delta += st.stabilizer(q1_idx).is_z_set(q1_idx) ? -1 : 1; + } + if (st.destabilizer(q1_idx).is_x_set(q2_idx)) { + delta += st.destabilizer(q2_idx).is_x_set(q2_idx) ? -1 : 1; + } + return delta; +} + +// build the dependency graph according to the commutation relation +dvlab::DagPeeler get_dependency_graph(std::vector const& rotations) { + size_t const num_rotations = rotations.size(); + dvlab::DagPeeler dag{num_rotations}; + // Build graph: add edges + for (auto i : std::views::iota(0ul, num_rotations)) { + for (auto j : std::views::iota(i + 1, num_rotations)) { + if (!is_commutative(rotations[i], rotations[j])) { + dag.add_edge(i, j); + } + } + } + // Finalize: build in_adj and initialize queues + dag.finalize(); + return dag; +} + +dvlab::Digraph get_parity_graph_with_stabilizer( + std::vector const& rotations, + StabilizerTableau const& residual_clifford, + PauliRotation const& target_rotation) { + assert(target_rotation.is_diagonal()); + auto const num_qubits = rotations.front().n_qubits(); + + auto g = dvlab::Digraph{}; + auto qubit_vec = std::vector{}; + + for (auto i : std::views::iota(0ul, num_qubits)) { + if (target_rotation.pauli_product().is_z_set(i)) { + g.add_vertex_with_id(i); + qubit_vec.push_back(i); + } + } + + // Optimization: Pre-compute all row_hamming_weights to avoid repeated calculations + // For each qubit in qubit_vec, compute both is_Z=true and is_Z=false weights + std::vector hamming_weight_z_true(qubit_vec.size()); + std::vector hamming_weight_z_false(qubit_vec.size()); + for (size_t idx = 0; idx < qubit_vec.size(); ++idx) { + auto q = qubit_vec[idx]; + hamming_weight_z_true[idx] = row_hamming_weight(rotations, q, true); + hamming_weight_z_false[idx] = row_hamming_weight(rotations, q, false); + } + + // Create a map from qubit index to position in qubit_vec for O(1) lookup + std::unordered_map qubit_to_idx; + for (size_t idx = 0; idx < qubit_vec.size(); ++idx) { + qubit_to_idx[qubit_vec[idx]] = idx; + } + + auto get_delta_rotations = [&](size_t i, size_t j) -> std::pair { + auto i_idx = qubit_to_idx[i]; + auto j_idx = qubit_to_idx[j]; + auto W_i = hamming_weight_z_true[i_idx] + hamming_weight_z_false[j_idx]; + auto W_j = hamming_weight_z_true[j_idx] + hamming_weight_z_false[i_idx]; + auto Dist_ij = cx_distance(rotations, i, j); + return {Dist_ij - W_j - 1, Dist_ij - W_i - 1}; + }; + + // Optimization: Pre-compute all row_hamming_weights for stabilizer as well + std::vector stab_hamming_weight_z_true(qubit_vec.size()); + std::vector stab_hamming_weight_z_false(qubit_vec.size()); + for (size_t idx = 0; idx < qubit_vec.size(); ++idx) { + auto q = qubit_vec[idx]; + stab_hamming_weight_z_true[idx] = row_hamming_weight(residual_clifford, q, true); + stab_hamming_weight_z_false[idx] = row_hamming_weight(residual_clifford, q, false); + } + + auto get_delta_stabilizer = [&](size_t i, size_t j) -> std::pair { + auto i_idx = qubit_to_idx[i]; + auto j_idx = qubit_to_idx[j]; + auto W_i = stab_hamming_weight_z_true[i_idx] + stab_hamming_weight_z_false[j_idx]; + auto W_j = stab_hamming_weight_z_true[j_idx] + stab_hamming_weight_z_false[i_idx]; + auto Dist_ij = cx_distance(residual_clifford, i, j); + auto T_ij = delta_trace(residual_clifford, i, j); + auto T_ji = delta_trace(residual_clifford, j, i); + return {Dist_ij - W_j - 1 - 2 * T_ij, Dist_ij - W_i - 1 - 2 * T_ji}; + }; + + for (auto const& [i, j] : dvlab::combinations<2>(qubit_vec)) { + auto const [delta_rot_i, delta_rot_j] = get_delta_rotations(i, j); + auto const [delta_stab_i, delta_stab_j] = get_delta_stabilizer(i, j); + g.add_edge(i, j, delta_rot_i + delta_stab_i); + g.add_edge(j, i, delta_rot_j + delta_stab_j); + } + + return g; +} + +} // namespace detail::mst + +std::optional +GeneralizedMstSynthesisStrategy::_partial_synthesize( + PauliRotationTableau const& rotations, StabilizerTableau& residual_clifford, bool backward) const { + auto append_s = [&](size_t qubit, qcir::QCir& qcir, StabilizerTableau& st) { + qcir.append(qcir::SGate(), {qubit}); + st.prepend_sdg(qubit); + }; + + auto append_h = [&](size_t qubit, qcir::QCir& qcir, StabilizerTableau& st) { + qcir.append(qcir::HGate(), {qubit}); + st.prepend_h(qubit); + }; + + auto prepend_s = [&](size_t qubit, qcir::QCir& qcir, StabilizerTableau& st) { + qcir.prepend(qcir::SdgGate(), {qubit}); + st.s(qubit); + }; + + auto prepend_h = [&](size_t qubit, qcir::QCir& qcir, StabilizerTableau& st) { + qcir.prepend(qcir::HGate(), {qubit}); + st.h(qubit); + }; + + auto add_s = [&](size_t qubit, std::vector& pr, qcir::QCir& qcir, StabilizerTableau& st, bool backward) { + for (auto& rot : pr) { + rot.s(qubit); + } + if (backward) { + prepend_s(qubit, qcir, st); + } else { + append_s(qubit, qcir, st); + } + }; + + auto add_h = [&](size_t qubit, std::vector& pr, qcir::QCir& qcir, StabilizerTableau& st, bool backward) { + for (auto& rot : pr) { + rot.h(qubit); + } + if (backward) { + prepend_h(qubit, qcir, st); + } else { + append_h(qubit, qcir, st); + } + }; + + auto const num_qubits = residual_clifford.n_qubits(); + auto const num_rotations = rotations.size(); + + if (num_qubits == 0) { + return qcir::QCir{0}; + } + + if (num_rotations == 0) { + return qcir::QCir{num_qubits}; + } + + auto copy_rotations = rotations; + auto qcir = qcir::QCir{num_qubits}; + auto dag = detail::mst::get_dependency_graph(rotations); + // create the index mapping: rotation_idx -> vertex_id + std::vector index_mapping(num_rotations); + // create reverse mapping: vertex_id -> rotation_idx + std::vector vertex_to_rotation(num_rotations); + for (size_t i = 0; i < num_rotations; ++i) { + index_mapping[i] = i; + vertex_to_rotation[i] = i; + } + while (!copy_rotations.empty()) { + if (stop_requested()) break; + std::vector first_layer_rotations; + // Use optimized get_first_layer/get_last_layer methods + std::vector layer_vertices = backward ? dag.get_last_layer() : dag.get_first_layer(); + for (auto vid : layer_vertices) { + if (vid < vertex_to_rotation.size()) { + size_t rot_idx = vertex_to_rotation[vid]; + // Check if this rotation index is still valid (not yet removed) + if (rot_idx < copy_rotations.size() && index_mapping[rot_idx] == vid) { + first_layer_rotations.push_back(rot_idx); + } + } + } + auto const best_rotation_idx = detail::mst::get_best_rotation_idx(copy_rotations, first_layer_rotations); + size_t best_vid = index_mapping[best_rotation_idx]; + auto best_rotation = copy_rotations[best_rotation_idx]; + for (auto i : std::views::iota(0ul, num_qubits)) { + if (best_rotation.pauli_product().is_x_set(i)) { + if (best_rotation.pauli_product().is_z_set(i)) { + add_s(i, copy_rotations, qcir, residual_clifford, backward); + } + add_h(i, copy_rotations, qcir, residual_clifford, backward); + } + } + // Update the best rotation + best_rotation = copy_rotations[best_rotation_idx]; + assert(best_rotation.is_diagonal()); + dag.erase(best_vid); + // Use swap-and-pop for O(1) deletion instead of O(n) erase + // Swap the last element to the position being removed + size_t last_idx = copy_rotations.size() - 1; + if (best_rotation_idx != last_idx) { + // Update reverse mapping for the swapped element + size_t swapped_vid = index_mapping[last_idx]; + vertex_to_rotation[swapped_vid] = best_rotation_idx; + // Swap index_mapping + index_mapping[best_rotation_idx] = index_mapping[last_idx]; + } + // Remove last element from index_mapping (O(1)) + index_mapping.pop_back(); + auto const parity_graph = detail::mst::get_parity_graph_with_stabilizer(copy_rotations, residual_clifford, best_rotation); + auto const [mst, root] = dvlab::minimum_spanning_arborescence(parity_graph); + detail::mst::apply_mst_cxs(mst, root, copy_rotations, qcir, residual_clifford, backward); + + assert(detail::mst::is_valid(copy_rotations[best_rotation_idx])); + + // Use swap-and-pop for O(1) deletion instead of O(n) erase + size_t last_rot_idx = copy_rotations.size() - 1; + if (best_rotation_idx != last_rot_idx) { + // Swap the last element to the position being removed + std::swap(copy_rotations[best_rotation_idx], copy_rotations[last_rot_idx]); + } + // Remove last element (O(1)) + copy_rotations.pop_back(); + if (backward) { + qcir.prepend(qcir::PZGate(best_rotation.phase()), {root}); + } else { + qcir.append(qcir::PZGate(best_rotation.phase()), {root}); + } + } + + return qcir; +} + +std::optional +GeneralizedMstSynthesisStrategy::synthesize( + PauliRotationTableau const& rotations) const { + auto partial_result = partial_synthesize(rotations); + if (!partial_result) { + return std::nullopt; + } + + auto [qcir, final_clifford] = std::move(*partial_result); + + auto const final_clifford_circ = to_qcir(final_clifford, AGSynthesisStrategy{}); + if (!final_clifford_circ) { + return std::nullopt; + } + qcir.compose(*final_clifford_circ); + + return qcir; +} + +} // namespace qsyn::tableau diff --git a/src/convert/pauli_rotation_tableau_resyn/graysynth.cpp b/src/convert/pauli_rotation_tableau_resyn/graysynth.cpp new file mode 100644 index 000000000..f523198b5 --- /dev/null +++ b/src/convert/pauli_rotation_tableau_resyn/graysynth.cpp @@ -0,0 +1,276 @@ + +#include +#include +#include +#include +#include + +#include "convert/tableau_to_qcir.hpp" +#include "qcir/basic_gate_type.hpp" +#include "qcir/qcir.hpp" +#include "util/phase.hpp" +#include "util/util.hpp" + +namespace qsyn::tableau { + +namespace { +/** + * @brief select a row consisting completely of 1s to be the target row. + * + * @param rotations + * @param rotation_filter + * @param pivot + * @return size_t + */ +std::vector +get_control_rows( + std::vector const& rotations, + std::vector const& rotation_filter, + size_t pivot) { + auto const num_qubits = rotations.front().n_qubits(); + auto control_rows = std::vector{}; + for (auto i : std::views::iota(0ul, num_qubits)) { + if (i == pivot) continue; + + if (std::ranges::all_of( + rotation_filter, + [&](auto x) { + return rotations[x].pauli_product().is_z_set(i); + })) { + control_rows.push_back(i); + } + } + + return control_rows; +} + +void apply_cxs( + std::vector ctrls, + size_t targ, + GraySynthStrategy::Mode mode, + std::vector& rotations, + qcir::QCir& qcir, + StabilizerTableau& final_clifford, + std::unordered_set const& frozen_rotations, + std::size_t num_rotations, + std::vector const& random_order) { + using Mode = GraySynthStrategy::Mode; + + auto const apply_cx = [&](size_t ctrl, size_t targ) { + for (auto col_id : std::views::iota(0ul, num_rotations)) { + if (!frozen_rotations.contains(col_id)) { + rotations[col_id].cx(ctrl, targ); + } + } + qcir.append(qcir::CXGate(), {ctrl, targ}); + final_clifford.prepend_cx(ctrl, targ); + }; + + switch (mode) { + case Mode::star: + for (auto ctrl : ctrls) { + apply_cx(ctrl, targ); + } + break; + case Mode::staircase: + // sort the controls according to the random_order + std::ranges::sort(ctrls, [&](auto const& x, auto const& y) { + return random_order[x] < random_order[y]; + }); + for (auto&& [c, t] : ctrls | tl::views::pairwise) { + apply_cx(c, t); + } + if (!ctrls.empty()) { + apply_cx(ctrls.back(), targ); + } + break; + } +} + +/** + * @brief select a row with the most or least number of 1. + * + * @param rotations + * @param rotation_filter + * @param qubit_filter + * @return size_t + */ +size_t +get_cofactor_row( + std::vector const& rotations, + std::vector const& rotation_filter, + std::vector const& qubit_filter) { + auto counts = std::vector(qubit_filter.size(), 0); + for (auto col_id : rotation_filter) { + for (auto&& [idx, qubit] : tl::views::enumerate(qubit_filter)) { + if (rotations[col_id].pauli_product().is_z_set(qubit)) { + counts[idx]++; + } + } + } + + auto const [min_it, max_it] = std::ranges::minmax_element(counts); + auto const most_ones = std::distance(counts.begin(), max_it); + auto const most_zeros = std::distance(counts.begin(), min_it); + + if (counts[most_ones] >= rotation_filter.size() - counts[most_zeros]) { + return qubit_filter[most_ones]; + } else { + return qubit_filter[most_zeros]; + } +} + +/** + * @brief filter out a number from a vector. + * + * @param vec + * @param num + * @return std::vector + */ +std::vector +filter_out_number( + std::vector const& vec, + std::size_t num) { + return vec | + std::views::filter([&](auto const& x) { return x != num; }) | + tl::to(); +} + +} // namespace + +std::optional +GraySynthStrategy::partial_synthesize( + std::vector const& rotations) const { + auto const num_qubits = rotations.front().n_qubits(); + auto const num_rotations = rotations.size(); + + if (num_qubits == 0) { + return PartialSynthesisResult{ + qcir::QCir{0}, + StabilizerTableau{num_qubits}}; + } + + if (num_rotations == 0) { + return PartialSynthesisResult{ + qcir::QCir{num_qubits}, + StabilizerTableau{num_qubits}}; + } + + // checks if all rotations are diagonal + if (!std::ranges::all_of(rotations, &PauliRotation::is_diagonal)) { + spdlog::error("GraySynth only supports diagonal rotations"); + return std::nullopt; + } + + auto frozen_rotations = + std::unordered_set{}; // ids to the rotations that + // have been synthesized + + auto copy_rotations = rotations; + + using stack_elem_t = + std::tuple< + std::vector, // rotation filter + std::vector, // qubit filter + size_t>; // target row + auto stack = std::vector{}; + + stack.emplace_back( + std::views::iota(0ul, num_rotations) | tl::to(), + std::views::iota(0ul, num_qubits) | tl::to(), + SIZE_MAX); + + auto qcir = qcir::QCir{copy_rotations.front().n_qubits()}; + + StabilizerTableau final_clifford{num_qubits}; + + // generate 0..num_qubits random order + static auto rng = std::mt19937{42}; + auto random_order = + std::views::iota(0ul, num_qubits) | tl::to(); + std::ranges::shuffle(random_order, rng); + + while (!stack.empty()) { + auto const [rotation_filter, qubit_filter, targ] = + std::move(stack.back()); + stack.pop_back(); + if (rotation_filter.empty()) continue; + if (targ != SIZE_MAX) { + auto ctrls = + get_control_rows(copy_rotations, rotation_filter, targ); + + apply_cxs( + std::move(ctrls), targ, mode, + copy_rotations, + qcir, final_clifford, + frozen_rotations, num_rotations, random_order); + } + + if (qubit_filter.empty()) { + for (auto col_id : rotation_filter) { + if (frozen_rotations.contains(col_id)) continue; + frozen_rotations.insert(col_id); + DVLAB_ASSERT( + targ < num_qubits, + "`targ` should be a valid qubit index"); + qcir.append( + qcir::PZGate(copy_rotations[col_id].phase()), + {targ}); + } + continue; + } + + auto const row_id = get_cofactor_row( + copy_rotations, + rotation_filter, + qubit_filter); + + auto const zero_rotations = + rotation_filter | + std::views::filter([&](auto const& x) { + return !copy_rotations[x].pauli_product().is_z_set(row_id); + }) | + tl::to(); + auto const one_rotations = + rotation_filter | + std::views::filter([&](auto const& x) { + return copy_rotations[x].pauli_product().is_z_set(row_id); + }) | + tl::to(); + + stack.emplace_back( + zero_rotations, + filter_out_number(qubit_filter, row_id), + targ); + stack.emplace_back( + one_rotations, + filter_out_number(qubit_filter, row_id), + targ == SIZE_MAX ? row_id : targ); + } + + return PartialSynthesisResult{ + std::move(qcir), + std::move(final_clifford)}; +} + +std::optional +GraySynthStrategy::synthesize( + std::vector const& rotations) const { + auto partial_result = partial_synthesize(rotations); + if (!partial_result) { + return std::nullopt; + } + + auto [qcir, final_clifford] = std::move(*partial_result); + + // it seems like gaussian is the best + auto const final_cxs = synthesize_cx_gaussian(final_clifford); + + for (auto const& cx : final_cxs) { + detail::add_clifford_gate(qcir, cx); + } + + return qcir; +} + +} // namespace qsyn::tableau diff --git a/src/convert/pauli_rotation_tableau_resyn/mst_resyn.cpp b/src/convert/pauli_rotation_tableau_resyn/mst_resyn.cpp new file mode 100644 index 000000000..fe95fe117 --- /dev/null +++ b/src/convert/pauli_rotation_tableau_resyn/mst_resyn.cpp @@ -0,0 +1,264 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "convert/tableau_to_qcir.hpp" +#include "qcir/basic_gate_type.hpp" +#include "qcir/qcir.hpp" +#include "tableau/stabilizer_tableau.hpp" +#include "util/graph/digraph.hpp" +#include "util/graph/minimum_spanning_arborescence.hpp" +#include "util/phase.hpp" +#include "util/util.hpp" + +extern bool stop_requested(); + +namespace qsyn::tableau { + +namespace detail::mst { + +bool is_valid(PauliRotation const& rotation) { + if (!rotation.is_diagonal()) { + return false; + } + + auto num_z = 0ul; + for (auto i : std::views::iota(0ul, rotation.n_qubits())) { + if (rotation.pauli_product().is_z_set(i)) { + num_z++; + } + } + return num_z == 1; +} + +size_t hamming_weight( + PauliRotation const& rotation) { + auto const num_qubits = rotation.n_qubits(); + auto num_ones = 0ul; + for (auto i : std::views::iota(0ul, num_qubits)) { + if (rotation.pauli_product().is_z_set(i)) { + num_ones++; + } + } + return num_ones; +} + +// get the index of the rotation with the minimum number of 1s in Zs +// A term of k ones can always be synthesized with k-1 CNOTs +size_t get_best_rotation_idx(std::vector const& rotations) { + auto min_ones = SIZE_MAX; + auto best_idx = SIZE_MAX; + for (auto const& [idx, rotation] : tl::views::enumerate(rotations)) { + auto const num_ones = hamming_weight(rotation); + if (num_ones < min_ones) { + min_ones = num_ones; + best_idx = idx; + } + } + return best_idx; +} + +size_t row_hamming_weight( + std::vector const& rotations, + size_t q_idx, bool is_Z) { + return std::ranges::count_if(rotations, [&](auto const& rotation) { + return is_Z ? rotation.pauli_product().is_z_set(q_idx) : rotation.pauli_product().is_x_set(q_idx); + }); +} + +size_t row_hamming_weight( + StabilizerTableau const& st, + size_t q_idx, bool is_Z) { + size_t stab_part = std::ranges::count_if(std::views::iota(0ul, st.n_qubits()), [&](auto i) { + return is_Z ? st.stabilizer(i).is_z_set(q_idx) : st.stabilizer(i).is_x_set(q_idx); + }); + size_t destab_part = std::ranges::count_if(std::views::iota(0ul, st.n_qubits()), [&](auto i) { + return is_Z ? st.destabilizer(i).is_z_set(q_idx) : st.destabilizer(i).is_x_set(q_idx); + }); + return stab_part + destab_part; +} + +size_t hamming_distance( + std::vector const& rotations, + size_t q1_idx, + size_t q2_idx) { + return std::ranges::count_if(rotations, [&](auto const& rotation) { + return rotation.pauli_product().is_z_set(q1_idx) != + rotation.pauli_product().is_z_set(q2_idx); + }); +} + +size_t cx_distance( + std::vector const& rotations, + size_t q1_idx, + size_t q2_idx) { + size_t x_distance = std::ranges::count_if(rotations, [&](auto const& rotation) { + return rotation.pauli_product().is_x_set(q1_idx) != rotation.pauli_product().is_x_set(q2_idx); + }); + + return x_distance + hamming_distance(rotations, q1_idx, q2_idx); +} + +dvlab::Digraph get_parity_graph( + std::vector const& rotations, + PauliRotation const& target_rotation, + bool consider_X) { + auto const num_qubits = rotations.front().n_qubits(); + + auto g = dvlab::Digraph{}; + auto qubit_vec = std::vector{}; + + for (auto i : std::views::iota(0ul, num_qubits)) { + if (target_rotation.pauli_product().is_z_set(i)) { + g.add_vertex_with_id(i); + qubit_vec.push_back(i); + } + } + // get the weight of the edge i if consider_X is true + // otherwise, get the weight of the cx operation between i and j + auto const get_weight = [&](size_t i, size_t j) { + return consider_X + ? row_hamming_weight(rotations, i, true) + row_hamming_weight(rotations, j, false) + : row_hamming_weight(rotations, i, true); + }; + + for (auto const& [i, j] : dvlab::combinations<2>(qubit_vec)) { + auto const dist = (consider_X) + ? gsl::narrow_cast(cx_distance(rotations, i, j)) + : gsl::narrow_cast(hamming_distance(rotations, i, j)); + auto const weight_i = gsl::narrow_cast(get_weight(i, j)); + auto const weight_j = gsl::narrow_cast(get_weight(j, i)); + g.add_edge(i, j, dist - weight_j - 1); + g.add_edge(j, i, dist - weight_i - 1); + } + + return g; +} + +void apply_mst_cxs(dvlab::Digraph const& mst, size_t root, + std::vector& rotations, qcir::QCir& qcir, + StabilizerTableau& final_clifford, bool backward) { + auto const add_cx = [&](size_t ctrl, size_t targ) { + for (auto& rot : rotations) { + rot.cx(ctrl, targ); + } + if (backward) { + qcir.prepend(qcir::CXGate(), {ctrl, targ}); + final_clifford.cx(ctrl, targ); + } else { + qcir.append(qcir::CXGate(), {ctrl, targ}); + final_clifford.prepend_cx(ctrl, targ); + } + }; + // post-order traversal to add CXs + std::stack stack; + std::vector post_order_rev; + + stack.push(root); + + // First phase: collect nodes in post-order + while (!stack.empty()) { + auto const v = stack.top(); + stack.pop(); + post_order_rev.push_back(v); + + for (auto const& n : mst.out_neighbors(v)) { + stack.push(n); + } + } + + // Second phase: apply CX gates in reverse post-order + while (!post_order_rev.empty()) { + auto const v = post_order_rev.back(); + post_order_rev.pop_back(); + if (mst.in_degree(v) == 1) { + auto const pred = *mst.in_neighbors(v).begin(); + add_cx(v, pred); + } else { + DVLAB_ASSERT( + mst.in_degree(v) == 0 && v == root, + "The node with no incoming edges should be the root"); + } + } +} + +} // namespace detail::mst + +std::optional +MstSynthesisStrategy::partial_synthesize( + std::vector const& rotations) const { + auto const num_qubits = rotations.front().n_qubits(); + auto const num_rotations = rotations.size(); + + if (num_qubits == 0) { + return PartialSynthesisResult{ + qcir::QCir{0}, + StabilizerTableau{num_qubits}}; + } + + if (num_rotations == 0) { + return PartialSynthesisResult{ + qcir::QCir{num_qubits}, + StabilizerTableau{num_qubits}}; + } + + // checks if all rotations are diagonal + if (!std::ranges::all_of(rotations, &PauliRotation::is_diagonal)) { + spdlog::error("MST only supports diagonal rotations"); + return std::nullopt; + } + + auto copy_rotations = rotations; + + auto qcir = qcir::QCir{copy_rotations.front().n_qubits()}; + + StabilizerTableau final_clifford{num_qubits}; + while (!copy_rotations.empty()) { + auto const best_rotation_idx = detail::mst::get_best_rotation_idx(copy_rotations); + std::swap(copy_rotations[best_rotation_idx], copy_rotations.back()); + auto const best_rotation = std::move(copy_rotations.back()); + copy_rotations.pop_back(); + + auto const parity_graph = + detail::mst::get_parity_graph(copy_rotations, best_rotation); + + auto const [mst, root] = + dvlab::minimum_spanning_arborescence(parity_graph); + + detail::mst::apply_mst_cxs(mst, root, copy_rotations, qcir, final_clifford, false); + + // add the rotation at the root + qcir.append(qcir::PZGate(best_rotation.phase()), {root}); + } + + return PartialSynthesisResult{ + std::move(qcir), + std::move(final_clifford)}; +} + +std::optional +MstSynthesisStrategy::synthesize( + std::vector const& rotations) const { + auto partial_result = partial_synthesize(rotations); + if (!partial_result) { + return std::nullopt; + } + + auto [qcir, final_clifford] = std::move(*partial_result); + + // it seems like gaussian is the best + auto const final_cxs = synthesize_cx_gaussian(final_clifford); + + for (auto const& cx : final_cxs) { + detail::add_clifford_gate(qcir, cx); + } + + return qcir; +} + +} // namespace qsyn::tableau diff --git a/src/convert/pauli_rotation_tableau_resyn/naive.cpp b/src/convert/pauli_rotation_tableau_resyn/naive.cpp new file mode 100644 index 000000000..297c92ac8 --- /dev/null +++ b/src/convert/pauli_rotation_tableau_resyn/naive.cpp @@ -0,0 +1,36 @@ +#include "convert/tableau_to_qcir.hpp" +#include "qcir/basic_gate_type.hpp" +#include "qcir/qcir.hpp" +#include "util/phase.hpp" + +namespace qsyn::tableau { + +std::optional +NaivePauliRotationsSynthesisStrategy::synthesize( + std::vector const& rotations) const { + if (rotations.empty()) { + return qcir::QCir{0}; + } + + auto qcir = qcir::QCir{rotations.front().n_qubits()}; + + for (auto const& rotation : rotations) { + auto [ops, qubit] = extract_clifford_operators(rotation); + + for (auto const& op : ops) { + detail::add_clifford_gate(qcir, op); + } + + qcir.append(qcir::PZGate(rotation.phase()), {qubit}); + + adjoint_inplace(ops); + + for (auto const& op : ops) { + detail::add_clifford_gate(qcir, op); + } + } + + return qcir; +} + +} // namespace qsyn::tableau diff --git a/src/convert/qbham_to_tensor.cpp b/src/convert/qbham_to_tensor.cpp new file mode 100644 index 000000000..7f066e9fa --- /dev/null +++ b/src/convert/qbham_to_tensor.cpp @@ -0,0 +1,105 @@ +/**************************************************************************** + PackageName [ qsyn ] + Synopsis [ Implement conversion from QubitHamiltonian to Tensor ] + Author [ Design Verification Lab ] +****************************************************************************/ + +#include "./qbham_to_tensor.hpp" + +#include + +#include +#include + +#include "tableau/pauli_product_trait.hpp" + +namespace qsyn { + +/** + * Build the full (2^n x 2^n) matrix representation of a QubitHamiltonian in the + * computational basis. + * + * Mathematically, if H = sum_i c_i P_i where each P_i is a tensor product of single-qubit + * Paulis, this routine fills a dense matrix M such that + * + * M[row, col] = . + * + * Implementation sketch: + * - Interpret `col` as the bitstring of a basis state |col>. + * - For each Pauli term c * P: + * * Walk through all qubits q and update: + * - `row` = which basis state |row> = P |col> lands on (via bit flips). + * - `phase` = complex phase accumulated from the local Pauli action: + * Z: possibly flip sign depending on the input bit + * X: flip the corresponding bit in `row` + * Y: flip bit in `row` and multiply by ±i depending on the input bit. + * * Accumulate c * phase into M[row, col]. + */ +std::optional> to_tensor(hamiltonian::QubitHamiltonian const& hamilt) { + using qsyn::tableau::Pauli; + + // Deduce number of qubits from any term (all terms share the same size). + std::size_t n_qubits = 0; + if (hamilt.begin() != hamilt.end()) { + n_qubits = hamilt.begin()->n_qubits(); + } + + if (n_qubits >= std::numeric_limits::digits) { + spdlog::error("Too many qubits ({}) to form a dense matrix representation.", n_qubits); + return std::nullopt; + } + + // Hilbert space dimension: 2^n. + std::size_t const dim = std::size_t{1} << n_qubits; + tensor::QTensor mat(tensor::TensorShape{dim, dim}); + + // Loop over all Pauli terms in the Hamiltonian. + for (auto const& term : hamilt) { + double const coeff = term.coeff(); + if (coeff == 0.0) continue; + + auto const& pauli_product = term.pauli_product(); + + // Calculate P_i |col>. + for (std::size_t col = 0; col < dim; ++col) { + // Start from |row> = |col>; Pauli letters may flip individual bits. + std::size_t row = col; + // Global complex phase accumulated from this Pauli product on |col>. + std::complex phase{1.0, 0.0}; + + // Walk through each qubit and apply the corresponding single-qubit Pauli. + for (std::size_t q = 0; q < n_qubits; ++q) { + auto const p = pauli_product.get_pauli_type(q); + auto const bit = (col >> q) & 1U; // value of qubit q in |col> + + switch (p) { + case Pauli::i: + break; + case Pauli::z: + if (bit) { + phase = -phase; + } + break; + case Pauli::x: + // X flips the q-th bit: |b> -> |b xor 1>. + row ^= (std::size_t{1} << q); + break; + case Pauli::y: + // Y also flips the bit, but adds a phase: + // Y|0> = i|1>, Y|1> = -i|0> + row ^= (std::size_t{1} << q); + phase *= (bit ? std::complex(0.0, -1.0) + : std::complex(0.0, 1.0)); + break; + } + } + + // This term contributes = c * phase to matrix entry (row, col). + mat(row, col) += coeff * phase; + } + } + + return mat; +} + +} // namespace qsyn diff --git a/src/convert/qbham_to_tensor.hpp b/src/convert/qbham_to_tensor.hpp new file mode 100644 index 000000000..b3ae43cb3 --- /dev/null +++ b/src/convert/qbham_to_tensor.hpp @@ -0,0 +1,23 @@ +/**************************************************************************** + PackageName [ qsyn ] + Synopsis [ Define conversion from QubitHamiltonian to Tensor ] + Author [ Design Verification Lab ] +****************************************************************************/ + +#pragma once + +#include + +#include "hamiltonian/qubit_hamiltonian.hpp" +#include "tensor/qtensor.hpp" + +namespace qsyn { + +namespace hamiltonian { +class QubitHamiltonian; +} + +std::optional> to_tensor(hamiltonian::QubitHamiltonian const& hamilt); + +} // namespace qsyn + diff --git a/src/convert/qcir_to_tableau.cpp b/src/convert/qcir_to_tableau.cpp index dcda3e130..79027f197 100644 --- a/src/convert/qcir_to_tableau.cpp +++ b/src/convert/qcir_to_tableau.cpp @@ -27,7 +27,7 @@ bool stop_requested(); namespace qsyn { -namespace experimental { +namespace tableau { namespace { @@ -134,33 +134,33 @@ std::vector get_qubit_idx_vec(QubitIdList const& qubits) { } // namespace -} // namespace experimental +} // namespace tableau template <> -bool append_to_tableau(qcir::IdGate const& /* op*/, experimental::Tableau& /* tableau */, QubitIdList const& /* qubits */) { +bool append_to_tableau(qcir::IdGate const& /* op*/, tableau::Tableau& /* tableau */, QubitIdList const& /* qubits */) { return true; } template <> -bool append_to_tableau(qcir::HGate const& /* op */, experimental::Tableau& tableau, QubitIdList const& qubits) { +bool append_to_tableau(qcir::HGate const& /* op */, tableau::Tableau& tableau, QubitIdList const& qubits) { tableau.h(qubits[0]); return true; } template <> -bool append_to_tableau(qcir::SwapGate const& /* op */, experimental::Tableau& tableau, QubitIdList const& qubits) { +bool append_to_tableau(qcir::SwapGate const& /* op */, tableau::Tableau& tableau, QubitIdList const& qubits) { tableau.swap(qubits[0], qubits[1]); return true; } template <> -bool append_to_tableau(qcir::ECRGate const& /* op */, experimental::Tableau& tableau, QubitIdList const& qubits) { +bool append_to_tableau(qcir::ECRGate const& /* op */, tableau::Tableau& tableau, QubitIdList const& qubits) { tableau.ecr(qubits[0], qubits[1]); return true; } template <> -bool append_to_tableau(qcir::PZGate const& op, experimental::Tableau& tableau, QubitIdList const& qubits) { +bool append_to_tableau(qcir::PZGate const& op, tableau::Tableau& tableau, QubitIdList const& qubits) { if (op.get_phase() == dvlab::Phase(1)) { tableau.z(qubits[0]); } else if (op.get_phase() == dvlab::Phase(1, 2)) { @@ -168,14 +168,14 @@ bool append_to_tableau(qcir::PZGate const& op, experimental::Tableau& tableau, Q } else if (op.get_phase() == dvlab::Phase(-1, 2)) { tableau.sdg(qubits[0]); } else { - return experimental::implement_mcp(tableau, qubits, op.get_phase(), experimental::Pauli::z); + return tableau::implement_mcp(tableau, qubits, op.get_phase(), tableau::Pauli::z); } return true; } template <> -bool append_to_tableau(qcir::PXGate const& op, experimental::Tableau& tableau, QubitIdList const& qubits) { +bool append_to_tableau(qcir::PXGate const& op, tableau::Tableau& tableau, QubitIdList const& qubits) { if (op.get_phase() == dvlab::Phase(1)) { tableau.x(qubits[0]); } else if (op.get_phase() == dvlab::Phase(1, 2)) { @@ -183,14 +183,14 @@ bool append_to_tableau(qcir::PXGate const& op, experimental::Tableau& tableau, Q } else if (op.get_phase() == dvlab::Phase(-1, 2)) { tableau.vdg(qubits[0]); } else { - return experimental::implement_mcp(tableau, qubits, op.get_phase(), experimental::Pauli::x); + return tableau::implement_mcp(tableau, qubits, op.get_phase(), tableau::Pauli::x); } return true; } template <> -bool append_to_tableau(qcir::PYGate const& op, experimental::Tableau& tableau, QubitIdList const& qubits) { +bool append_to_tableau(qcir::PYGate const& op, tableau::Tableau& tableau, QubitIdList const& qubits) { if (op.get_phase() == dvlab::Phase(1)) { tableau.y(qubits[0]); } else if (op.get_phase() == dvlab::Phase(1, 2)) { @@ -202,14 +202,14 @@ bool append_to_tableau(qcir::PYGate const& op, experimental::Tableau& tableau, Q tableau.vdg(qubits[0]); tableau.s(qubits[0]); } else { - return experimental::implement_mcp(tableau, qubits, op.get_phase(), experimental::Pauli::y); + return tableau::implement_mcp(tableau, qubits, op.get_phase(), tableau::Pauli::y); } return true; } template <> -bool append_to_tableau(qcir::RZGate const& op, experimental::Tableau& tableau, QubitIdList const& qubits) { +bool append_to_tableau(qcir::RZGate const& op, tableau::Tableau& tableau, QubitIdList const& qubits) { if (op.get_phase() == dvlab::Phase(1)) { tableau.z(qubits[0]); } else if (op.get_phase() == dvlab::Phase(1, 2)) { @@ -217,13 +217,13 @@ bool append_to_tableau(qcir::RZGate const& op, experimental::Tableau& tableau, Q } else if (op.get_phase() == dvlab::Phase(-1, 2)) { tableau.sdg(qubits[0]); } else { - return experimental::implement_mcr(tableau, qubits, op.get_phase(), experimental::Pauli::z); + return tableau::implement_mcr(tableau, qubits, op.get_phase(), tableau::Pauli::z); } return true; } template <> -bool append_to_tableau(qcir::RXGate const& op, experimental::Tableau& tableau, QubitIdList const& qubits) { +bool append_to_tableau(qcir::RXGate const& op, tableau::Tableau& tableau, QubitIdList const& qubits) { if (op.get_phase() == dvlab::Phase(1)) { tableau.x(qubits[0]); } else if (op.get_phase() == dvlab::Phase(1, 2)) { @@ -231,13 +231,13 @@ bool append_to_tableau(qcir::RXGate const& op, experimental::Tableau& tableau, Q } else if (op.get_phase() == dvlab::Phase(-1, 2)) { tableau.vdg(qubits[0]); } else { - return experimental::implement_mcr(tableau, qubits, op.get_phase(), experimental::Pauli::x); + return tableau::implement_mcr(tableau, qubits, op.get_phase(), tableau::Pauli::x); } return true; } template <> -bool append_to_tableau(qcir::RYGate const& op, experimental::Tableau& tableau, QubitIdList const& qubits) { +bool append_to_tableau(qcir::RYGate const& op, tableau::Tableau& tableau, QubitIdList const& qubits) { if (op.get_phase() == dvlab::Phase(1)) { tableau.y(qubits[0]); } else if (op.get_phase() == dvlab::Phase(1, 2)) { @@ -249,19 +249,19 @@ bool append_to_tableau(qcir::RYGate const& op, experimental::Tableau& tableau, Q tableau.vdg(qubits[0]); tableau.s(qubits[0]); } else { - return experimental::implement_mcr(tableau, qubits, op.get_phase(), experimental::Pauli::y); + return tableau::implement_mcr(tableau, qubits, op.get_phase(), tableau::Pauli::y); } return true; } template <> -bool append_to_tableau(qcir::ControlGate const& op, experimental::Tableau& tableau, QubitIdList const& qubits) { +bool append_to_tableau(qcir::ControlGate const& op, tableau::Tableau& tableau, QubitIdList const& qubits) { if (auto target_op = op.get_target_operation().get_underlying_if()) { if (op.get_num_qubits() == 2 && target_op->get_phase() == dvlab::Phase(1)) { tableau.cx(qubits[0], qubits[1]); return true; } else { - return experimental::implement_mcp(tableau, qubits, target_op->get_phase(), experimental::Pauli::x); + return tableau::implement_mcp(tableau, qubits, target_op->get_phase(), tableau::Pauli::x); } } @@ -272,7 +272,7 @@ bool append_to_tableau(qcir::ControlGate const& op, experimental::Tableau& table tableau.s(qubits[1]); return true; } else { - return experimental::implement_mcp(tableau, qubits, target_op->get_phase(), experimental::Pauli::y); + return tableau::implement_mcp(tableau, qubits, target_op->get_phase(), tableau::Pauli::y); } } @@ -281,26 +281,26 @@ bool append_to_tableau(qcir::ControlGate const& op, experimental::Tableau& table tableau.cz(qubits[0], qubits[1]); return true; } else { - return experimental::implement_mcp(tableau, qubits, target_op->get_phase(), experimental::Pauli::z); + return tableau::implement_mcp(tableau, qubits, target_op->get_phase(), tableau::Pauli::z); } } if (auto target_op = op.get_target_operation().get_underlying_if()) { - return experimental::implement_mcr(tableau, qubits, target_op->get_phase(), experimental::Pauli::x); + return tableau::implement_mcr(tableau, qubits, target_op->get_phase(), tableau::Pauli::x); } if (auto target_op = op.get_target_operation().get_underlying_if()) { - return experimental::implement_mcr(tableau, qubits, target_op->get_phase(), experimental::Pauli::y); + return tableau::implement_mcr(tableau, qubits, target_op->get_phase(), tableau::Pauli::y); } if (auto target_op = op.get_target_operation().get_underlying_if()) { - return experimental::implement_mcr(tableau, qubits, target_op->get_phase(), experimental::Pauli::z); + return tableau::implement_mcr(tableau, qubits, target_op->get_phase(), tableau::Pauli::z); } return false; } -namespace experimental { +namespace tableau { std::optional to_tableau(qcir::QCir const& qcir) { Tableau result{qcir.get_num_qubits()}; @@ -318,10 +318,10 @@ std::optional to_tableau(qcir::QCir const& qcir) { return result; } -} // namespace experimental +} // namespace tableau template <> -bool append_to_tableau(qcir::QCir const& qcir, experimental::Tableau& tableau, QubitIdList const& qubits) { +bool append_to_tableau(qcir::QCir const& qcir, tableau::Tableau& tableau, QubitIdList const& qubits) { auto qubit_map = std::unordered_map(); for (size_t i = 0; i < qcir.get_num_qubits(); ++i) { diff --git a/src/convert/qcir_to_tableau.hpp b/src/convert/qcir_to_tableau.hpp index 3a5aeddec..a75a28c40 100644 --- a/src/convert/qcir_to_tableau.hpp +++ b/src/convert/qcir_to_tableau.hpp @@ -14,13 +14,13 @@ namespace qsyn { -namespace experimental { +namespace tableau { std::optional to_tableau(qcir::QCir const& qcir); -} // namespace experimental +} // namespace tableau template <> -bool append_to_tableau(qcir::QCir const& op, experimental::Tableau& tableau, QubitIdList const& qubits); +bool append_to_tableau(qcir::QCir const& op, tableau::Tableau& tableau, QubitIdList const& qubits); } // namespace qsyn diff --git a/src/convert/tableau_to_qcir.cpp b/src/convert/tableau_to_qcir.cpp index bf2a4f484..ad29559dd 100644 --- a/src/convert/tableau_to_qcir.cpp +++ b/src/convert/tableau_to_qcir.cpp @@ -7,28 +7,24 @@ #include "./tableau_to_qcir.hpp" -#include -#include -#include #include #include #include #include "qcir/basic_gate_type.hpp" #include "qcir/qcir.hpp" -#include "util/graph/digraph.hpp" -#include "util/graph/minimum_spanning_arborescence.hpp" -#include "util/phase.hpp" +#include "tableau/stabilizer_tableau.hpp" #include "util/util.hpp" extern bool stop_requested(); -namespace qsyn::experimental { +namespace qsyn::tableau { -namespace { +namespace detail { + +using COT = CliffordOperatorType; void add_clifford_gate(qcir::QCir& qcir, CliffordOperator const& op) { - using COT = CliffordOperatorType; auto const& [type, qubits] = op; switch (type) { @@ -70,7 +66,110 @@ void add_clifford_gate(qcir::QCir& qcir, CliffordOperator const& op) { break; } } -} // namespace + +// TODO: merge with add_clifford_gate +void prepend_clifford_gate(qcir::QCir& qcir, CliffordOperator const& op) { + auto const& [type, qubits] = op; + switch (type) { + case COT::h: + qcir.prepend(qcir::HGate(), {qubits[0]}); + break; + case COT::s: + qcir.prepend(qcir::SGate(), {qubits[0]}); + break; + case COT::cx: + qcir.prepend(qcir::CXGate(), {qubits[0], qubits[1]}); + break; + case COT::sdg: + qcir.prepend(qcir::SdgGate(), {qubits[0]}); + break; + case COT::v: + qcir.prepend(qcir::SXGate(), {qubits[0]}); + break; + case COT::vdg: + qcir.prepend(qcir::SXdgGate(), {qubits[0]}); + break; + case COT::x: + qcir.prepend(qcir::XGate(), {qubits[0]}); + break; + case COT::y: + qcir.prepend(qcir::YGate(), {qubits[0]}); + break; + case COT::z: + qcir.prepend(qcir::ZGate(), {qubits[0]}); + break; + case COT::cz: + qcir.prepend(qcir::CZGate(), {qubits[0], qubits[1]}); + break; + case COT::swap: + qcir.prepend(qcir::SwapGate(), {qubits[0], qubits[1]}); + break; + case COT::ecr: + qcir.prepend(qcir::ECRGate(), {qubits[0], qubits[1]}); + break; + } +} + +void add_clifford_gate(PauliRotationTableau& rotations, CliffordOperator const& op) { + auto const& [type, qubits] = op; + + switch (type) { + case COT::h: + for (auto& rot : rotations) { + rot.h(qubits[0]); + } + break; + case COT::s: + for (auto& rot : rotations) { + rot.s(qubits[0]); + } + break; + case COT::cx: + for (auto& rot : rotations) { + rot.cx(qubits[0], qubits[1]); + } + break; + case COT::v: + for (auto& rot : rotations) { + rot.h(qubits[0]); + rot.s(qubits[0]); + rot.h(qubits[0]); + } + break; + default: + spdlog::error("Invalid Clifford operator type {}. The operation is skipped.", to_string(type)); + break; + } +} + +void add_clifford_gate(StabilizerTableau& tableau, CliffordOperator const& op) { + auto const& [type, qubits] = op; + switch (type) { + case COT::h: + tableau.h(qubits[0]); + break; + case COT::s: + tableau.s(qubits[0]); + break; + case COT::cx: + tableau.cx(qubits[0], qubits[1]); + break; + case COT::sdg: + tableau.sdg(qubits[0]); + break; + case COT::v: + tableau.v(qubits[0]); + break; + case COT::vdg: + tableau.vdg(qubits[0]); + } +} + +void prepend_clifford_gate(StabilizerTableau& tableau, CliffordOperator const& op) { + tableau.prepend(op); +} + +} // namespace detail /** * @brief convert a stabilizer tableau to a QCir. @@ -78,502 +177,268 @@ void add_clifford_gate(qcir::QCir& qcir, CliffordOperator const& op) { * @param clifford - pass by value on purpose * @return std::optional */ -std::optional to_qcir(StabilizerTableau const& clifford, StabilizerTableauSynthesisStrategy const& strategy) { +std::optional to_qcir( + StabilizerTableau const& clifford, + StabilizerTableauSynthesisStrategy const& strategy) { qcir::QCir qcir{clifford.n_qubits()}; for (auto const& op : extract_clifford_operators(clifford, strategy)) { if (stop_requested()) { return std::nullopt; } - add_clifford_gate(qcir, op); + detail::add_clifford_gate(qcir, op); } return qcir; } -std::optional NaivePauliRotationsSynthesisStrategy::synthesize(std::vector const& rotations) const { - if (rotations.empty()) { - return qcir::QCir{0}; - } +/** + * @brief convert a Pauli rotation to a QCir. This is a naive implementation. + * + * @param pauli_rotation + * @return qcir::QCir + */ +std::optional to_qcir( + std::vector const& pauli_rotations, + PauliRotationsSynthesisStrategy const& strategy) { + return strategy.synthesize(pauli_rotations); +} - auto qcir = qcir::QCir{rotations.front().n_qubits()}; +namespace { - for (auto const& rotation : rotations) { - auto [ops, qubit] = extract_clifford_operators(rotation); +std::optional to_qcir_eager( + Tableau const& tableau, + StabilizerTableauSynthesisStrategy const& st_strategy, + PauliRotationsSynthesisStrategy const& pr_strategy) { + qcir::QCir qcir{tableau.n_qubits()}; - for (auto const& op : ops) { - add_clifford_gate(qcir, op); + size_t iter = 0; + for (auto const& subtableau : tableau) { + if (stop_requested()) { + return std::nullopt; } - - qcir.append(qcir::PZGate(rotation.phase()), {qubit}); - - adjoint_inplace(ops); - - for (auto const& op : ops) { - add_clifford_gate(qcir, op); + auto const qc_fragment = + std::visit( + dvlab::overloaded{ + [&st_strategy](StabilizerTableau const& st) { + return to_qcir(st, st_strategy); + }, + [&pr_strategy](std::vector const& pr) { + return to_qcir(pr, pr_strategy); + }}, + subtableau); + if (!qc_fragment) { + return std::nullopt; } + qcir.compose(*qc_fragment); + iter++; } return qcir; } -std::optional TParPauliRotationsSynthesisStrategy::synthesize(std::vector const& /* rotations */) const { - spdlog::error("TPar Synthesis Strategy is not implemented yet!!"); - return std::nullopt; -} - -namespace { /** - * @brief select a row consisting completely of 1s to be the target row. + * @brief check if the subtableaux alternate between + * stabilizer and Pauli rotations * - * @param rotations - * @param rotation_filter - * @param pivot - * @return size_t + * @param tableau + * @return true + * @return false */ -std::vector -get_control_rows( - std::vector const& rotations, - std::vector const& rotation_filter, - size_t pivot) { - auto const num_qubits = rotations.front().n_qubits(); - auto control_rows = std::vector{}; - for (auto i : std::views::iota(0ul, num_qubits)) { - if (i == pivot) continue; - - if (std::ranges::all_of( - rotation_filter, - [&](auto x) { - return rotations[x].pauli_product().is_z_set(i); - })) { - control_rows.push_back(i); +bool is_alternating(Tableau const& tableau) { + // NOLINTBEGIN(readability-use-anyofallof) + // : tl::views::pairwise is not supported by anyof/allof + for (auto const& [sub1, sub2] : tl::views::pairwise(tableau)) { + if (std::holds_alternative(sub1) == + std::holds_alternative(sub2)) { + return false; } } - - return control_rows; + // NOLINTEND(readability-use-anyofallof) + return true; } -void apply_cxs( - std::vector ctrls, - size_t targ, - GraySynthPauliRotationsSynthesisStrategy::Mode mode, - std::vector& rotations, +void synthesize_clifford_until_h_free( qcir::QCir& qcir, - StabilizerTableau& final_clifford, - std::unordered_set const& frozen_rotations, - std::size_t num_rotations, - std::vector const& random_order) { - using Mode = GraySynthPauliRotationsSynthesisStrategy::Mode; - - auto const apply_cx = [&](size_t ctrl, size_t targ) { - for (auto col_id : std::views::iota(0ul, num_rotations)) { - if (!frozen_rotations.contains(col_id)) { - rotations[col_id].cx(ctrl, targ); - } + StabilizerTableau const& this_clifford, + PauliRotationTableau& prt, + StabilizerTableau& next_clifford, + size_t iter) { + // synthesize until the H-layer + // the H-opt synthesis strategy put the H-optimal circuit + // at the end. however, we want to synthesize them first. + // As a result, we need to adjoint the stabilizer tableau first. + auto const st_strategy = HOptSynthesisStrategy{}; + auto clifford_adj = adjoint(this_clifford); + + auto const diag_gates = + st_strategy.partial_synthesize(clifford_adj); + + size_t cx_gate_count = 0; + for (auto const& op : diag_gates) { + detail::add_clifford_gate(qcir, op); + if (op.first == CliffordOperatorType::cx) { + cx_gate_count++; } - qcir.append(qcir::CXGate(), {ctrl, targ}); - final_clifford.prepend_cx(ctrl, targ); - }; - - switch (mode) { - case Mode::star: - for (auto ctrl : ctrls) { - apply_cx(ctrl, targ); - } - break; - case Mode::staircase: - // sort the controls according to the random_order - std::ranges::sort(ctrls, [&](auto const& x, auto const& y) { - return random_order[x] < random_order[y]; - }); - for (auto&& [c, t] : ctrls | tl::views::pairwise) { - apply_cx(c, t); - } - if (!ctrls.empty()) { - apply_cx(ctrls.back(), targ); - } - break; } -} -/** - * @brief select a row with the most or least number of 1. - * - * @param rotations - * @param rotation_filter - * @param qubit_filter - * @return size_t - */ -size_t -get_cofactor_row(std::vector const& rotations, std::vector const& rotation_filter, std::vector const& qubit_filter) { - auto counts = std::vector(qubit_filter.size(), 0); - for (auto col_id : rotation_filter) { - for (auto&& [idx, qubit] : tl::views::enumerate(qubit_filter)) { - if (rotations[col_id].pauli_product().is_z_set(qubit)) { - counts[idx]++; - } - } - } - - auto const [min_it, max_it] = std::ranges::minmax_element(counts); - auto const most_ones = std::distance(counts.begin(), max_it); - auto const most_zeros = std::distance(counts.begin(), min_it); - - if (counts[most_ones] >= rotation_filter.size() - counts[most_zeros]) { - return qubit_filter[most_ones]; - } else { - return qubit_filter[most_zeros]; + // now, [diag_gates] -- [rem_gates] -- [prt] -- [next_clifford] + // implements the desired transformation. + // To absorb rem_gates into the next Clifford, we + // 1. conjugate the prt with the (rem_gates)^T, and + // 2. prepend the next_clifford with (rem_gates) + auto const rem_gates_adj = + // Since the rem_gates will be absorbed into subsequent operators, + // we use the simplest AG synthesis strategy to extract them. + extract_clifford_operators(clifford_adj, AGSynthesisStrategy{}); + auto const rem_gates = adjoint(rem_gates_adj); + assert(std::ranges::all_of(rem_gates, [](auto const& op) { + return op.first != CliffordOperatorType::h; + })); + + for (auto& rot : prt) { + rot.apply(rem_gates_adj); } + next_clifford.prepend(rem_gates); } -/** - * @brief filter out a number from a vector. - * - * @param vec - * @param num - * @return std::vector - */ -std::vector -filter_out_number( - std::vector const& vec, - std::size_t num) { - return vec | - std::views::filter([&](auto const& x) { return x != num; }) | - tl::to(); -} - -} // namespace - std::optional -GraySynthPauliRotationsSynthesisStrategy::synthesize( - std::vector const& rotations) const { - auto const num_qubits = rotations.front().n_qubits(); - auto const num_rotations = rotations.size(); - - if (num_qubits == 0) { - return qcir::QCir{0}; - } - - if (num_rotations == 0) { - return qcir::QCir{num_qubits}; - } - - // checks if all rotations are diagonal - if (!std::ranges::all_of(rotations, &PauliRotation::is_diagonal)) { - spdlog::error("GraySynth only supports diagonal rotations"); +to_qcir_lazy( + Tableau tableau, // takes copy to avoid modifying the original tableau + PartialPauliRotationsSynthesisStrategy const& pr_strategy) { + // fmt::println("Note: lazy synthesis is not stable. Use at your own risk!!"); + if (!is_alternating(tableau)) { + spdlog::error( + "Subtableaux must alternate between " + "stabilizer and Pauli rotations!!"); return std::nullopt; } - auto frozen_rotations = - std::unordered_set{}; // ids to the rotations that - // have been synthesized - - auto copy_rotations = rotations; - - using stack_elem_t = - std::tuple< - std::vector, // rotation filter - std::vector, // qubit filter - size_t>; // target row - auto stack = std::vector{}; - - stack.emplace_back( - std::views::iota(0ul, num_rotations) | tl::to(), - std::views::iota(0ul, num_qubits) | tl::to(), - SIZE_MAX); - - auto qcir = qcir::QCir{copy_rotations.front().n_qubits()}; - - StabilizerTableau final_clifford{num_qubits}; - - // generate 0..num_qubits random order - static auto rng = std::mt19937{42}; - auto random_order = - std::views::iota(0ul, num_qubits) | tl::to(); - std::ranges::shuffle(random_order, rng); - - while (!stack.empty()) { - auto const [rotation_filter, qubit_filter, targ] = std::move(stack.back()); - stack.pop_back(); - if (rotation_filter.empty()) continue; - if (targ != SIZE_MAX) { - auto ctrls = - get_control_rows(copy_rotations, rotation_filter, targ); - - apply_cxs( - std::move(ctrls), targ, mode, - copy_rotations, - qcir, final_clifford, - frozen_rotations, num_rotations, random_order); - } - - if (qubit_filter.empty()) { - for (auto col_id : rotation_filter) { - if (frozen_rotations.contains(col_id)) continue; - frozen_rotations.insert(col_id); - DVLAB_ASSERT( - targ < num_qubits, - "`targ` should be a valid qubit index"); - qcir.append( - qcir::PZGate(copy_rotations[col_id].phase()), - {targ}); - } - continue; - } - - auto const row_id = get_cofactor_row( - copy_rotations, - rotation_filter, - qubit_filter); - - auto const zero_rotations = - rotation_filter | - std::views::filter([&](auto const& x) { - return !copy_rotations[x].pauli_product().is_z_set(row_id); - }) | - tl::to(); - auto const one_rotations = - rotation_filter | - std::views::filter([&](auto const& x) { - return copy_rotations[x].pauli_product().is_z_set(row_id); - }) | - tl::to(); - - stack.emplace_back( - zero_rotations, - filter_out_number(qubit_filter, row_id), - targ); - stack.emplace_back( - one_rotations, - filter_out_number(qubit_filter, row_id), - targ == SIZE_MAX ? row_id : targ); + // ensure the last subtableau is a stabilizer tableau + if (std::holds_alternative(tableau.back())) { + tableau.push_back(StabilizerTableau{tableau.n_qubits()}); } - auto const final_clifford_circ = to_qcir( - final_clifford, - AGSynthesisStrategy{}); + auto const st_strategy = HOptSynthesisStrategy{}; - if (!final_clifford_circ) { - return std::nullopt; - } - qcir.compose(*final_clifford_circ); + qcir::QCir qcir{tableau.n_qubits()}; - return qcir; -} + size_t clifford_segment_idx = 0; + + for (size_t i = 0; i < tableau.size() - 1; ++i) { + bool const current_is_st = + std::holds_alternative(tableau[i]); + if (current_is_st) { + // the next Clifford always exists because we pushed a final + // identity stabilizer tableau to the end of the tableau. + synthesize_clifford_until_h_free( + qcir, + std::get(tableau[i]), + std::get(tableau[i + 1]), + std::get(tableau[i + 2]), + clifford_segment_idx); + clifford_segment_idx++; + } else { + auto const& prt = + std::get(tableau[i]); + auto& next_clifford = + std::get(tableau[i + 1]); + + auto result = pr_strategy.partial_synthesize( + prt); + if (!result) { + return std::nullopt; + } -namespace { + auto [qc_fragment, rem_clifford] = std::move(*result); -size_t hamming_weight( - PauliRotation const& rotation) { - auto const num_qubits = rotation.n_qubits(); - auto num_ones = 0ul; - for (auto i : std::views::iota(0ul, num_qubits)) { - if (rotation.pauli_product().is_z_set(i)) { - num_ones++; + // delay the CX tableau synthesis by pushing it into the + // next stabilizer tableau + qcir.compose(qc_fragment); + next_clifford.prepend(rem_clifford); } } - return num_ones; -} -// get the index of the rotation with the minimum number of 1s -// A term of k ones can always be synthesized with k-1 CNOTs -size_t get_best_rotation_idx(std::vector const& rotations) { - auto min_ones = SIZE_MAX; - auto best_idx = SIZE_MAX; - for (auto const& [idx, rotation] : tl::views::enumerate(rotations)) { - auto const num_ones = hamming_weight(rotation); - if (num_ones < min_ones) { - min_ones = num_ones; - best_idx = idx; - } + // synthesize the last subtableau + auto const last_qc_fragment = + to_qcir(std::get(tableau.back()), st_strategy); + if (!last_qc_fragment) { + return std::nullopt; } - return best_idx; -} - -size_t hamming_weight( - std::vector const& rotations, - size_t q_idx) { - return std::ranges::count_if(rotations, [&](auto const& rotation) { - return rotation.pauli_product().is_z_set(q_idx); - }); -} - -size_t hamming_distance( - std::vector const& rotations, - size_t q1_idx, - size_t q2_idx) { - return std::ranges::count_if(rotations, [&](auto const& rotation) { - return rotation.pauli_product().is_z_set(q1_idx) != - rotation.pauli_product().is_z_set(q2_idx); - }); -} - -dvlab::Digraph get_parity_graph( - std::vector const& rotations, - PauliRotation const& target_rotation) { - auto const num_qubits = rotations.front().n_qubits(); - auto g = dvlab::Digraph{}; + auto const gate_stats = get_gate_statistics(*last_qc_fragment); + auto const cx_gate_count = + gate_stats.contains("cx") ? gate_stats.at("cx") : 0; + fmt::println("CX gate count in the last Clifford: {}", cx_gate_count); - auto qubit_vec = std::vector{}; + qcir.compose(*last_qc_fragment); - for (auto i : std::views::iota(0ul, num_qubits)) { - if (target_rotation.pauli_product().is_z_set(i)) { - g.add_vertex_with_id(i); - qubit_vec.push_back(i); - } - } - - for (auto const& [i, j] : dvlab::combinations<2>(qubit_vec)) { - auto const dist = - gsl::narrow_cast(hamming_distance(rotations, i, j)); - auto const weight_i = - gsl::narrow_cast(hamming_weight(rotations, i)); - auto const weight_j = - gsl::narrow_cast(hamming_weight(rotations, j)); - g.add_edge(i, j, dist - weight_j - 1); - g.add_edge(j, i, dist - weight_i - 1); - } - - return g; + return qcir; } -} // namespace - std::optional -MstSynthesisStrategy::synthesize( - std::vector const& rotations) const { - auto const num_qubits = rotations.front().n_qubits(); - auto const num_rotations = rotations.size(); - - if (num_qubits == 0) { - return qcir::QCir{0}; - } - - if (num_rotations == 0) { - return qcir::QCir{num_qubits}; - } - - auto copy_rotations = rotations; - - auto qcir = qcir::QCir{copy_rotations.front().n_qubits()}; - - StabilizerTableau final_clifford{num_qubits}; - - auto const add_cx = [&](size_t ctrl, size_t targ) { - for (auto& rot : copy_rotations) { - rot.cx(ctrl, targ); - } - qcir.append(qcir::CXGate(), {ctrl, targ}); - final_clifford.prepend_cx(ctrl, targ); - }; - - // checks if all rotations are diagonal - if (!std::ranges::all_of(rotations, &PauliRotation::is_diagonal)) { - spdlog::error("MST only supports diagonal rotations"); +to_qcir_backward( + Tableau tableau, + BackwardPartialPauliRotationsSynthesisStrategy const& pr_strategy, + StabilizerTableauSynthesisStrategy const& st_strategy) { + if (tableau.size() != 2 || !std::holds_alternative(tableau[0]) || !std::holds_alternative(tableau[1])) { + spdlog::error("Tableau should be collapsed in Unified synthesis strategy."); return std::nullopt; } - while (!copy_rotations.empty()) { - auto const best_rotation_idx = get_best_rotation_idx(copy_rotations); - std::swap(copy_rotations[best_rotation_idx], copy_rotations.back()); - auto const best_rotation = std::move(copy_rotations.back()); - copy_rotations.pop_back(); - - auto const parity_graph = - get_parity_graph(copy_rotations, best_rotation); - - auto const [mst, root] = - dvlab::minimum_spanning_arborescence(parity_graph); - - // post-order traversal to add CXs - std::stack stack; - std::vector post_order_rev; - - stack.push(root); - - while (!stack.empty()) { - auto const v = stack.top(); - stack.pop(); - post_order_rev.push_back(v); - - for (auto const& n : mst.out_neighbors(v)) { - stack.push(n); - } - } - - while (!post_order_rev.empty()) { - auto const v = post_order_rev.back(); - post_order_rev.pop_back(); + auto& initial_clifford = std::get(tableau[0]); + auto const& rotations = std::get(tableau[1]); - // get the predecessor of v - - if (mst.in_degree(v) == 1) { - auto const pred = *mst.in_neighbors(v).begin(); - add_cx(v, pred); - } else { - DVLAB_ASSERT( - mst.in_degree(v) == 0 && v == root, - "The node with no incoming edges should be the root"); - } - } - - // add the rotation at the root - qcir.append(qcir::PZGate(best_rotation.phase()), {root}); + auto result = pr_strategy.backward_synthesize(rotations, initial_clifford); + if (!result) { + return std::nullopt; } - - // synthesize the final clifford - - auto const final_clifford_circ = to_qcir( - final_clifford, - AGSynthesisStrategy{}); - - if (!final_clifford_circ) { + auto initial_clifford_qcir = to_qcir(initial_clifford, st_strategy); + if (!initial_clifford_qcir) { return std::nullopt; } - qcir.compose(*final_clifford_circ); + initial_clifford_qcir->compose(*result); - return qcir; + return initial_clifford_qcir; } -/** - * @brief convert a Pauli rotation to a QCir. This is a naive implementation. - * - * @param pauli_rotation - * @return qcir::QCir - */ -std::optional to_qcir( - std::vector const& pauli_rotations, - PauliRotationsSynthesisStrategy const& strategy) { - return strategy.synthesize(pauli_rotations); -} +} // namespace /** - * @brief convert a stabilizer tableau and a list of Pauli rotations to a QCir. + * @brief convert a tableau to a QCir. * - * @param clifford - * @param pauli_rotations - * @return qcir::QCir + * @param tableau + * @param st_strategy + * @param pr_strategy + * @param lazy */ -std::optional to_qcir(Tableau const& tableau, StabilizerTableauSynthesisStrategy const& st_strategy, PauliRotationsSynthesisStrategy const& pr_strategy) { - qcir::QCir qcir{tableau.n_qubits()}; - - for (auto const& subtableau : tableau) { - if (stop_requested()) { - return std::nullopt; +std::optional to_qcir( + Tableau const& tableau, + StabilizerTableauSynthesisStrategy const& st_strategy, + PauliRotationsSynthesisStrategy const& pr_strategy, + SynthesisType synthesis_type) { + if (synthesis_type == SynthesisType::lazy) { + auto const* pr_strategy_ptr = + dynamic_cast( + &pr_strategy); + if (pr_strategy_ptr) { + return to_qcir_lazy( + tableau, *pr_strategy_ptr); } - auto const qc_fragment = - std::visit( - dvlab::overloaded{ - [&st_strategy](StabilizerTableau const& st) { return to_qcir(st, st_strategy); }, - [&pr_strategy](std::vector const& pr) { return to_qcir(pr, pr_strategy); }}, - subtableau); - if (!qc_fragment) { - return std::nullopt; + spdlog::error("Lazy synthesis requires a partially-synthesizable Pauli rotations synthesis strategy!!"); + return std::nullopt; + } + if (synthesis_type == SynthesisType::unified) { + auto const* pr_strategy_ptr = + dynamic_cast( + &pr_strategy); + if (pr_strategy_ptr) { + // We keep the scalability of "forward" synthesis for unified synthesis strategy + return to_qcir_backward(tableau, *pr_strategy_ptr, st_strategy); } - qcir.compose(*qc_fragment); + spdlog::error("Unified synthesis requires a backward-synthesizable Pauli rotations synthesis strategy!!"); + return std::nullopt; } - - return qcir; + return to_qcir_eager(tableau, st_strategy, pr_strategy); } -} // namespace qsyn::experimental +} // namespace qsyn::tableau diff --git a/src/convert/tableau_to_qcir.hpp b/src/convert/tableau_to_qcir.hpp index da0f34197..b942d5a75 100644 --- a/src/convert/tableau_to_qcir.hpp +++ b/src/convert/tableau_to_qcir.hpp @@ -7,35 +7,147 @@ #pragma once +#include +#include + #include "qcir/qcir.hpp" #include "tableau/pauli_rotation.hpp" +#include "tableau/stabilizer_tableau.hpp" #include "tableau/tableau.hpp" +#include "util/graph/dag_peeler.hpp" +#include "util/graph/digraph.hpp" namespace qsyn { -namespace experimental { +namespace tableau { + +using PauliRotationTableau = std::vector; + +namespace detail { +void add_clifford_gate(qcir::QCir& qcir, CliffordOperator const& op); +void prepend_clifford_gate(qcir::QCir& qcir, CliffordOperator const& op); +void add_clifford_gate(PauliRotationTableau& rotations, CliffordOperator const& op); +void add_clifford_gate(StabilizerTableau& tableau, CliffordOperator const& op); +void prepend_clifford_gate(StabilizerTableau& tableau, CliffordOperator const& op); + +// MST synthesis utility functions +namespace mst { + +bool is_valid(PauliRotation const& rotation); +size_t hamming_weight(PauliRotation const& rotation); +size_t qubit_weight(PauliRotation const& rotation); +size_t get_best_rotation_idx(std::vector const& rotations); +size_t get_best_rotation_idx(std::vector const& rotations, std::vector const& first_layer); +size_t row_hamming_weight(std::vector const& rotations, size_t q_idx, bool is_Z); +size_t row_hamming_weight(StabilizerTableau const& st, size_t q_idx, bool is_Z); +size_t hamming_distance(std::vector const& rotations, size_t q1_idx, size_t q2_idx); +size_t cx_distance(std::vector const& rotations, size_t q1_idx, size_t q2_idx); +size_t cx_distance(StabilizerTableau const& st, size_t q1_idx, size_t q2_idx); +size_t delta_trace(StabilizerTableau const& st, size_t q1_idx, size_t q2_idx); +dvlab::DagPeeler get_dependency_graph(std::vector const& rotations); +dvlab::Digraph get_parity_graph(std::vector const& rotations, + PauliRotation const& target_rotation, + bool consider_X = false); +dvlab::Digraph get_parity_graph_with_stabilizer(std::vector const& rotations, + StabilizerTableau const& residual_clifford, + PauliRotation const& target_rotation); +void apply_mst_cxs(dvlab::Digraph const& mst, + size_t root, + std::vector& rotations, + qcir::QCir& qcir, + StabilizerTableau& final_clifford, + bool backward); + +} // namespace mst + +} // namespace detail + +enum class SynthesisType { + eager, + lazy, + unified +}; struct PauliRotationsSynthesisStrategy { public: virtual ~PauliRotationsSynthesisStrategy() = default; - virtual std::optional synthesize(std::vector const& rotations) const = 0; + virtual std::optional + synthesize(PauliRotationTableau const& rotations) const = 0; }; -struct NaivePauliRotationsSynthesisStrategy : public PauliRotationsSynthesisStrategy { - std::optional synthesize(std::vector const& rotations) const override; +struct PartialSynthesisResult { + qcir::QCir qcir; + StabilizerTableau final_clifford; }; -struct TParPauliRotationsSynthesisStrategy : public PauliRotationsSynthesisStrategy { - std::optional synthesize(std::vector const& rotations) const override; +/** + * @brief Partial synthesis strategy for Pauli rotations. + * This strategy is used to synthesize a subset of Pauli rotations. + * The synthesized result is a partial result, + * which is a pair of a QCir and a StabilizerTableau. + * The QCir is the synthesized quantum circuit, + * and the StabilizerTableau is the final Clifford. + */ +struct PartialPauliRotationsSynthesisStrategy + : public PauliRotationsSynthesisStrategy { + ~PartialPauliRotationsSynthesisStrategy() override = default; + + virtual std::optional + partial_synthesize(PauliRotationTableau const& rotations) const = 0; +}; + +struct BackwardPartialPauliRotationsSynthesisStrategy + : public PartialPauliRotationsSynthesisStrategy { + ~BackwardPartialPauliRotationsSynthesisStrategy() override = default; + + virtual std::optional + backward_synthesize(PauliRotationTableau const& rotations, StabilizerTableau& initial_clifford) const = 0; }; -struct GraySynthPauliRotationsSynthesisStrategy : public PauliRotationsSynthesisStrategy { +struct NaivePauliRotationsSynthesisStrategy + : public PauliRotationsSynthesisStrategy { + std::optional + synthesize(PauliRotationTableau const& rotations) const override; +}; + +struct BasicPauliRotationsSynthesisStrategy + : public BackwardPartialPauliRotationsSynthesisStrategy { + std::optional + synthesize(PauliRotationTableau const& rotations) const override; + + std::optional + partial_synthesize(PauliRotationTableau const& rotations) const override { + StabilizerTableau final_clifford = StabilizerTableau{rotations.front().n_qubits()}; + auto qcir = _partial_synthesize(rotations, final_clifford, false); + if (!qcir.has_value()) { + return std::nullopt; + } + return PartialSynthesisResult{ + std::move(qcir.value()), + std::move(final_clifford)}; + } + + std::optional + backward_synthesize(PauliRotationTableau const& rotations, StabilizerTableau& initial_clifford) const override { + return _partial_synthesize(rotations, initial_clifford, true); + } + +private: + std::optional + _partial_synthesize(PauliRotationTableau const& rotations, StabilizerTableau& residual_clifford, bool backward) const; +}; + +struct GraySynthStrategy : public PartialPauliRotationsSynthesisStrategy { enum class Mode { star, staircase }; Mode mode; - GraySynthPauliRotationsSynthesisStrategy(Mode mode = Mode::star) : mode(mode) {} - std::optional synthesize(std::vector const& rotations) const override; + GraySynthStrategy(Mode mode = Mode::star) : mode(mode) {} + std::optional + synthesize(PauliRotationTableau const& rotations) const override; + + std::optional + partial_synthesize(PauliRotationTableau const& rotations) const override; }; /** @@ -44,21 +156,52 @@ struct GraySynthPauliRotationsSynthesisStrategy : public PauliRotationsSynthesis * https://arxiv.org/abs/2104.00934 * */ -struct MstSynthesisStrategy : public PauliRotationsSynthesisStrategy { - std::optional synthesize(std::vector const& rotations) const override; +struct MstSynthesisStrategy : public PartialPauliRotationsSynthesisStrategy { + std::optional + synthesize(PauliRotationTableau const& rotations) const override; + + std::optional + partial_synthesize(PauliRotationTableau const& rotations) const override; +}; + +struct GeneralizedMstSynthesisStrategy : public BackwardPartialPauliRotationsSynthesisStrategy { + std::optional + synthesize(PauliRotationTableau const& rotations) const override; + + std::optional + partial_synthesize(PauliRotationTableau const& rotations) const override { + StabilizerTableau final_clifford = StabilizerTableau{rotations.front().n_qubits()}; + auto qcir = _partial_synthesize(rotations, final_clifford, false); + if (!qcir.has_value()) { + return std::nullopt; + } + return PartialSynthesisResult{ + std::move(qcir.value()), + std::move(final_clifford)}; + } + + std::optional + backward_synthesize(PauliRotationTableau const& rotations, StabilizerTableau& initial_clifford) const override { + return _partial_synthesize(rotations, initial_clifford, true); + } + +private: + std::optional + _partial_synthesize(PauliRotationTableau const& rotations, StabilizerTableau& residual_clifford, bool backward) const; }; std::optional to_qcir( StabilizerTableau const& clifford, StabilizerTableauSynthesisStrategy const& strategy); std::optional to_qcir( - std::vector const& rotations, + PauliRotationTableau const& rotations, PauliRotationsSynthesisStrategy const& strategy); std::optional to_qcir( Tableau const& tableau, StabilizerTableauSynthesisStrategy const& st_strategy, - PauliRotationsSynthesisStrategy const& pr_strategy); + PauliRotationsSynthesisStrategy const& pr_strategy, + SynthesisType synthesis_type = SynthesisType::eager); -} // namespace experimental +} // namespace tableau } // namespace qsyn diff --git a/src/device/device.cpp b/src/device/device.cpp index 2acbf28c5..1449f01a7 100644 --- a/src/device/device.cpp +++ b/src/device/device.cpp @@ -13,77 +13,16 @@ #include #include -#include -#include #include #include -#include -#include #include -#include "qcir/basic_gate_type.hpp" -#include "qcir/qcir_gate.hpp" #include "qsyn/qsyn_type.hpp" #include "util/dvlab_string.hpp" #include "util/util.hpp" -using namespace qsyn::qcir; - -template <> -struct fmt::formatter { - constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); } - - template - auto format(qsyn::device::PhysicalQubit const& q, FormatContext& ctx) { - return fmt::format_to(ctx.out(), "Q{:>2}, logical: {:>2}, lock until {}", q.get_id(), q.get_logical_qubit(), q.get_occupied_time()); - } -}; - namespace qsyn::device { -/** - * @brief TEMPORARY SOLUTION! get gate delay as used by the Duostra algorithm - * This function should be rewritten to use the actual device information - * - * @param inst - * @return size_t - */ -size_t Device::get_delay(qcir::QCirGate const& inst) const { - if (inst.get_operation().get_type() == "swap") { - return 6; - } else if (inst.get_qubits().size() == 1) { - return 1; - } else if (inst.get_qubits().size() == 2) { - return 2; - } else { - return 5; - } -} - -// SECTION - Class Topology Member Functions - -/** - * @brief Get the information of a single adjacency pair - * - * @param a Id of first qubit - * @param b Id of second qubit - * @return Info& - */ -DeviceInfo const& Topology::get_adjacency_pair_info(size_t a, size_t b) { - if (a > b) std::swap(a, b); - return _adjacency_info[std::make_pair(a, b)]; -} - -/** - * @brief Get the information of a qubit - * - * @param a - * @return const Info& - */ -DeviceInfo const& Topology::get_qubit_info(size_t a) { - return _qubit_info[a]; -} - /** * @brief Add adjacency information of (a,b) * @@ -91,9 +30,14 @@ DeviceInfo const& Topology::get_qubit_info(size_t a) { * @param b Id of second qubit * @param info Information of this pair */ -void Topology::add_adjacency_info(size_t a, size_t b, DeviceInfo info) { - if (a > b) std::swap(a, b); - _adjacency_info[std::make_pair(a, b)] = info; +void Device::add_gate_info( + QubitPair const& qubit_id_pair, GateInfo info) { + _graph.add_vertex_with_id(qubit_id_pair.src, std::vector{}); + _graph.add_vertex_with_id(qubit_id_pair.dst, std::vector{}); + if (!_graph.has_edge(qubit_id_pair)) { + _graph.add_edge(qubit_id_pair.src, qubit_id_pair.dst, std::vector{}); + } + _graph.edge_attr(qubit_id_pair).emplace_back(info); } /** @@ -102,678 +46,46 @@ void Topology::add_adjacency_info(size_t a, size_t b, DeviceInfo info) { * @param a * @param info */ -void Topology::add_qubit_info(size_t a, DeviceInfo info) { - _qubit_info[a] = info; -} - -/** - * @brief Resize distance and predecessor lists - * - */ -void Topology::resize_to_num_qubit() { - _distance.resize(_num_qubit); - _predecessor.resize(_num_qubit); - - for (size_t i = 0; i < _num_qubit; i++) { - _distance[i].resize(_num_qubit); - _predecessor[i].resize(_num_qubit, max_qubit_id); - } -} - -/** - * @brief Initialize predecessor and distance lists - * - * @param adjacency_matrix - * @param qubit_list - */ -void Topology::_init_predecessor_and_distance(const std::vector>& adjacency_matrix, const std::vector& qubit_list) { - resize_to_num_qubit(); - for (size_t i = 0; i < _num_qubit; i++) { - for (size_t j = 0; j < _num_qubit; j++) { - _distance[i][j] = adjacency_matrix[i][j]; - if (_distance[i][j] != 0 && _distance[i][j] != _max_dist) { - _predecessor[i][j] = qubit_list[i].get_id(); - } - } - } -} - -/** - * @brief Set weight of edge used in Floyd-Warshall - * - * @param adjacency_matrix - * @param qubit_list - */ -void Topology::_set_weight(std::vector>& adjacency_matrix, const std::vector& qubit_list) const { - assert(adjacency_matrix.size() == _num_qubit); - for (size_t i = 0; i < _num_qubit; i++) { - for (auto const& adj : qubit_list[i].get_adjacencies()) { - adjacency_matrix[i][adj] = 1; - } - } -} - -/** - * @brief Floyd-Warshall Algorithm. Solve All Pairs Shortest Path (APSP) - * - * @param adjacency_matrix - * @param qubit_list - */ -void Topology::floyd_warshall(std::vector>& adjacency_matrix, const std::vector& qubit_list) { - _set_weight(adjacency_matrix, qubit_list); - _init_predecessor_and_distance(adjacency_matrix, qubit_list); - for (size_t k = 0; k < _num_qubit; k++) { - spdlog::debug("Including vertex({}):", k); - for (size_t i = 0; i < _num_qubit; i++) { - for (size_t j = 0; j < _num_qubit; j++) { - if ((_distance[i][j] > _distance[i][k] + _distance[k][j]) && (_distance[i][k] != _max_dist)) { - _distance[i][j] = _distance[i][k] + _distance[k][j]; - _predecessor[i][j] = _predecessor[k][j]; - } - } - } - - spdlog::debug("Predecessor Matrix:"); - for (auto& row : _predecessor) { - spdlog::debug("{:5}", fmt::join( - row | std::views::transform([](auto j) { return (j == max_qubit_id) ? std::string{"/"} : std::to_string(j); }), "")); - } - spdlog::debug("Distance Matrix:"); - for (auto& row : _distance) { - spdlog::debug("{:5}", fmt::join( - row | std::views::transform([this](size_t j) { return (j == _max_dist) ? std::string{"X"} : std::to_string(j); }), "")); - } - } -} - -/** - * @brief Print information of the edge (a,b) - * - * @param a Index of first qubit - * @param b Index of second qubit - */ -void Topology::print_single_edge(size_t a, size_t b) const { - auto query = (a < b) ? std::make_pair(a, b) : std::make_pair(b, a); - if (_adjacency_info.contains(query)) { - fmt::println("({:>3}, {:>3}) Delay: {:>8.3f} Error: {:>8.5f}", a, b, _adjacency_info.at(query)._time, _adjacency_info.at(query)._error); - } else { - fmt::println("No connection between {:>3} and {:>3}.", a, b); - } -} - -// SECTION - Class PhysicalQubit Member Functions - -/** - * @brief Operator overloading - * - * @param os - * @param q - * @return ostream& - */ -std::ostream& operator<<(std::ostream& os, PhysicalQubit const& q) { - return os << fmt::format("{}", q); -} - -/** - * @brief Mark qubit - * - * @param source false: from 0, true: from 1 - * @param pred predecessor - */ -void PhysicalQubit::mark(bool source, QubitIdType pred) { - _marked = true; - _source = source; - _pred = pred; -} - -/** - * @brief Take the route - * - * @param cost - * @param swapTime - */ -void PhysicalQubit::take_route(size_t cost, size_t swap_time) { - _cost = cost; - _swap_time = swap_time; - _taken = true; -} - -/** - * @brief Reset qubit - * - */ -void PhysicalQubit::reset() { - _marked = false; - _taken = false; - _cost = _occupied_time; +void Device::add_gate_info(size_t qubit_id, GateInfo info) { + _graph.add_vertex_with_id(qubit_id, std::vector{}); + _graph.vertex_attr(qubit_id).emplace_back(info); } -// SECTION - Class Device Member Functions - -/** - * @brief Get next swap cost - * - * @param source - * @param target - * @return tuple (index of next qubit, cost) - */ -std::tuple Device::get_next_swap_cost(QubitIdType source, QubitIdType target) { - auto const next_idx = _topology->get_predecessor(target, source); - auto const& q_source = get_physical_qubit(source); - auto const& q_next = get_physical_qubit(next_idx); - auto const cost = std::max(q_source.get_occupied_time(), q_next.get_occupied_time()); - - assert(q_source.is_adjacency(q_next)); - return {next_idx, cost}; +std::string Device::info_string() const { + return fmt::format("Device: {} ({} qubits)\n- Gate set: [{}]", _name, _graph.num_vertices(), fmt::join(_gate_set, ", ")); } -/** - * @brief Get physical qubit id by logical id - * - * @param id logical - * @return size_t - */ -QubitIdType Device::get_physical_by_logical(QubitIdType id) { - for (auto& phy : _qubit_list) { - if (phy.get_logical_qubit() == id) { - return phy.get_id(); - } +std::optional Device::gate_info_string(std::size_t qubit_id) const { + if (!_graph.has_vertex(qubit_id)) { + return std::nullopt; } - return max_qubit_id; -} - -/** - * @brief Add adjacency pair (a,b) - * - * @param a Id of first qubit - * @param b Id of second qubit - */ -void Device::add_adjacency(QubitIdType a, QubitIdType b) { - if (a > b) std::swap(a, b); - _qubit_list[a].add_adjacency(_qubit_list[b].get_id()); - _qubit_list[b].add_adjacency(_qubit_list[a].get_id()); - constexpr DeviceInfo default_info = {._time = 0.0, ._error = 0.0}; - _topology->add_adjacency_info(a, b, default_info); -} - -/** - * @brief Apply gate to device - * - * @param op - */ -void Device::apply_gate(qcir::QCirGate const& op, size_t time_begin) { - auto qubits = op.get_qubits(); - auto& q0 = get_physical_qubit(qubits[0]); - auto& q1 = get_physical_qubit(qubits[1]); - - if (op.get_operation() == SwapGate{}) { - auto temp = q0.get_logical_qubit(); - q0.set_logical_qubit(q1.get_logical_qubit()); - q1.set_logical_qubit(temp); - q0.set_occupied_time(time_begin + get_delay(op)); - q1.set_occupied_time(time_begin + get_delay(op)); - } else if (op.get_num_qubits() == 2) { - q0.set_occupied_time(time_begin + get_delay(op)); - q1.set_occupied_time(time_begin + get_delay(op)); - } else { - DVLAB_ASSERT(false, fmt::format("Unknown gate type ({}) at apply_gate()!!", op.get_operation().get_repr())); + std::string result = fmt::format("Qubit {} (adjacencies: [{}]):\n", qubit_id, fmt::join(get_adjacencies(qubit_id), ", ")); + for (auto const& [gate_idx, time, error] : _graph.vertex_attr(qubit_id)) { + // NOTE (Mu-Te): I think the longest gate name is "measure" with 7 + // characters. So we use 8 characters for padding. + result += fmt::format("- {:>8}: Delay: {:<.3e} (ns) Error: {:<.3e}\n", _gate_set[gate_idx], time.count(), error); } + return result; } -/** - * @brief get mapping of physical qubit - * - * @return vector (index of physical qubit) - */ -std::vector> Device::mapping() const { - std::vector> ret; - ret.resize(_qubit_list.size()); - for (auto const& [id, qubit] : tl::views::enumerate(_qubit_list)) { - ret[id] = qubit.get_logical_qubit(); +tl::expected Device::gate_info_string(QubitPair const& qubit_pair) const { + if (!_graph.has_vertex(qubit_pair.src)) { + return tl::unexpected(TwoQubitGateInfoAccessError::invalid_first_qubit_id); } - return ret; -} - -/** - * @brief Place logical qubit - * - * @param assign - */ -void Device::place(std::vector const& assignment) { - for (size_t i = 0; i < assignment.size(); ++i) { - assert(_qubit_list[assignment[i]].get_logical_qubit() == std::nullopt); - _qubit_list[assignment[i]].set_logical_qubit(i); + if (!_graph.has_vertex(qubit_pair.dst)) { + return tl::unexpected(TwoQubitGateInfoAccessError::invalid_second_qubit_id); } -} - -/** - * @brief Calculate Shortest Path - * - */ -void Device::calculate_path() { - _topology->clear_predecessor(); - _topology->clear_distance(); - - std::vector> adjacency_matrix; - adjacency_matrix.resize(get_num_qubits()); - - for (size_t i = 0; i < get_num_qubits(); i++) { - adjacency_matrix[i].resize(get_num_qubits(), default_max_dist); - for (size_t j = 0; j < get_num_qubits(); j++) { - if (i == j) - adjacency_matrix[i][j] = 0; - } - } - _topology->floyd_warshall(adjacency_matrix, _qubit_list); -} - -/** - * @brief Get shortest path from `s` to `t` - * - * @param s start - * @param t terminate - * @return vector& - */ -std::vector Device::get_path(QubitIdType src, QubitIdType dest) const { - std::vector path; - path.emplace_back(_qubit_list.at(src)); - if (src == dest) return path; - auto new_pred = _topology->get_predecessor(dest, src); - path.emplace_back(new_pred); - while (true) { - new_pred = _topology->get_predecessor(dest, new_pred); - if (new_pred == max_qubit_id) break; - path.emplace_back(_qubit_list.at(new_pred)); - } - return path; -} - -/** - * @brief Read Device - * - * @param filename - * @return true - * @return false - */ -bool Device::read_device(std::string const& filename) { - std::ifstream topo_file(filename); - if (!topo_file.is_open()) { - spdlog::error("Cannot open the file \"{}\"!!", filename); - return false; - } - std::string str = "", token = "", data = ""; - - // NOTE - Device name - while (str.empty()) { - std::getline(topo_file, str); - str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); - } - size_t token_end = dvlab::str::str_get_token(str, token, 0, ": "); - data = str.substr(token_end + 1); - - _topology->set_name(std::string{dvlab::str::trim_spaces(data)}); - - // NOTE - Qubit num - str = "", token = "", data = ""; - while (str.empty()) { - std::getline(topo_file, str); - str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); - } - token_end = dvlab::str::str_get_token(str, token, 0, ": "); - data = str.substr(token_end + 1); - data = dvlab::str::trim_spaces(data); - auto qbn = dvlab::str::from_string(data); - if (!qbn.has_value()) { - spdlog::error("The number of qubit is not a positive integer!!"); - return false; - } - _num_qubit = qbn.value(); - _topology->set_num_qubits(_num_qubit); - // NOTE - Gate set - str = "", token = "", data = ""; - while (str.empty()) { - std::getline(topo_file, str); - str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); - } - if (!_parse_gate_set(str)) return false; - - // NOTE - Coupling map - str = "", token = "", data = ""; - while (str.empty()) { - std::getline(topo_file, str); - str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); - } - - token_end = dvlab::str::str_get_token(str, token, 0, ": "); - data = str.substr(token_end + 1); - data = dvlab::str::trim_spaces(data); - data = dvlab::str::remove_brackets(data, '[', ']'); - std::vector> cx_err, cx_delay; - std::vector> adj_list; - std::vector sg_err, sg_delay; - if (!_parse_size_t_pairs(data, adj_list)) - return false; - - // NOTE - Parse Information - if (!_parse_info(topo_file, cx_err, cx_delay, sg_err, sg_delay)) return false; - - // NOTE - Finish parsing, store the topology - _qubit_list.reserve(adj_list.size()); - - for (size_t i = 0; i < adj_list.size(); ++i) { - _qubit_list.emplace_back(PhysicalQubit(i)); - } - - for (size_t i = 0; i < adj_list.size(); i++) { - for (size_t j = 0; j < adj_list[i].size(); j++) { - if (adj_list[i][j] > i) { - add_adjacency(i, adj_list[i][j]); - _topology->add_adjacency_info(i, adj_list[i][j], {._time = cx_delay[i][j], ._error = cx_err[i][j]}); - } - } - } - - assert(sg_err.size() == sg_delay.size()); - for (size_t i = 0; i < sg_err.size(); i++) { - _topology->add_qubit_info(i, {._time = sg_delay[i], ._error = sg_err[i]}); - } - - calculate_path(); - return true; -} - -/** - * @brief Parse gate set - * - * @param str - * @return true - * @return false - */ -bool Device::_parse_gate_set(std::string const& gate_set_str) { - std::string _; - auto const token_end = dvlab::str::str_get_token(gate_set_str, _, 0, ": "); - auto data = gate_set_str.substr(token_end + 1); - data = dvlab::str::trim_spaces(data); - data = dvlab::str::remove_brackets(data, '{', '}'); - auto gate_set_view = - dvlab::str::views::tokenize(data, ',') | - std::views::transform([](auto const& str) { return dvlab::str::tolower_string(str); }) | - std::views::transform([&](auto const& str) -> std::optional { - if (auto op = qcir::str_to_operation(str); op.has_value()) { - _topology->add_gate_type(op->get_repr().substr(0, op->get_repr().find_first_of('('))); - return std::make_optional(op->get_type()); - } - if (auto op = qcir::str_to_operation(str, {dvlab::Phase()}); op.has_value()) { - _topology->add_gate_type(op->get_repr().substr(0, op->get_repr().find_first_of('('))); - return std::make_optional(op->get_type()); - } - return std::nullopt; - }); - - return std::ranges::all_of(gate_set_view, [](auto const& gate_type) { return gate_type.has_value(); }); -} - -/** - * @brief Parse device information including SGERROR, SGTIME, CNOTERROR, and CNOTTIME - * - * @param f - * @param cxErr - * @param cxDelay - * @param sgErr - * @param sgDelay - * @return true - * @return false - */ -bool Device::_parse_info(std::ifstream& f, std::vector>& cx_error, std::vector>& cx_delay, std::vector& single_error, std::vector& single_delay) { - std::string str = "", token = ""; - while (true) { - while (str.empty()) { - if (f.eof()) break; - std::getline(f, str); - str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); - } - auto const token_end = dvlab::str::str_get_token(str, token, 0, ": "); - auto const data = dvlab::str::trim_spaces(str.substr(token_end + 1)); - - if (token == "SGERROR") { - if (!_parse_singles(std::string{data}, single_error)) return false; - } else if (token == "SGTIME") { - if (!_parse_singles(std::string{data}, single_delay)) return false; - } else if (token == "CNOTERROR") { - if (!_parse_float_pairs(std::string{data}, cx_error)) return false; - } else if (token == "CNOTTIME") { - if (!_parse_float_pairs(std::string{data}, cx_delay)) return false; - } - if (f.eof()) { - break; - } - std::getline(f, str); - str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); - } - - return true; -} - -/** - * @brief Parse device qubits information - * - * @param data - * @param container - * @return true - * @return false - */ -bool Device::_parse_singles(std::string const& data, std::vector& container) { - std::string const buffer = dvlab::str::remove_brackets(data, '[', ']'); - - for (auto const& token : dvlab::str::views::tokenize(buffer, ',')) { - auto fl = dvlab::str::from_string(dvlab::str::trim_spaces(token)); - if (!fl.has_value()) { - spdlog::error("The number `{}` is not a float!!", token); - return false; - } - container.emplace_back(fl.value()); - } - return true; -} - -/** - * @brief Parse device edges information with type is float - * - * @param data - * @param container - * @return true - * @return false - */ -bool Device::_parse_float_pairs(std::string const& data, std::vector>& containers) { - for (auto const& outer_token : dvlab::str::views::tokenize(data, '[')) { - std::string const buffer{outer_token.substr(0, outer_token.find_first_of(']'))}; - auto floats = - dvlab::str::views::tokenize(buffer, ',') | - std::views::transform([](auto const& str) { - auto result = dvlab::str::from_string(str); - if (!result.has_value()) { - spdlog::error("The number `{}` is not a float!!", str); - return std::optional{}; - } - return result; - }); - - if (std::ranges::any_of(floats, [](auto const& fl) { return !fl.has_value(); })) { - return false; - } - - containers.emplace_back(floats | std::views::transform([](auto const& fl) { return fl.value(); }) | tl::to()); - } - return true; -} - -/** - * @brief Parse device edges information with type is size_t - * - * @param data - * @param container - * @return true - * @return false - */ -bool Device::_parse_size_t_pairs(std::string const& data, std::vector>& containers) { - for (auto const& outer_token : dvlab::str::views::tokenize(data, '[')) { - std::string const buffer{outer_token.substr(0, outer_token.find_first_of(']'))}; - auto qubit_ids = - dvlab::str::views::tokenize(buffer, ',') | - std::views::transform([](auto const& str) { - auto result = dvlab::str::from_string(str); - if (!result.has_value()) { - spdlog::error("The number `{}` is not a positive integer!!", str); - return std::optional{}; - } - return result; - }); - - if (std::ranges::any_of(qubit_ids, [](auto const& fl) { return !fl.has_value(); })) { - return false; - } - - containers.emplace_back(qubit_ids | std::views::transform([](auto const& fl) { return fl.value(); }) | tl::to()); - } - - return true; -} - -/** - * @brief Print physical qubits and their adjacencies - * - * @param cand a vector of qubits to be printed - */ -void Device::print_qubits(std::vector candidates) const { - for (auto& c : candidates) { - if (c >= _num_qubit) { - spdlog::error("Error: the maximum qubit id is {}!!", _num_qubit - 1); - return; - } - } - fmt::println(""); - std::vector qubits; - qubits.resize(_num_qubit); - for (auto const& [idx, info] : tl::views::enumerate(_qubit_list)) { - qubits[idx] = info; - } - if (candidates.empty()) { - for (size_t i = 0; i < qubits.size(); i++) { - fmt::println("ID: {:>3} {}Adjs: {:>3}", i, _topology->get_qubit_info(i), fmt::join(qubits[i].get_adjacencies(), " ")); - } - fmt::println("Total #Qubits: {}", _num_qubit); - } else { - std::ranges::sort(candidates); - for (auto& p : candidates) { - fmt::println("ID: {:>3} {}Adjs: {:>3}", p, _topology->get_qubit_info(p), fmt::join(qubits[p].get_adjacencies(), " ")); - } - } -} - -/** - * @brief Print device edge - * - * @param cand Empty: print all. Single element [a]: print edges connecting to a. Two elements [a,b]: print edge (a,b). - */ -void Device::print_edges(std::vector candidates) const { - for (auto& c : candidates) { - if (c >= _num_qubit) { - spdlog::error("the maximum qubit id is {}!!", _num_qubit - 1); - return; - } - } - fmt::println(""); - std::vector qubits; - qubits.resize(_num_qubit); - for (auto const& [idx, info] : tl::views::enumerate(_qubit_list)) { - qubits[idx] = info; - } - if (candidates.empty()) { - size_t cnt = 0; - for (size_t i = 0; i < _num_qubit; i++) { - for (auto& q : qubits[i].get_adjacencies()) { - if (std::cmp_less(i, q)) { - cnt++; - _topology->print_single_edge(i, q); - } - } - } - assert(cnt == _topology->get_num_adjacencies()); - fmt::println("Total #Edges: {}", cnt); - } else if (candidates.size() == 1) { - for (auto& q : qubits[candidates[0]].get_adjacencies()) { - _topology->print_single_edge(candidates[0], q); - } - fmt::println("Total #Edges: {}", qubits[candidates[0]].get_adjacencies().size()); - } else if (candidates.size() == 2) { - _topology->print_single_edge(candidates[0], candidates[1]); - } -} - -/** - * @brief Print information of Topology - * - */ -void Device::print_topology() const { - fmt::println("Topology: {} ({} qubits, {} edges)", get_name(), _qubit_list.size(), _topology->get_num_adjacencies()); - auto const tmp = _topology->get_gate_set(); // circumvents g++ 11.4 compiler bug - fmt::println("Gate Set: {}", fmt::join(tmp | std::views::transform([](std::string const& gtype) { return dvlab::str::toupper_string(gtype); }), ", ")); -} - -/** - * @brief Print shortest path from `s` to `t` - * - * @param s start - * @param t terminate - */ -void Device::print_path(QubitIdType src, QubitIdType dest) const { - fmt::println(""); - for (auto& c : {src, dest}) { - if (std::cmp_greater_equal(c, _num_qubit)) { - spdlog::error("the maximum qubit id is {}!!", _num_qubit - 1); - return; - } - } - std::vector const& path = get_path(src, dest); - if (path.front().get_id() != src && path.back().get_id() != dest) - fmt::println("No path between {} and {}", src, dest); - else { - fmt::println("Path from {} to {}:", src, dest); - size_t cnt = 0; - for (auto& v : path) { - constexpr size_t num_cols = 10; - fmt::print("{:4} ", v.get_id()); - if (++cnt % num_cols == 0) fmt::println(""); - } - } -} - -/** - * @brief Print Mapping (Physical : Logical) - * - */ -void Device::print_mapping() { - fmt::println("----------Mapping---------"); - for (size_t i = 0; i < _num_qubit; i++) { - fmt::println("{:<5} : {}", i, _qubit_list[i].get_logical_qubit()); - } -} - -/** - * @brief Print device status - * - */ -void Device::print_status() const { - fmt::println("Device Status:"); - std::vector qubits; - qubits.resize(_num_qubit); - for (auto const& [idx, info] : tl::views::enumerate(_qubit_list)) { - qubits[idx] = info; + // this check must come after the above two checks to avoid undefined behavior + if (!_graph.has_edge(qubit_pair)) { + return tl::unexpected(TwoQubitGateInfoAccessError::invalid_qubit_pair); } - for (size_t i = 0; i < qubits.size(); ++i) { - fmt::println("{}", qubits[i]); + std::string result = fmt::format("Adjacency ({}, {}):\n", qubit_pair.src, qubit_pair.dst); + for (auto const& [gate_idx, time, error] : _graph.edge_attr(qubit_pair)) { + // NOTE (Mu-Te): I think the longest gate name is "measure" with 7 + // characters. So we use 8 characters for padding. + result += fmt::format("- {:>8}: Delay: {:<.3e} (ns) Error: {:<.3e}\n", _gate_set[gate_idx], time.count(), error); } - fmt::println(""); + return result; } } // namespace qsyn::device diff --git a/src/device/device.hpp b/src/device/device.hpp index 73fb687f1..935255fe6 100644 --- a/src/device/device.hpp +++ b/src/device/device.hpp @@ -9,35 +9,36 @@ #include +#include #include -#include #include +#include #include -#include "qcir/qcir_gate.hpp" #include "qsyn/qsyn_type.hpp" +#include "util/graph/digraph.hpp" #include "util/util.hpp" -namespace qsyn::qcir { -class QCirGate; -} - namespace qsyn::device { -class Device; -class Topology; -class PhysicalQubit; -struct DeviceInfo; +/** Gate delay in nanoseconds (float for fractional ns). */ +using GateDelayNanoSec = std::chrono::duration; + +struct GateInfo { + size_t gate_idx; // index of this gate in the _gate_set of the device + GateDelayNanoSec time; + float error; +}; -struct DeviceInfo { - float _time; - float _error; +enum struct TwoQubitGateInfoAccessError : uint8_t { + invalid_first_qubit_id, + invalid_second_qubit_id, + invalid_qubit_pair, }; -std::ostream& operator<<(std::ostream& os, DeviceInfo const& info); +std::ostream& operator<<(std::ostream& os, GateInfo const& info); -class Topology { - constexpr static size_t default_max_dist = 100000; +class Device { struct AdjacencyPairHash { size_t operator()(std::pair const& k) const { return ( @@ -48,152 +49,40 @@ class Topology { }; public: - using AdjacencyPair = std::pair; - using PhysicalQubitInfo = std::unordered_map; - using AdjacencyMap = std::unordered_map; - Topology() {} + virtual ~Device() = default; + using CouplingGraph = dvlab::Digraph, std::vector>; + using QubitPair = CouplingGraph::Edge; std::string get_name() const { return _name; } auto get_gate_set() const { return _gate_set; } - DeviceInfo const& get_adjacency_pair_info(size_t a, size_t b); - DeviceInfo const& get_qubit_info(size_t a); - size_t get_num_adjacencies() const { return _adjacency_info.size(); } - size_t get_predecessor(size_t dest, size_t src) { return _predecessor[dest][src]; } - void set_num_qubits(size_t n) { _num_qubit = n; } + size_t get_num_adjacencies() const { return _graph.num_edges(); } + size_t get_num_qubits() const { return _graph.num_vertices(); } void set_name(std::string n) { _name = std::move(n); } void add_gate_type(std::string const& gt) { _gate_set.emplace_back(gt); } - void add_adjacency_info(size_t a, size_t b, DeviceInfo info); - void add_qubit_info(size_t a, DeviceInfo info); + void add_gate_info(QubitPair const& qubit_id_pair, GateInfo info); + void add_gate_info(size_t qubit_id, GateInfo info); - void clear_predecessor() { _predecessor.clear(); } - void clear_distance() { _distance.clear(); } - void resize_to_num_qubit(); - void floyd_warshall(std::vector>& adjacency_matrix, const std::vector& qubit_list); + CouplingGraph const& get_coupling_graph() const { return _graph; } - void print_single_edge(size_t a, size_t b) const; + std::vector const& get_gate_info(QubitIdType qubit_id) const { return _graph.vertex_attr(qubit_id); } + std::vector const& get_gate_info(QubitPair const& qubit_pair) const { return _graph.edge_attr(qubit_pair); } -private: + CouplingGraph::NeighborSet const& get_adjacencies(size_t qubit_id) const { return _graph.out_neighbors(qubit_id); } + size_t get_num_adjacencies(QubitIdType qubit_id) const { return _graph.out_degree(qubit_id); } + bool is_adjacent(QubitPair const& qubit_pair) const { return _graph.has_edge(qubit_pair); } + bool is_adjacent(QubitIdType src, QubitIdType dst) const { return _graph.has_edge(src, dst); } + + virtual std::string info_string() const; + + std::optional gate_info_string(std::size_t qubit_id) const; + tl::expected gate_info_string(QubitPair const& qubit_pair) const; + +protected: std::string _name; - size_t _num_qubit{0}; std::vector _gate_set; - PhysicalQubitInfo _qubit_info; - AdjacencyMap _adjacency_info; - - // NOTE - Containers and helper functions for Floyd-Warshall - size_t _max_dist = default_max_dist; - std::vector> _predecessor; // _predecessor[i][j] = predecessor of j in path from i to j - std::vector> _distance; // _distance[i][j] = distance from i to j - void _set_weight(std::vector>& adjacency_matrix, const std::vector& qubit_list) const; - void _init_predecessor_and_distance(const std::vector>& adjacency_matrix, const std::vector& qubit_list); -}; - -class PhysicalQubit { -public: - using Adjacencies = std::vector; - PhysicalQubit() {} - PhysicalQubit(QubitIdType id) : _id(id) {} - - void set_id(QubitIdType id) { _id = id; } - void set_occupied_time(size_t t) { _occupied_time = t; } - void set_logical_qubit(std::optional id) { _logical_qubit = id; } - void add_adjacency(size_t adj) { _adjacencies.emplace_back(adj); } - - auto get_id() const { return _id; } - auto get_occupied_time() const { return _occupied_time; } - auto is_adjacency(PhysicalQubit const& pq) const { return dvlab::contains(_adjacencies, pq.get_id()); } - auto const& get_adjacencies() const { return _adjacencies; } - auto get_logical_qubit() const { return _logical_qubit; } - - // traversal - auto get_cost() const { return _cost; } - auto is_marked() const { return _marked; } - auto is_taken() const { return _taken; } - auto get_source() const { return _source; } - auto get_predecessor() const { return _pred; } - auto get_swap_time() const { return _swap_time; } - - // NOTE - Duostra functions - void mark(bool source, QubitIdType pred); - void take_route(size_t cost, size_t swap_time); - void reset(); - -private: - // NOTE - Device information - QubitIdType _id = max_qubit_id; - Adjacencies _adjacencies; - - // NOTE - Duostra parameter - std::optional _logical_qubit = std::nullopt; - size_t _occupied_time = 0; - - bool _marked = false; - QubitIdType _pred = 0; - size_t _cost = 0; - size_t _swap_time = 0; - bool _source = false; // false:0, true:1 - bool _taken = false; + CouplingGraph _graph; }; -class Device { -public: - using PhysicalQubitList = std::vector; - constexpr static size_t default_max_dist = 100000; - Device() : _topology{std::make_shared()} {} - - std::string get_name() const { return _topology->get_name(); } - size_t get_num_qubits() const { return _num_qubit; } - PhysicalQubitList const& get_physical_qubit_list() const { return _qubit_list; } - PhysicalQubit& get_physical_qubit(QubitIdType id) { return _qubit_list[id]; } - QubitIdType get_physical_by_logical(QubitIdType id); - std::tuple get_next_swap_cost(QubitIdType source, QubitIdType target); - bool qubit_id_exists(QubitIdType id) { return id < _qubit_list.size(); } - - void add_physical_qubit(PhysicalQubit q) { _qubit_list[q.get_id()] = std::move(q); } - void add_adjacency(QubitIdType a, QubitIdType b); - - // NOTE - Duostra - void apply_gate(qcir::QCirGate const& op, size_t time_begin); - std::vector> mapping() const; - void place(std::vector const& assignment); - - // NOTE - All Pairs Shortest Path - void calculate_path(); - std::vector get_path(QubitIdType src, QubitIdType dest) const; - - bool read_device(std::string const& filename); - - void print_qubits(std::vector candidates = {}) const; - void print_edges(std::vector candidates = {}) const; - void print_topology() const; - void print_predecessor() const; - void print_distance() const; - void print_path(QubitIdType src, QubitIdType dest) const; - void print_mapping(); - void print_status() const; - - size_t get_delay(qcir::QCirGate const& inst) const; - -private: - size_t _num_qubit = 0; - std::shared_ptr _topology; - PhysicalQubitList _qubit_list; - - // NOTE - Internal functions only used in reader - bool _parse_gate_set(std::string const& gate_set_str); - bool _parse_singles(std::string const& data, std::vector& container); - bool _parse_float_pairs(std::string const& data, std::vector>& containers); - bool _parse_size_t_pairs(std::string const& data, std::vector>& containers); - bool _parse_info(std::ifstream& f, std::vector>& cx_error, std::vector>& cx_delay, std::vector& single_error, std::vector& single_delay); -}; +std::optional read_qsyn_device_file(std::string const& filename); } // namespace qsyn::device - -template <> -struct fmt::formatter { - constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); } - - template - auto format(qsyn::device::DeviceInfo const& info, FormatContext& ctx) { - return fmt::format_to(ctx.out(), "Delay: {:>7.3} Error: {:7.3} ", info._time, info._error); - } -}; diff --git a/src/device/device_analysis.cpp b/src/device/device_analysis.cpp new file mode 100644 index 000000000..1c7b09414 --- /dev/null +++ b/src/device/device_analysis.cpp @@ -0,0 +1,159 @@ +/**************************************************************************** + PackageName [ device ] + Synopsis [ Floyd-Warshall and device analysis implementations ] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#include "device/device_analysis.hpp" + +#include +#include + +#include "util/graph/floyd_warshall.hpp" + +namespace qsyn::device { + +float default_floyd_warshall_cost(Device::QubitPair const& /*adj*/, Device const& /*device*/) { + return 1.f; +} + +/** + * @brief Additive cost function for Floyd-Warshall algorithm. + * Cost is -log2(1 - error) for the first gate info of the adjacency. + * Returns infinity when error >= 1 (broken/unusable coupling). + * @param adj Adjacency pair + * @param device Device + * @return Cost + */ +float log_success_rate_floyd_warshall_cost(Device::QubitPair const& adj, Device const& device) { + // assumes the first gate info is the only one for this adjacency + auto const& gate_info = device.get_gate_info(adj)[0]; + + if (1.f - gate_info.error <= 0.f) { + return std::numeric_limits::infinity(); + } + + return -std::log2(1.f - gate_info.error); +} + +/** + * @brief Floyd-Warshall APSP for the device coupling graph. + * Wraps cost_fn so broken couplings (error == 1) always get cost inf, then delegates to generic APSP. + */ +APSPResult floyd_warshall( + Device const& device, + std::function const& cost_fn) { + auto const edge_cost = [&](Device::QubitPair const& e) { + return (device.get_gate_info(e)[0].error == 1.f) + ? std::numeric_limits::infinity() + : cost_fn(e, device); + }; + return dvlab::floyd_warshall(device.get_coupling_graph(), edge_cost); +} + +std::vector get_eccentricities(APSPResult const& apsp, Device const& device) { + std::vector eccentricities(device.get_num_qubits(), std::numeric_limits::lowest()); + for (size_t i = 0; i < device.get_num_qubits(); i++) { + for (size_t j = 0; j < device.get_num_qubits(); j++) { + if (std::isinf(apsp.distance[i][j])) continue; + eccentricities[i] = std::max(eccentricities[i], apsp.distance[i][j]); + } + } + return eccentricities; +} + +/** + * @brief Get the centers of the device, i.e., arg min(max_i d(i, j)) where j is all other qubits + * @param eccentricities Eccentricities of the qubits + * @param filter_fn Function to filter the qubits. A qubit is only considered if filter_fn(qubit_id) returns true. + * @return Centers + */ +std::vector get_centers( + std::vector const& eccentricities, + std::function const& filter_fn) { + auto radius = std::numeric_limits::infinity(); + for (size_t i = 0; i < eccentricities.size(); i++) { + if (!filter_fn(i)) continue; + radius = std::min(radius, eccentricities[i]); + } + std::vector centers; + for (size_t i = 0; i < eccentricities.size(); i++) { + if (!filter_fn(i)) continue; + if (eccentricities[i] == radius) { + centers.push_back(i); + } + } + return centers; +} + +/** + * @brief Get the centers of the device, i.e., arg min(max_i d(i, j)) where j is all other qubits + * @param apsp APSPResult + * @param device Device + * @param filter_fn Function to filter the qubits. A qubit is only considered if filter_fn(qubit_id) returns true. + * @return Centers + */ +std::vector +get_centers( + APSPResult const& apsp, Device const& device, + std::function const& filter_fn) { + auto const eccentricities = get_eccentricities(apsp, device); + return get_centers(eccentricities, filter_fn); +} + +std::optional> get_shortest_path(APSPResult const& apsp, QubitIdType src, QubitIdType dest) { + std::vector path; + path.push_back(src); + while (src != dest) { + if (!apsp.predecessor[dest][src].has_value()) return std::nullopt; + src = apsp.predecessor[dest][src].value(); + path.push_back(src); + } + return path; +} + +QubitFilterFn accept_all_qubit_ids = [](QubitIdType const& /*qubit_id*/) { return true; }; + +/** + * @brief Get the connected components of the device. + * @param apsp APSPResult. This is used to check if two qubits are effectively + * connected. For example, if two qubits are connected but the APSP + * distance is infinite (e.g., due to broken couplings), + * this function will treat them as disconnected. + * @param device Device + * @return A vector of vector of qubit ID, where each vector contains qubits + that can reach each other. + */ +std::vector> +get_connected_components( + APSPResult const& apsp, + Device const& device, + QubitFilterFn const& filter_fn) { + std::vector> connected_components; + + std::vector visited(device.get_num_qubits(), false); + + for (size_t i = 0; i < device.get_num_qubits(); i++) { + if (!filter_fn(i) || visited[i]) continue; + // do DFS to find all qubits that can reach i + connected_components.push_back(std::vector()); + std::vector stack; + stack.push_back(i); + while (!stack.empty()) { + auto const current = stack.back(); + stack.pop_back(); + if (!filter_fn(current) || visited[current]) continue; + visited[current] = true; + connected_components.back().push_back(current); + for (auto const& neighbor : device.get_adjacencies(current)) { + if (std::isinf(apsp.distance[current][neighbor])) continue; + if (!visited[neighbor]) stack.push_back(neighbor); + } + } + std::ranges::sort(connected_components.back()); + } + return connected_components; +} + +} // namespace qsyn::device diff --git a/src/device/device_analysis.hpp b/src/device/device_analysis.hpp new file mode 100644 index 000000000..f03efd8a8 --- /dev/null +++ b/src/device/device_analysis.hpp @@ -0,0 +1,57 @@ +/**************************************************************************** + PackageName [ device ] + Synopsis [ Floyd-Warshall and device analysis utilities ] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#pragma once + +#include +#include +#include +#include + +#include "device/device.hpp" +#include "qsyn/qsyn_type.hpp" +#include "util/graph/floyd_warshall.hpp" + +namespace qsyn::device { + +using APSPResult = dvlab::APSPResult; + +using APSPCostFnType = std::function; + +float default_floyd_warshall_cost(Device::QubitPair const& /*adj*/, Device const& /*device*/); +float log_success_rate_floyd_warshall_cost(Device::QubitPair const& adj, Device const& device); + +APSPResult floyd_warshall( + Device const& device, + APSPCostFnType const& cost_fn = default_floyd_warshall_cost); + +std::vector get_eccentricities(APSPResult const& apsp, Device const& device); + +using QubitFilterFn = std::function; + +extern QubitFilterFn accept_all_qubit_ids; + +std::vector +get_centers( + std::vector const& eccentricities, + QubitFilterFn const& filter_fn = accept_all_qubit_ids); + +std::vector +get_centers( + APSPResult const& apsp, + Device const& device, + QubitFilterFn const& filter_fn = accept_all_qubit_ids); + +std::optional> get_shortest_path(APSPResult const& apsp, QubitIdType src, QubitIdType dest); + +std::vector> +get_connected_components( + APSPResult const& apsp, + Device const& device, + QubitFilterFn const& filter_fn = accept_all_qubit_ids); + +} // namespace qsyn::device diff --git a/src/device/ibmq_devices.cpp b/src/device/ibmq_devices.cpp new file mode 100644 index 000000000..9a48b80ec --- /dev/null +++ b/src/device/ibmq_devices.cpp @@ -0,0 +1,339 @@ +/**************************************************************************** + PackageName [ device ] + Synopsis [ Define class IBMQDevices and fetching functions ] + Author [ Mu-Te (Joshua) Lau] + Copyright [ Copyright(c) 2026 PARAG@N Lab, CS, Northwestern U, IL, USA ] +****************************************************************************/ + +#include "ibmq_devices.hpp" + +#include +#include + +#include +#include +#include +#include +#include + +#include "util/sysdep.hpp" +#include "util/tmp_files.hpp" + +namespace qsyn::device { + +namespace { + +// Parse ISO8601 datetime (e.g. "2026-02-15T14:29:39-06:00" or "2026-02-15T20:29:39Z") into UTC. +auto parse_iso8601(std::string s) -> std::chrono::sys_seconds { + if (!s.empty() && s.back() == 'Z') { + s.pop_back(); + s += "+0000"; + } + // date::parse %z expects offset without colon (e.g. -0600 not -06:00) + if (s.size() >= 6 && s[s.size() - 3] == ':') + s.erase(s.size() - 3, 1); + + std::istringstream in{s}; + std::chrono::sys_seconds tp; + + in >> date::parse("%FT%T%z", tp); + + if (in.fail()) + throw std::runtime_error("Invalid ISO8601 datetime"); + + return tp; +} + +auto format_iso8601_utc(std::chrono::sys_seconds tp) -> std::string { + return date::format("%Y-%m-%d %H:%M:%S", tp) + " UTC"; +} + +// Format UTC time for display in the user's local timezone. +auto format_iso8601_local(std::chrono::sys_seconds tp) -> std::string { + auto const secs = tp.time_since_epoch().count(); + auto t = static_cast(secs); + if (static_cast(t) != secs) + return format_iso8601_utc(tp); // overflow, fallback to UTC + std::tm local{}; + + // try to retrieve the local time zone +#if defined(_WIN32) + if (localtime_s(&local, &t) != 0) + return format_iso8601_utc(tp); +#else + if (localtime_r(&t, &local) == nullptr) + return format_iso8601_utc(tp); +#endif + std::array buf{}; + // try to format the local time + // if this returns 0, it either means the local time formatting is invalid + // or there is no specialized printing for the time zone + if (std::strftime(buf.data(), buf.size(), "%Y-%m-%d %H:%M:%S", &local) == 0) + return format_iso8601_utc(tp); + return std::string{buf.data()}; +} + +auto find_gate_parameter(nlohmann::json const& gate, std::string const& name) + -> std::optional { + for (auto const& param : gate["parameters"]) { + if (param["name"].get() == name) { + return param["value"].get(); + } + } + return std::nullopt; +} + +void parse_basic_info(IBMQDeviceJsons const& jsons, IBMQDevice& device) { + auto const& [source, device_json, properties_json] = jsons; + + device.json_source = source; + + device.set_name(device_json["backend_name"].get()); + device.backend_version = device_json["backend_version"].get(); + device.last_update_time = parse_iso8601(properties_json["last_update_date"]["__value__"].get()); +} + +void parse_gates(IBMQDeviceJsons const& jsons, IBMQDevice& device) { + auto const& [source, device_json, properties_json] = jsons; + + // parse gate set + std::unordered_map gate_name_to_idx; + size_t gate_idx = 0; + + // parse per gate delay and error + for (auto const& gate : properties_json["gates"]) { + // NOTE: the device_json basis gate list is not reliable at all + // We just parse the gate types by walking through the properties_json + auto const gate_name = gate["gate"].get(); + if (!gate_name_to_idx.contains(gate_name)) { + device.add_gate_type(gate_name); + gate_name_to_idx.emplace(gate_name, gate_idx); + gate_idx++; + } + auto const gate_idx = gate_name_to_idx.at(gate_name); + GateInfo gate_info{ + .gate_idx = gate_idx, + .time = GateDelayNanoSec{0.0f}, + .error = 0.0f}; + + if (auto gate_error = find_gate_parameter(gate, "gate_error")) { + gate_info.error = *gate_error; + } + if (auto gate_length = find_gate_parameter(gate, "gate_length")) { + gate_info.time = GateDelayNanoSec{*gate_length}; + } + + auto const qubits = gate["qubits"].get>(); + if (qubits.size() == 1) { + device.add_gate_info(qubits[0], gate_info); + } else if (qubits.size() == 2) { + device.add_gate_info(Device::QubitPair{qubits[0], qubits[1]}, gate_info); + } + } +} + +} // namespace + +auto read_ibmq_device(IBMQDeviceJsons const& jsons) + -> std::optional { + IBMQDevice device; + + try { + parse_basic_info(jsons, device); + parse_gates(jsons, device); + } catch (const nlohmann::json::exception& e) { + spdlog::error("Failed to parse IBMQ device: {}", e.what()); + return std::nullopt; + } + + return device; +} + +auto IBMQDevice::info_string() const -> std::string { + std::string source_str; + switch (json_source) { + case IBMQDeviceJsonsSource::real: + source_str = "realtime"; + break; + case IBMQDeviceJsonsSource::cached: + source_str = "cache"; + break; + case IBMQDeviceJsonsSource::fake: + source_str = "fake backend"; + break; + case IBMQDeviceJsonsSource::unknown: + default: + source_str = "unknown"; + break; + } + auto result = fmt::format("IBMQ Device: {} ({} qubits)\n", + get_name(), + get_num_qubits()); + result += fmt::format("- Backend version: {}\n", backend_version); + result += fmt::format("- Last updated: {}\n", format_iso8601_local(last_update_time)); + result += fmt::format("- Source: {}\n", source_str); + result += fmt::format("- Gate set: [{}]\n", fmt::join(get_gate_set(), ", ")); + + return result; +} + +auto load_ibmq_devices_jsons(std::filesystem::path const& device_path, + std::filesystem::path const& properties_path, + IBMQDeviceJsonsSource source) + -> std::optional { + if (!std::filesystem::exists(device_path)) { + spdlog::error("Device file {} does not exist", device_path.string()); + return std::nullopt; + } + if (!std::filesystem::exists(properties_path)) { + spdlog::error("Properties file {} does not exist", properties_path.string()); + return std::nullopt; + } + try { + return IBMQDeviceJsons{ + .source = source, + .device_json = nlohmann::json::parse(std::ifstream(device_path)), + .properties_json = nlohmann::json::parse(std::ifstream(properties_path)), + }; + } catch (const nlohmann::json::exception& e) { + spdlog::error("Failed to parse JSON file {}: {}", device_path.string(), e.what()); + return std::nullopt; + } +} + +/** + * Fetch the attributes of an IBM backend and save them to nlohmann::json objects + * @param backend_name the name of the IBM backend + * @param fake whether to use a fake backend + * @return the attributes of the IBM backend + */ +auto fetch_ibmq_device_attrs(std::string_view backend_name, bool fake) + -> std::optional { + auto const tmp_dir = dvlab::utils::TmpDir(); + + auto const home_dir = dvlab::utils::get_home_directory(); + if (!home_dir) { + spdlog::critical("Cannot find home directory"); + return std::nullopt; + } + + auto const query_backend_name = [&]() { + auto base = backend_name.starts_with("ibm_") ? backend_name.substr(4) : backend_name; + if (fake && base.starts_with("fake_")) + base = base.substr(5); + return fake ? "fake_" + std::string(base) : "ibm_" + std::string(base); + }(); + + auto const device_file_path = query_backend_name + ".json"; + auto const device_file_props_path = query_backend_name + "_properties.json"; + + auto const script_path = "scripts/get_ibm_backend_attrs.py"; + auto args = std::vector{ + query_backend_name, "-o", tmp_dir.path().string()}; + if (fake) { + args.push_back("-f"); + } + auto const result = dvlab::utils::uv_run_script(script_path, args); + + if (result != 0) { + return std::nullopt; + } + + return load_ibmq_devices_jsons( + tmp_dir.path() / device_file_path, + tmp_dir.path() / device_file_props_path, + fake + ? IBMQDeviceJsonsSource::fake + : IBMQDeviceJsonsSource::real); +} + +auto fetch_ibmq_device_attrs_with_fallback( + std::string_view backend_name, + bool fake, + bool cached, + std::optional const& cache_dir) + -> std::optional { + auto const backend_name_without_ibm = + backend_name.starts_with("ibm_") ? backend_name.substr(4) : backend_name; + auto const real_backend_name = "ibm_" + std::string(backend_name_without_ibm); + auto const fake_backend_name = "fake_" + std::string(backend_name_without_ibm); + + if (fake) { + return fetch_ibmq_device_attrs(fake_backend_name, true); + } + + if (cache_dir.has_value()) { + if (cache_dir->empty()) { + spdlog::error("Cache dir path is empty"); + return std::nullopt; + } + if (std::filesystem::exists(*cache_dir) && + !std::filesystem::is_directory(*cache_dir)) { + spdlog::error("Cache dir is not a directory: {}", + cache_dir->string()); + return std::nullopt; + } + } + + auto const device_file_path = real_backend_name + ".json"; + auto const device_file_props_path = real_backend_name + "_properties.json"; + + if (cached && cache_dir.has_value()) { + auto const device_path = *cache_dir / device_file_path; + auto const props_path = *cache_dir / device_file_props_path; + if (std::filesystem::exists(device_path) && + std::filesystem::exists(props_path)) { + return load_ibmq_devices_jsons( + device_path, props_path, IBMQDeviceJsonsSource::cached); + } + } + + auto tmp_dir = dvlab::utils::TmpDir(); + constexpr auto script_path = "scripts/get_ibm_backend_attrs.py"; + std::vector args = {real_backend_name, "-o", + tmp_dir.path().string()}; + + if (dvlab::utils::uv_run_script(script_path, args) == 0) { + auto result = load_ibmq_devices_jsons( + tmp_dir.path() / device_file_path, + tmp_dir.path() / device_file_props_path, + IBMQDeviceJsonsSource::real); + if (result && cache_dir.has_value()) { + std::filesystem::create_directories(*cache_dir); + std::filesystem::copy( + tmp_dir.path() / device_file_path, + *cache_dir / device_file_path, + std::filesystem::copy_options::overwrite_existing); + std::filesystem::copy( + tmp_dir.path() / device_file_props_path, + *cache_dir / device_file_props_path, + std::filesystem::copy_options::overwrite_existing); + } + return result; + } + + if (cached) { + // if cached is true, we have already checked + return std::nullopt; + } + + if (cache_dir.has_value()) { + auto const cached_device_path = *cache_dir / device_file_path; + auto const cached_props_path = *cache_dir / device_file_props_path; + if (std::filesystem::exists(cached_device_path) && + std::filesystem::exists(cached_props_path)) { + return load_ibmq_devices_jsons( + cached_device_path, cached_props_path, + IBMQDeviceJsonsSource::cached); + } + } + + auto fake_result = fetch_ibmq_device_attrs(fake_backend_name, true); + if (fake_result) { + return fake_result; + } + + return std::nullopt; +} + +} // namespace qsyn::device diff --git a/src/device/ibmq_devices.hpp b/src/device/ibmq_devices.hpp new file mode 100644 index 000000000..ad5779c47 --- /dev/null +++ b/src/device/ibmq_devices.hpp @@ -0,0 +1,57 @@ +/**************************************************************************** + PackageName [ device ] + Synopsis [ Define class IBMQDevices and fetching functions ] + Author [ Mu-Te (Joshua) Lau] + Copyright [ Copyright(c) 2026 PARAG@N Lab, CS, Northwestern U, IL, USA ] +****************************************************************************/ + +#pragma once + +#include +#include +#include +#include + +#include "device/device.hpp" + +namespace qsyn::device { + +enum struct IBMQDeviceJsonsSource : std::uint8_t { + real, + fake, + cached, + unknown, +}; + +struct IBMQDeviceJsons { + IBMQDeviceJsonsSource source; + nlohmann::json device_json; + nlohmann::json properties_json; +}; + +struct IBMQDevice : public Device { + std::string backend_version; + std::chrono::sys_seconds last_update_time; + IBMQDeviceJsonsSource json_source; + + std::string info_string() const override; +}; + +auto read_ibmq_device(IBMQDeviceJsons const& jsons) -> std::optional; + +auto load_ibmq_devices_jsons(std::filesystem::path const& device_path, + std::filesystem::path const& properties_path, + IBMQDeviceJsonsSource source = IBMQDeviceJsonsSource::unknown) + -> std::optional; + +auto fetch_ibmq_device_attrs(std::string_view backend_name, bool fake = false) + -> std::optional; + +auto fetch_ibmq_device_attrs_with_fallback( + std::string_view backend_name, + bool fake = false, + bool cached = false, + std::optional const& cache_dir = std::nullopt) + -> std::optional; + +} // namespace qsyn::device diff --git a/src/device/qsyn_device_file.cpp b/src/device/qsyn_device_file.cpp new file mode 100644 index 000000000..fbc090ceb --- /dev/null +++ b/src/device/qsyn_device_file.cpp @@ -0,0 +1,317 @@ +/**************************************************************************** + PackageName [ device ] + Synopsis [ Implement reading of Qsyn's native device file ] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "device/device.hpp" +#include "qcir/basic_gate_type.hpp" // IWYU pragma: keep +#include "qcir/qcir_gate.hpp" // IWYU pragma: keep +#include "qsyn/qsyn_type.hpp" +#include "util/dvlab_string.hpp" +#include "util/util.hpp" // IWYU pragma: keep + +namespace qsyn::device { + +// details for reading qsyn device file +namespace { + +// Gate indices for one-qubit and two-qubit gates +struct GateIndices { + std::vector one_qubit_gate_idxs; + std::vector two_qubit_gate_idxs; +}; + +// Parse gate set from device file +std::optional +parse_gate_set(std::string const& gate_set_str, Device& device) { + std::string _; + auto const token_end = dvlab::str::str_get_token(gate_set_str, _, 0, ": "); + auto data = gate_set_str.substr(token_end + 1); + data = dvlab::str::trim_spaces(data); + data = dvlab::str::remove_brackets(data, '{', '}'); + + GateIndices gate_idxs; + + auto gate_type_view = + dvlab::str::views::tokenize(data, ',') | + std::views::transform([](auto const& str) { return dvlab::str::tolower_string(str); }); + + size_t gate_idx = 0; + auto const process_op = [&](auto const& op_opt, std::string const& gate_type) -> bool { + if (!op_opt.has_value()) { + return false; + } + + auto const& op = *op_opt; + if (op.get_num_qubits() == 1) { + gate_idxs.one_qubit_gate_idxs.emplace_back(gate_idx); + } else if (op.get_num_qubits() == 2) { + gate_idxs.two_qubit_gate_idxs.emplace_back(gate_idx); + } else { + spdlog::error("Unsupported gate type ({})!!", gate_type); + spdlog::error("Only one-qubit and two-qubit gates are supported for device"); + return false; + } + + device.add_gate_type(op.get_repr().substr(0, op.get_repr().find_first_of('('))); + return true; + }; + + for (auto const& gate_type : gate_type_view) { + if (!process_op(qcir::str_to_operation(gate_type), gate_type) && + !process_op(qcir::str_to_operation(gate_type, {dvlab::Phase()}), gate_type)) { + return std::nullopt; + } + gate_idx++; + } + + return gate_idxs; +} + +/** + * @brief Parse device qubits information + * + * @param data + * @param container + * @return true + * @return false + */ +bool parse_singles(std::string const& data, std::vector& container) { + std::string const buffer = dvlab::str::remove_brackets(data, '[', ']'); + + for (auto const& token : dvlab::str::views::tokenize(buffer, ',')) { + auto fl = dvlab::str::from_string(dvlab::str::trim_spaces(token)); + if (!fl.has_value()) { + spdlog::error("The number `{}` is not a float!!", token); + return false; + } + container.emplace_back(fl.value()); + } + return true; +} + +/** + * @brief Parse device edges information with type is float + * + * @param data + * @param containers + * @return true + * @return false + */ +bool parse_float_pairs(std::string const& data, std::vector>& containers) { + for (auto const& outer_token : dvlab::str::views::tokenize(data, '[')) { + std::string const buffer{outer_token.substr(0, outer_token.find_first_of(']'))}; + auto floats = + dvlab::str::views::tokenize(buffer, ',') | + std::views::transform([](auto const& str) { + auto result = dvlab::str::from_string(str); + if (!result.has_value()) { + spdlog::error("The number `{}` is not a float!!", str); + return std::optional{}; + } + return result; + }); + + if (std::ranges::any_of(floats, [](auto const& fl) { return !fl.has_value(); })) { + return false; + } + + containers.emplace_back(floats | std::views::transform([](auto const& fl) { return fl.value(); }) | tl::to()); + } + return true; +} + +/** + * @brief Parse device edges information with type size_t + * + * @param data + * @param containers + * @return true + * @return false + */ +bool parse_size_t_pairs(std::string const& data, std::vector>& containers) { + for (auto const& outer_token : dvlab::str::views::tokenize(data, '[')) { + std::string const buffer{outer_token.substr(0, outer_token.find_first_of(']'))}; + auto qubit_ids = + dvlab::str::views::tokenize(buffer, ',') | + std::views::transform([](auto const& str) { + auto result = dvlab::str::from_string(str); + if (!result.has_value()) { + spdlog::error("The number `{}` is not a positive integer!!", str); + return std::optional{}; + } + return result; + }); + + if (std::ranges::any_of(qubit_ids, [](auto const& fl) { return !fl.has_value(); })) { + return false; + } + + containers.emplace_back(qubit_ids | std::views::transform([](auto const& fl) { return fl.value(); }) | tl::to()); + } + + return true; +} + +/** + * @brief Parse device information including SGERROR, SGTIME, CNOTERROR, and CNOTTIME + * + * @param f + * @param cx_error + * @param cx_delay + * @param single_error + * @param single_delay + * @return true + * @return false + */ +bool parse_info(std::ifstream& f, std::vector>& cx_error, std::vector>& cx_delay, std::vector& single_error, std::vector& single_delay) { + std::string str = "", token = ""; + while (true) { + while (str.empty()) { + if (f.eof()) break; + std::getline(f, str); + str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); + } + auto const token_end = dvlab::str::str_get_token(str, token, 0, ": "); + auto const data = dvlab::str::trim_spaces(str.substr(token_end + 1)); + + if (token == "SGERROR") { + if (!parse_singles(std::string{data}, single_error)) return false; + } else if (token == "SGTIME") { + if (!parse_singles(std::string{data}, single_delay)) return false; + } else if (token == "CNOTERROR") { + if (!parse_float_pairs(std::string{data}, cx_error)) return false; + } else if (token == "CNOTTIME") { + if (!parse_float_pairs(std::string{data}, cx_delay)) return false; + } + if (f.eof()) { + break; + } + std::getline(f, str); + str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); + } + + return true; +} +} // namespace + +/** + * @brief Read Qsyn device file and return a Device. + * + * @param filename + * @return std::optional The parsed device, or std::nullopt on failure. + */ +std::optional read_qsyn_device_file(std::string const& filename) { + std::ifstream topo_file(filename); + if (!topo_file.is_open()) { + spdlog::error("Cannot open the file \"{}\"!!", filename); + return std::nullopt; + } + std::string str = "", token = "", data = ""; + + // NOTE - Device name + while (str.empty()) { + std::getline(topo_file, str); + str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); + } + size_t token_end = dvlab::str::str_get_token(str, token, 0, ": "); + data = str.substr(token_end + 1); + + Device device; + device.set_name(std::string{dvlab::str::trim_spaces(data)}); + + // NOTE - Qubit num + str = "", token = "", data = ""; + while (str.empty()) { + std::getline(topo_file, str); + str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); + } + token_end = dvlab::str::str_get_token(str, token, 0, ": "); + data = str.substr(token_end + 1); + data = dvlab::str::trim_spaces(data); + auto qbn = dvlab::str::from_string(data); + if (!qbn.has_value()) { + spdlog::error("The number of qubit is not a positive integer!!"); + return std::nullopt; + } + // NOTE - Gate set + str = "", token = "", data = ""; + while (str.empty()) { + std::getline(topo_file, str); + str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); + } + + auto gate_idxs = parse_gate_set(str, device); + if (!gate_idxs.has_value()) return std::nullopt; + auto const& [one_qubit_gate_idxs, two_qubit_gate_idxs] = gate_idxs.value(); + + // NOTE - Coupling map + str = "", token = "", data = ""; + while (str.empty()) { + std::getline(topo_file, str); + str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); + } + + token_end = dvlab::str::str_get_token(str, token, 0, ": "); + data = str.substr(token_end + 1); + data = dvlab::str::trim_spaces(data); + data = dvlab::str::remove_brackets(data, '[', ']'); + std::vector> cx_err, cx_delay; + std::vector> adj_list; + std::vector sg_err, sg_delay; + if (!parse_size_t_pairs(data, adj_list)) + return std::nullopt; + + // NOTE - Parse Information + if (!parse_info(topo_file, cx_err, cx_delay, sg_err, sg_delay)) return std::nullopt; + + for (size_t i = 0; i < adj_list.size(); i++) { + for (size_t j = 0; j < adj_list[i].size(); j++) { + if (adj_list[i][j] > i) { + // NOTE - Qsyn's device file format does not specify per gate type delays and errors. + // Therefore, we assume all two-qubit gates have the same delays and errors. + for (auto const& gate_idx : two_qubit_gate_idxs) { + // NOTE - Qsyn's device file format does not take into account the fact that G(a, b) and G(b, a) + // might have different delays and errors. + // We will pretend they do for backward compatibility. + device.add_gate_info( + Device::QubitPair{i, adj_list[i][j]}, GateInfo{.gate_idx = gate_idx, .time = GateDelayNanoSec{cx_delay[i][j]}, .error = cx_err[i][j]}); + device.add_gate_info( + Device::QubitPair{adj_list[i][j], i}, GateInfo{.gate_idx = gate_idx, .time = GateDelayNanoSec{cx_delay[i][j]}, .error = cx_err[i][j]}); + } + } + } + } + + assert(sg_err.size() == sg_delay.size()); + for (size_t i = 0; i < sg_err.size(); i++) { + // NOTE - Qsyn's device file format does not specify per gate type delays and errors. + // Therefore, we assume all one-qubit gates have the same delays and errors. + for (auto const& gate_idx : one_qubit_gate_idxs) { + device.add_gate_info(i, GateInfo{.gate_idx = gate_idx, + .time = GateDelayNanoSec{sg_delay[i]}, + .error = sg_err[i]}); + } + } + + return device; +} + +} // namespace qsyn::device diff --git a/src/duostra/device_state.cpp b/src/duostra/device_state.cpp new file mode 100644 index 000000000..98e7d0239 --- /dev/null +++ b/src/duostra/device_state.cpp @@ -0,0 +1,164 @@ +/**************************************************************************** + PackageName [ duostra ] + Synopsis [ PhysicalQubitState and DeviceState implementations ] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#include "duostra/device_state.hpp" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "device/device_analysis.hpp" +#include "qcir/basic_gate_type.hpp" +#include "qcir/qcir_gate.hpp" +#include "qsyn/qsyn_type.hpp" +#include "util/util.hpp" + +using namespace qsyn::qcir; + +namespace qsyn::duostra { + +/** + * @brief TEMPORARY SOLUTION! get gate delay as used by the Duostra algorithm + * This function should be rewritten to use the actual device information + */ +size_t DeviceState::get_delay(qcir::QCirGate const& inst) const { + if (inst.get_operation().get_type() == "swap") { + return 6; + } else if (inst.get_qubits().size() == 1) { + return 1; + } else if (inst.get_qubits().size() == 2) { + return 2; + } else { + return 5; + } +} + +std::ostream& operator<<(std::ostream& os, PhysicalQubitState const& q) { + return os << fmt::format("{}", q); +} + +void PhysicalQubitState::mark(bool source, QubitIdType pred) { + _marked = true; + _source = source; + _pred = pred; +} + +void PhysicalQubitState::take_route(size_t cost, size_t swap_time) { + _cost = cost; + _swap_time = swap_time; + _taken = true; +} + +void PhysicalQubitState::reset() { + _marked = false; + _taken = false; + _cost = _occupied_time; +} + +DeviceState::DeviceState(device::Device device) : _device(std::make_shared(std::move(device))) { + _qubit_list.reserve(_device->get_num_qubits()); + for (size_t i = 0; i < _device->get_num_qubits(); ++i) { + _qubit_list.emplace_back(PhysicalQubitState(i)); + } + calculate_path(); +} + +std::tuple DeviceState::get_next_swap_cost(QubitIdType source, QubitIdType target) { + DVLAB_ASSERT(static_cast(_apsp), "APSPResult not initialized; call calculate_path() first."); + auto const& predecessor = _apsp->predecessor; + auto const next_idx_opt = predecessor[target][source]; + DVLAB_ASSERT(next_idx_opt.has_value(), fmt::format("No path between {} and {} in get_next_swap_cost()", source, target)); + auto const next_idx = next_idx_opt.value(); + auto const& q_source = get_physical_qubit(source); + auto const& q_next = get_physical_qubit(next_idx); + auto const cost = std::max(q_source.get_occupied_time(), q_next.get_occupied_time()); + + assert(_device->is_adjacent(source, next_idx)); + return {next_idx, cost}; +} + +QubitIdType DeviceState::get_physical_by_logical(QubitIdType id) { + for (auto& phy : _qubit_list) { + if (phy.get_logical_qubit() == id) { + return phy.get_id(); + } + } + return max_qubit_id; +} + +void DeviceState::apply_gate(qcir::QCirGate const& op, size_t time_begin) { + auto qubits = op.get_qubits(); + auto& q0 = get_physical_qubit(qubits[0]); + auto& q1 = get_physical_qubit(qubits[1]); + + if (op.get_operation() == SwapGate{}) { + auto temp = q0.get_logical_qubit(); + q0.set_logical_qubit(q1.get_logical_qubit()); + q1.set_logical_qubit(temp); + q0.set_occupied_time(time_begin + get_delay(op)); + q1.set_occupied_time(time_begin + get_delay(op)); + } else if (op.get_num_qubits() == 2) { + q0.set_occupied_time(time_begin + get_delay(op)); + q1.set_occupied_time(time_begin + get_delay(op)); + } else { + DVLAB_ASSERT(false, fmt::format("Unknown gate type ({}) at apply_gate()!!", op.get_operation().get_repr())); + } +} + +std::vector> DeviceState::mapping() const { + std::vector> ret; + ret.resize(_qubit_list.size()); + for (auto const& [id, qubit] : tl::views::enumerate(_qubit_list)) { + ret[id] = qubit.get_logical_qubit(); + } + return ret; +} + +void DeviceState::place(std::vector const& assignment) { + for (size_t i = 0; i < assignment.size(); ++i) { + assert(_qubit_list[assignment[i]].get_logical_qubit() == std::nullopt); + _qubit_list[assignment[i]].set_logical_qubit(i); + } +} + +void DeviceState::calculate_path() { + if (!_apsp) { + _apsp = std::make_shared(device::floyd_warshall(*_device)); + } +} + +std::vector DeviceState::get_path(QubitIdType src, QubitIdType dest) const { + std::vector path; + path.emplace_back(_qubit_list.at(src)); + if (src == dest) return path; + if (!_apsp) { + return path; + } + auto const& predecessor = _apsp->predecessor; + auto pred_opt = predecessor[dest][src]; + if (!pred_opt.has_value()) { + return path; + } + auto new_pred = pred_opt.value(); + path.emplace_back(_qubit_list.at(new_pred)); + while (true) { + pred_opt = predecessor[dest][new_pred]; + if (!pred_opt.has_value()) break; + new_pred = pred_opt.value(); + path.emplace_back(_qubit_list.at(new_pred)); + } + return path; +} + +} // namespace qsyn::duostra diff --git a/src/duostra/device_state.hpp b/src/duostra/device_state.hpp new file mode 100644 index 000000000..7c1990d7e --- /dev/null +++ b/src/duostra/device_state.hpp @@ -0,0 +1,107 @@ +/**************************************************************************** + PackageName [ duostra ] + Synopsis [ Define PhysicalQubitState and DeviceState for Duostra routing ] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#pragma once + +#include + +#include +#include +#include +#include +#include + +#include "device/device_analysis.hpp" +#include "qsyn/qsyn_type.hpp" + +namespace qsyn::qcir { +class QCirGate; +} + +namespace qsyn::duostra { + +class PhysicalQubitState { +public: + using Adjacencies = std::vector; + PhysicalQubitState() {} + PhysicalQubitState(QubitIdType id) : _id(id) {} + + void set_id(QubitIdType id) { _id = id; } + void set_occupied_time(size_t t) { _occupied_time = t; } + void set_logical_qubit(std::optional id) { _logical_qubit = id; } + + auto get_id() const { return _id; } + auto get_occupied_time() const { return _occupied_time; } + auto get_logical_qubit() const { return _logical_qubit; } + + // traversal + auto get_cost() const { return _cost; } + auto is_marked() const { return _marked; } + auto is_taken() const { return _taken; } + auto get_source() const { return _source; } + auto get_predecessor() const { return _pred; } + auto get_swap_time() const { return _swap_time; } + + void mark(bool source, QubitIdType pred); + void take_route(size_t cost, size_t swap_time); + void reset(); + +private: + QubitIdType _id = max_qubit_id; + + std::optional _logical_qubit = std::nullopt; + size_t _occupied_time = 0; + + bool _marked = false; + QubitIdType _pred = 0; + size_t _cost = 0; + size_t _swap_time = 0; + bool _source = false; // false:0, true:1 + bool _taken = false; +}; + +std::ostream& operator<<(std::ostream& os, PhysicalQubitState const& q); + +class DeviceState { +public: + using PhysicalQubitList = std::vector; + DeviceState(device::Device device); + std::string get_name() const { return _device->get_name(); } + size_t get_num_qubits() const { return _device->get_num_qubits(); } + PhysicalQubitList const& get_physical_qubit_list() const { return _qubit_list; } + PhysicalQubitState& get_physical_qubit(QubitIdType id) { return _qubit_list[id]; } + QubitIdType get_physical_by_logical(QubitIdType id); + std::tuple get_next_swap_cost(QubitIdType source, QubitIdType target); + + void apply_gate(qcir::QCirGate const& op, size_t time_begin); + std::vector> mapping() const; + void place(std::vector const& assignment); + + void calculate_path(); + std::vector get_path(QubitIdType src, QubitIdType dest) const; + + size_t get_delay(qcir::QCirGate const& inst) const; + + device::Device const& get_device() const { return *_device; } + +private: + std::shared_ptr _device; + PhysicalQubitList _qubit_list; + std::shared_ptr _apsp; +}; + +} // namespace qsyn::duostra + +template <> +struct fmt::formatter { + constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); } + + template + auto format(qsyn::duostra::PhysicalQubitState const& q, FormatContext& ctx) { + return fmt::format_to(ctx.out(), "Q{:>2}, logical: {:>2}, lock until {}", q.get_id(), q.get_logical_qubit(), q.get_occupied_time()); + } +}; diff --git a/src/duostra/duostra.cpp b/src/duostra/duostra.cpp index 9af610b60..2f1e3d85c 100644 --- a/src/duostra/duostra.cpp +++ b/src/duostra/duostra.cpp @@ -33,10 +33,10 @@ namespace qsyn::duostra { */ Duostra::Duostra( QCir* cir, - Device dev, + DeviceState dev, DuostraConfig const& config, DuostraExecutionOptions const& exe_opts) - : _device(std::move(dev)), + : _device_state(std::move(dev)), _config{config}, _check(exe_opts.verify_result), _tqdm{!exe_opts.silent && exe_opts.use_tqdm}, @@ -52,10 +52,10 @@ bool Duostra::map(bool use_device_as_placement) { std::unique_ptr topo; topo = make_unique(_logical_circuit); auto check_topo = topo->clone(); - auto check_device(_device); + auto check_device(_device_state); spdlog::info("Creating device..."); - if (topo->get_num_qubits() > _device.get_num_qubits()) { + if (topo->get_num_qubits() > _device_state.get_num_qubits()) { spdlog::error("Number of logical qubits are larger than the device!!"); return false; } @@ -64,7 +64,7 @@ bool Duostra::map(bool use_device_as_placement) { if (!use_device_as_placement) { spdlog::info("Calculating Initial Placement..."); auto placer = get_placer(_config.placer_type); - assign = placer->place_and_assign(_device); + assign = placer->place_and_assign(_device_state); } // scheduler spdlog::info("Creating Scheduler..."); @@ -77,7 +77,7 @@ bool Duostra::map(bool use_device_as_placement) { ? Router::CostStrategyType::end : Router::CostStrategyType::start; auto router = std::make_unique( - std::move(_device), + std::move(_device_state), _config.router_type, cost_strategy, _config.tie_breaking_strategy); @@ -86,7 +86,7 @@ bool Duostra::map(bool use_device_as_placement) { if (!_silent) { fmt::println("Routing..."); } - _device = scheduler->assign_gates_and_sort(std::move(router)); + _device_state = scheduler->assign_gates_and_sort(std::move(router)); if (stop_requested()) { spdlog::warn("Warning: mapping interrupted"); return false; @@ -149,7 +149,7 @@ bool Duostra::map(bool use_device_as_placement) { * */ void Duostra::build_circuit_by_result() { - _physical_circuit->add_qubits(_device.get_num_qubits()); + _physical_circuit->add_qubits(_device_state.get_num_qubits()); for (auto const& operation : _result) { auto qubits = operation.get_qubits(); QubitIdList qu; diff --git a/src/duostra/duostra.hpp b/src/duostra/duostra.hpp index e4f6efc68..562e4f219 100644 --- a/src/duostra/duostra.hpp +++ b/src/duostra/duostra.hpp @@ -26,7 +26,7 @@ namespace duostra { class Duostra { public: - using Device = qsyn::device::Device; + using DeviceState = qsyn::duostra::DeviceState; struct DuostraExecutionOptions { bool verify_result = false; bool silent = false; @@ -34,14 +34,14 @@ class Duostra { }; Duostra( qcir::QCir* qcir, - Device dev, + DeviceState dev, DuostraConfig const& config, DuostraExecutionOptions const& exe_opts = {.verify_result = false, .silent = false, .use_tqdm = true}); std::unique_ptr const& get_physical_circuit() const { return _physical_circuit; } std::unique_ptr&& get_physical_circuit() { return std::move(_physical_circuit); } std::vector const& get_result() const { return _result; } - Device get_device() const { return _device; } + DeviceState get_device_state() const { return _device_state; } void make_dependency(); bool map(bool use_device_as_placement = false); @@ -50,7 +50,7 @@ class Duostra { private: std::unique_ptr _physical_circuit = std::make_unique(); - Device _device; + DeviceState _device_state; DuostraConfig _config; bool _check; bool _tqdm; diff --git a/src/duostra/duostra_def.hpp b/src/duostra/duostra_def.hpp index feb38a9e6..1c8bf72ad 100644 --- a/src/duostra/duostra_def.hpp +++ b/src/duostra/duostra_def.hpp @@ -8,6 +8,7 @@ #pragma once +#include #include #include #include diff --git a/src/duostra/mapping_eqv_checker.cpp b/src/duostra/mapping_eqv_checker.cpp index 007ce2e03..a8a10758c 100644 --- a/src/duostra/mapping_eqv_checker.cpp +++ b/src/duostra/mapping_eqv_checker.cpp @@ -29,12 +29,12 @@ namespace qsyn::duostra { * @param init * @param reverse check reversily if true */ -MappingEquivalenceChecker::MappingEquivalenceChecker(QCir* phy, QCir* log, Device dev, PlacerType placer_type, std::vector init, bool reverse) : _physical(phy), _logical(log), _device(std::move(dev)), _reverse(reverse) { +MappingEquivalenceChecker::MappingEquivalenceChecker(QCir* phy, QCir* log, DeviceState dev, PlacerType placer_type, std::vector init, bool reverse) : _physical(phy), _logical(log), _device_state(std::move(dev)), _reverse(reverse) { if (init.empty()) { auto placer = get_placer(placer_type); - init = placer->place_and_assign(_device); + init = placer->place_and_assign(_device_state); } else - _device.place(init); + _device_state.place(init); for (auto const& [i, qubit] : tl::views::enumerate(_logical->get_qubits())) { _dependency[i] = _reverse ? qubit.get_last_gate() : qubit.get_first_gate(); } @@ -101,8 +101,8 @@ bool MappingEquivalenceChecker::is_swap(QCirGate* candidate) { candidate->get_qubit(1) != q0_gate->get_qubit(0)) return false; // NOTE - If it is actually a gate in dependency, it can not be changed into swap - auto logical_gate_ctrl_id = _device.get_physical_qubit(candidate->get_qubit(0)).get_logical_qubit(); - auto logical_gate_targ_id = _device.get_physical_qubit(candidate->get_qubit(1)).get_logical_qubit(); + auto logical_gate_ctrl_id = _device_state.get_physical_qubit(candidate->get_qubit(0)).get_logical_qubit(); + auto logical_gate_targ_id = _device_state.get_physical_qubit(candidate->get_qubit(1)).get_logical_qubit(); assert(logical_gate_ctrl_id.has_value()); assert(logical_gate_targ_id.has_value()); @@ -122,14 +122,14 @@ bool MappingEquivalenceChecker::is_swap(QCirGate* candidate) { * @return false */ bool MappingEquivalenceChecker::execute_swap(QCirGate* first, std::unordered_set& swaps) { - if (!_device.get_physical_qubit(first->get_qubit(0)).is_adjacency(_device.get_physical_qubit(first->get_qubit(1)))) return false; + if (!_device_state.get_device().is_adjacent(first->get_qubit(0), first->get_qubit(1))) return false; swaps.emplace(first); auto next_gate = get_next(*_physical, first->get_id(), 0); swaps.emplace(next_gate); swaps.emplace(get_next(*_physical, next_gate->get_id(), 0)); - auto& q0 = _device.get_physical_qubit(first->get_qubit(0)); - auto& q1 = _device.get_physical_qubit(first->get_qubit(1)); + auto& q0 = _device_state.get_physical_qubit(first->get_qubit(0)); + auto& q1 = _device_state.get_physical_qubit(first->get_qubit(1)); auto const temp = q0.get_logical_qubit(); q0.set_logical_qubit(q1.get_logical_qubit()); q1.set_logical_qubit(temp); @@ -144,7 +144,7 @@ bool MappingEquivalenceChecker::execute_swap(QCirGate* first, std::unordered_set * @return false */ bool MappingEquivalenceChecker::execute_single(QCirGate* gate) { - auto const& logical_qubit = _device.get_physical_qubit(gate->get_qubit(0)).get_logical_qubit(); + auto const& logical_qubit = _device_state.get_physical_qubit(gate->get_qubit(0)).get_logical_qubit(); assert(logical_qubit.has_value()); @@ -176,8 +176,8 @@ bool MappingEquivalenceChecker::execute_single(QCirGate* gate) { * @return false */ bool MappingEquivalenceChecker::execute_double(QCirGate* gate) { - auto logical_ctrl_id = _device.get_physical_qubit(gate->get_qubit(0)).get_logical_qubit(); - auto logical_targ_id = _device.get_physical_qubit(gate->get_qubit(1)).get_logical_qubit(); + auto logical_ctrl_id = _device_state.get_physical_qubit(gate->get_qubit(0)).get_logical_qubit(); + auto logical_targ_id = _device_state.get_physical_qubit(gate->get_qubit(1)).get_logical_qubit(); assert(logical_ctrl_id.has_value()); assert(logical_targ_id.has_value()); @@ -205,7 +205,7 @@ bool MappingEquivalenceChecker::execute_double(QCirGate* gate) { return false; } - if (!_device.get_physical_qubit(gate->get_qubit(0)).is_adjacency(_device.get_physical_qubit(gate->get_qubit(1)))) return false; + if (!_device_state.get_device().is_adjacent(gate->get_qubit(0), gate->get_qubit(1))) return false; _dependency[logical_gate->get_qubit(0)] = get_next(*_logical, logical_gate->get_id(), 0); _dependency[logical_gate->get_qubit(1)] = get_next(*_logical, logical_gate->get_id(), 1); diff --git a/src/duostra/mapping_eqv_checker.hpp b/src/duostra/mapping_eqv_checker.hpp index d9f372e49..4a829cc99 100644 --- a/src/duostra/mapping_eqv_checker.hpp +++ b/src/duostra/mapping_eqv_checker.hpp @@ -8,10 +8,9 @@ #pragma once #include -#include #include -#include "device/device.hpp" +#include "duostra/device_state.hpp" #include "duostra/duostra.hpp" #include "qsyn/qsyn_type.hpp" @@ -29,8 +28,8 @@ namespace duostra { class MappingEquivalenceChecker { public: - using Device = qsyn::device::Device; - MappingEquivalenceChecker(qcir::QCir* phy, qcir::QCir* log, Device dev, PlacerType placer_type, std::vector init = {}, bool reverse = false); + using DeviceState = qsyn::duostra::DeviceState; + MappingEquivalenceChecker(qcir::QCir* phy, qcir::QCir* log, DeviceState dev, PlacerType placer_type, std::vector init = {}, bool reverse = false); bool check(); bool is_swap(qcir::QCirGate* candidate); @@ -44,7 +43,7 @@ class MappingEquivalenceChecker { private: qcir::QCir* _physical; qcir::QCir* _logical; - Device _device; + DeviceState _device_state; bool _reverse; // for logical circuit std::unordered_map _dependency; diff --git a/src/duostra/placer.cpp b/src/duostra/placer.cpp index 2114977bf..009fbf5a9 100644 --- a/src/duostra/placer.cpp +++ b/src/duostra/placer.cpp @@ -43,7 +43,7 @@ std::unique_ptr get_placer(PlacerType type) { * * @param device */ -std::vector BasePlacer::place_and_assign(Device& device) { +std::vector BasePlacer::place_and_assign(DeviceState& device) { auto assign = _place(device); device.place(assign); return assign; @@ -57,7 +57,7 @@ std::vector BasePlacer::place_and_assign(Device& device) { * @param device * @return vector */ -std::vector RandomPlacer::_place(Device& device) const { +std::vector RandomPlacer::_place(DeviceState& device) const { std::vector assign; for (size_t i = 0; i < device.get_num_qubits(); ++i) assign.emplace_back(i); @@ -74,7 +74,7 @@ std::vector RandomPlacer::_place(Device& device) const { * @param device * @return vector */ -std::vector StaticPlacer::_place(Device& device) const { +std::vector StaticPlacer::_place(DeviceState& device) const { std::vector assign; for (size_t i = 0; i < device.get_num_qubits(); ++i) assign.emplace_back(i); @@ -90,7 +90,7 @@ std::vector StaticPlacer::_place(Device& device) const { * @param device * @return vector */ -std::vector DFSPlacer::_place(Device& device) const { +std::vector DFSPlacer::_place(DeviceState& device) const { std::vector assign; std::vector qubit_mark(device.get_num_qubits(), false); _dfs_device(0, device, assign, qubit_mark); @@ -106,7 +106,7 @@ std::vector DFSPlacer::_place(Device& device) const { * @param assign * @param qubitMark */ -void DFSPlacer::_dfs_device(QubitIdType current, Device& device, std::vector& assign, std::vector& qubit_marks) const { +void DFSPlacer::_dfs_device(QubitIdType current, DeviceState& device_state, std::vector& assign, std::vector& qubit_marks) const { if (qubit_marks[current]) { fmt::println("{}", current); } @@ -114,17 +114,16 @@ void DFSPlacer::_dfs_device(QubitIdType current, Device& device, std::vector adjacency_waitlist; - for (auto& adj : q.get_adjacencies()) { + for (auto& adj : device_state.get_device().get_adjacencies(current)) { // already marked if (qubit_marks[adj]) continue; - assert(!q.get_adjacencies().empty()); + assert(device_state.get_device().get_num_adjacencies(current) > 0); // corner - if (q.get_adjacencies().size() == 1) - _dfs_device(adj, device, assign, qubit_marks); + if (device_state.get_device().get_num_adjacencies(current) == 1) + _dfs_device(adj, device_state, assign, qubit_marks); else adjacency_waitlist.emplace_back(adj); } @@ -133,7 +132,7 @@ void DFSPlacer::_dfs_device(QubitIdType current, Device& device, std::vector -#include #include #include "duostra/duostra_def.hpp" #include "qsyn/qsyn_type.hpp" -namespace qsyn::device { -class Device; -} +#include "duostra/device_state.hpp" namespace qsyn::duostra { class BasePlacer { public: - using Device = qsyn::device::Device; + using DeviceState = qsyn::duostra::DeviceState; BasePlacer() {} virtual ~BasePlacer() = default; - std::vector place_and_assign(Device& device); + std::vector place_and_assign(DeviceState& device); protected: - virtual std::vector _place(Device&) const = 0; + virtual std::vector _place(DeviceState&) const = 0; }; class RandomPlacer : public BasePlacer { public: - using Device = BasePlacer::Device; + using DeviceState = BasePlacer::DeviceState; protected: - std::vector _place(Device& /*unused*/) const override; + std::vector _place(DeviceState& /*unused*/) const override; }; class StaticPlacer : public BasePlacer { public: - using Device = BasePlacer::Device; + using DeviceState = BasePlacer::DeviceState; protected: - std::vector _place(Device& /*unused*/) const override; + std::vector _place(DeviceState& /*unused*/) const override; }; class DFSPlacer : public BasePlacer { public: - using Device = BasePlacer::Device; + using DeviceState = BasePlacer::DeviceState; protected: - std::vector _place(Device& /*unused*/) const override; + std::vector _place(DeviceState& /*unused*/) const override; private: - void _dfs_device(QubitIdType current, Device& device, std::vector& assign, std::vector& qubit_marks) const; + void _dfs_device(QubitIdType current, DeviceState& device, std::vector& assign, std::vector& qubit_marks) const; }; std::unique_ptr get_placer(PlacerType type); diff --git a/src/duostra/router.cpp b/src/duostra/router.cpp index 77c005104..66dd8ee1c 100644 --- a/src/duostra/router.cpp +++ b/src/duostra/router.cpp @@ -45,12 +45,12 @@ AStarNode::AStarNode(size_t cost, QubitIdType id, bool source) * @param orient */ Router::Router( - Device device, + DeviceState device, RouterType type, Router::CostStrategyType cost_strategy, MinMaxOptionType tie_breaking_strategy) : _tie_breaking_strategy(tie_breaking_strategy), - _device(std::move(device)), + _device_state(std::move(device)), _logical_to_physical({}), _apsp(type == RouterType::shortest_path || cost_strategy == CostStrategyType::end), @@ -75,13 +75,13 @@ std::unique_ptr Router::clone() const { */ void Router::_initialize() { if (_apsp) { - _device.calculate_path(); + _device_state.calculate_path(); } - auto const num_qubits = _device.get_num_qubits(); + auto const num_qubits = _device_state.get_num_qubits(); _logical_to_physical.resize(num_qubits); for (size_t i = 0; i < num_qubits; ++i) { - auto const& qubit = _device.get_physical_qubit(i).get_logical_qubit(); + auto const& qubit = _device_state.get_physical_qubit(i).get_logical_qubit(); assert(qubit.has_value()); _logical_to_physical[qubit.value()] = i; } @@ -119,14 +119,14 @@ size_t Router::get_gate_cost(qcir::QCirGate const& gate, MinMaxOptionType min_ma if (gate.get_num_qubits() == 1) { assert(get<1>(physical_qubits_ids) == max_qubit_id); - return _device.get_physical_qubit(get<0>(physical_qubits_ids)).get_occupied_time(); + return _device_state.get_physical_qubit(get<0>(physical_qubits_ids)).get_occupied_time(); } auto const q0_id = get<0>(physical_qubits_ids); auto const q1_id = get<1>(physical_qubits_ids); - auto const& q0 = _device.get_physical_qubit(q0_id); - auto const& q1 = _device.get_physical_qubit(q1_id); - auto const apsp_cost = _apsp ? _device.get_path(q0_id, q1_id).size() : 0; + auto const& q0 = _device_state.get_physical_qubit(q0_id); + auto const& q1 = _device_state.get_physical_qubit(q1_id); + auto const apsp_cost = _apsp ? _device_state.get_path(q0_id, q1_id).size() : 0; auto const avail = min_max == MinMaxOptionType::max ? std::max(q0.get_occupied_time(), q1.get_occupied_time()) : std::min(q0.get_occupied_time(), q1.get_occupied_time()); return avail + apsp_cost / apsp_coeff; @@ -144,9 +144,7 @@ bool Router::is_executable(qcir::QCirGate const& gate) { auto physical_qubits_ids{_get_physical_qubits(gate)}; assert(get<1>(physical_qubits_ids) != max_qubit_id); - PhysicalQubit const& q0 = _device.get_physical_qubit(get<0>(physical_qubits_ids)); - PhysicalQubit const& q1 = _device.get_physical_qubit(get<1>(physical_qubits_ids)); - return q0.is_adjacency(q1); + return _device_state.get_device().is_adjacent(get<0>(physical_qubits_ids), get<1>(physical_qubits_ids)); } /** @@ -158,9 +156,9 @@ bool Router::is_executable(qcir::QCirGate const& gate) { * @return Operation */ GateInfo Router::execute_single(qcir::QCirGate const& gate, QubitIdType q) { - auto& qubit = _device.get_physical_qubit(q); + auto& qubit = _device_state.get_physical_qubit(q); auto const start_time = qubit.get_occupied_time(); - auto const end_time = start_time + _device.get_delay(gate); + auto const end_time = start_time + _device_state.get_delay(gate); qubit.set_occupied_time(end_time); qubit.reset(); auto op = qcir::QCirGate{0, gate.get_operation(), QubitIdList{q, max_qubit_id}}; @@ -183,22 +181,22 @@ std::vector Router::duostra_routing(qcir::QCirGate const& gate, std::t auto q1_id = get<1>(qubit_pair); // source 1 bool swap_ids = false; // If two sources compete for the same qubit, the one with smaller occupied time goes first - if (_device.get_physical_qubit(q0_id).get_occupied_time() > - _device.get_physical_qubit(q1_id).get_occupied_time()) { + if (_device_state.get_physical_qubit(q0_id).get_occupied_time() > + _device_state.get_physical_qubit(q1_id).get_occupied_time()) { std::swap(q0_id, q1_id); swap_ids = true; - } else if (_device.get_physical_qubit(q0_id).get_occupied_time() == - _device.get_physical_qubit(q1_id).get_occupied_time()) { + } else if (_device_state.get_physical_qubit(q0_id).get_occupied_time() == + _device_state.get_physical_qubit(q1_id).get_occupied_time()) { // orientation means qubit with smaller logical idx has a little priority - if (tie_breaking_strategy == MinMaxOptionType::min && _device.get_physical_qubit(q0_id).get_logical_qubit() > - _device.get_physical_qubit(q1_id).get_logical_qubit()) { + if (tie_breaking_strategy == MinMaxOptionType::min && _device_state.get_physical_qubit(q0_id).get_logical_qubit() > + _device_state.get_physical_qubit(q1_id).get_logical_qubit()) { std::swap(q0_id, q1_id); swap_ids = true; } } - PhysicalQubit& t0 = _device.get_physical_qubit(q0_id); // target 0 - PhysicalQubit& t1 = _device.get_physical_qubit(q1_id); // target 1 + PhysicalQubit& t0 = _device_state.get_physical_qubit(q0_id); // target 0 + PhysicalQubit& t1 = _device_state.get_physical_qubit(q1_id); // target 1 // priority queue: pop out the node with the smallest cost from both the sources PriorityQueue priority_queue; @@ -211,7 +209,7 @@ std::vector Router::duostra_routing(qcir::QCirGate const& gate, std::t auto is_adjacent = get<0>(touch0); _touch_adjacency(t1, priority_queue, true); - auto const swap_delay = _device.get_delay(QCirGate{SwapGate{}, {0, 1}}); + auto const swap_delay = _device_state.get_delay(QCirGate{SwapGate{}, {0, 1}}); // the two paths from the two sources propagate until the two paths meet each other while (!is_adjacent) { @@ -219,7 +217,7 @@ std::vector Router::duostra_routing(qcir::QCirGate const& gate, std::t auto const next{priority_queue.top()}; priority_queue.pop(); auto const q_next_id = next.get_id(); - auto& q_next = _device.get_physical_qubit(q_next_id); + auto& q_next = _device_state.get_physical_qubit(q_next_id); // FIXME - swtch to source assert(q_next.get_source() == next.get_source()); @@ -242,12 +240,12 @@ std::vector Router::duostra_routing(qcir::QCirGate const& gate, std::t } } auto operation_list = - _traceback(gate, _device.get_physical_qubit(q0_id), _device.get_physical_qubit(q1_id), t0, t1, swap_ids); + _traceback(gate, _device_state.get_physical_qubit(q0_id), _device_state.get_physical_qubit(q1_id), t0, t1, swap_ids); - for (size_t i = 0; i < _device.get_num_qubits(); ++i) { - auto& qubit = _device.get_physical_qubit(i); + for (size_t i = 0; i < _device_state.get_num_qubits(); ++i) { + auto& qubit = _device_state.get_physical_qubit(i); qubit.reset(); - assert(qubit.get_logical_qubit() < _device.get_num_qubits()); + assert(qubit.get_logical_qubit() < _device_state.get_num_qubits()); } return operation_list; } @@ -269,35 +267,35 @@ std::vector Router::apsp_routing(qcir::QCirGate const& gate, std::tupl auto q0_id = s0_id; auto q1_id = s1_id; - while (!_device.get_physical_qubit(q0_id).is_adjacency(_device.get_physical_qubit(q1_id))) { - auto const [q0_next, q0_cost] = _device.get_next_swap_cost(q0_id, s1_id); - auto const [q1_next, q1_cost] = _device.get_next_swap_cost(q1_id, s0_id); + while (!_device_state.get_device().is_adjacent(q0_id, q1_id)) { + auto const [q0_next, q0_cost] = _device_state.get_next_swap_cost(q0_id, s1_id); + auto const [q1_next, q1_cost] = _device_state.get_next_swap_cost(q1_id, s0_id); if ((q0_cost < q1_cost) || ((q0_cost == q1_cost) && (tie_breaking_strategy == MinMaxOptionType::min) && - _device.get_physical_qubit(q0_id).get_logical_qubit() < - _device.get_physical_qubit(q1_id).get_logical_qubit())) { + _device_state.get_physical_qubit(q0_id).get_logical_qubit() < + _device_state.get_physical_qubit(q1_id).get_logical_qubit())) { auto op = qcir::QCirGate(0, SwapGate{}, QubitIdList{q0_id, q0_next}); - _device.apply_gate(op, q0_cost); - GateInfo gate_info = {op, {q0_cost, q0_cost + _device.get_delay(op)}}; + _device_state.apply_gate(op, q0_cost); + GateInfo gate_info = {op, {q0_cost, q0_cost + _device_state.get_delay(op)}}; operation_list.emplace_back(std::move(gate_info)); q0_id = q0_next; } else { auto op = qcir::QCirGate(0, SwapGate{}, QubitIdList{q1_id, q1_next}); - _device.apply_gate(op, q1_cost); - GateInfo gate_info = {op, {q1_cost, q1_cost + _device.get_delay(op)}}; + _device_state.apply_gate(op, q1_cost); + GateInfo gate_info = {op, {q1_cost, q1_cost + _device_state.get_delay(op)}}; operation_list.emplace_back(std::move(gate_info)); q1_id = q1_next; } } - assert(_device.get_physical_qubit(q1_id).is_adjacency(_device.get_physical_qubit(q0_id))); + assert(_device_state.get_device().is_adjacent(q1_id, q0_id)); - auto const gate_cost = std::max(_device.get_physical_qubit(q0_id).get_occupied_time(), - _device.get_physical_qubit(q1_id).get_occupied_time()); + auto const gate_cost = std::max(_device_state.get_physical_qubit(q0_id).get_occupied_time(), + _device_state.get_physical_qubit(q1_id).get_occupied_time()); auto cx_gate = qcir::QCirGate(0, gate.get_operation(), QubitIdList{q0_id, q1_id}); - _device.apply_gate(cx_gate, gate_cost); + _device_state.apply_gate(cx_gate, gate_cost); - GateInfo gate_info = {cx_gate, {gate_cost, gate_cost + _device.get_delay(gate)}}; + GateInfo gate_info = {cx_gate, {gate_cost, gate_cost + _device_state.get_delay(gate)}}; operation_list.emplace_back(std::move(gate_info)); return operation_list; } @@ -312,8 +310,8 @@ std::vector Router::apsp_routing(qcir::QCirGate const& gate, std::tupl */ std::tuple Router::_touch_adjacency(PhysicalQubit& qubit, PriorityQueue& pq, bool source) { // mark all the adjacent qubits as seen and push them into the priority queue - for (auto& i : qubit.get_adjacencies()) { - PhysicalQubit& adj = _device.get_physical_qubit(i); + for (auto& i : _device_state.get_device().get_adjacencies(qubit.get_id())) { + PhysicalQubit& adj = _device_state.get_physical_qubit(i); // see if already in the queue if (adj.is_marked()) { // see if the taken one is from different path from the original qubit @@ -329,7 +327,7 @@ std::tuple Router::_touch_adjacency(PhysicalQubit& qubit, Pri } // push the node into the priority queue - auto const cost = std::max(qubit.get_cost(), adj.get_occupied_time()) + _device.get_delay(QCirGate{SwapGate{}, {0, 1}}); + auto const cost = std::max(qubit.get_cost(), adj.get_occupied_time()) + _device_state.get_delay(QCirGate{SwapGate{}, {0, 1}}); adj.mark(source, qubit.get_id()); pq.push(AStarNode(cost, adj.get_id(), source)); @@ -354,7 +352,7 @@ std::vector Router::_traceback(qcir::QCirGate const& gate, PhysicalQub assert(t0.get_id() == t0.get_predecessor()); assert(t1.get_id() == t1.get_predecessor()); - assert(q0.is_adjacency(q1)); + assert(_device_state.get_device().is_adjacent(q0.get_id(), q1.get_id())); std::vector operation_list; auto const operation_time = std::max(q0.get_cost(), q1.get_cost()); @@ -365,7 +363,7 @@ std::vector Router::_traceback(qcir::QCirGate const& gate, PhysicalQub auto const qids = swap_ids ? QubitIdList{q1.get_id(), q0.get_id()} : QubitIdList{q0.get_id(), q1.get_id()}; auto cx_gate = qcir::QCirGate(0, gate.get_operation(), qids); - GateInfo gate_info = {cx_gate, {operation_time, operation_time + _device.get_delay(gate)}}; + GateInfo gate_info = {cx_gate, {operation_time, operation_time + _device_state.get_delay(gate)}}; operation_list.emplace_back(std::move(gate_info)); // traceback by tracing the parent iteratively @@ -374,23 +372,23 @@ std::vector Router::_traceback(qcir::QCirGate const& gate, PhysicalQub // traceback by tracing the parent iteratively // trace 0 while (trace0 != t0.get_id()) { - auto const& q_trace0 = _device.get_physical_qubit(trace0); + auto const& q_trace0 = _device_state.get_physical_qubit(trace0); auto const trace_pred0 = q_trace0.get_predecessor(); auto const swap_time = q_trace0.get_swap_time(); auto op = qcir::QCirGate(0, SwapGate{}, QubitIdList{trace0, trace_pred0}); - GateInfo gate_info = {op, {swap_time, swap_time + _device.get_delay(op)}}; + GateInfo gate_info = {op, {swap_time, swap_time + _device_state.get_delay(op)}}; operation_list.emplace_back(std::move(gate_info)); trace0 = trace_pred0; } while (trace1 != t1.get_id()) // trace 1 { - auto& q_trace1 = _device.get_physical_qubit(trace1); + auto& q_trace1 = _device_state.get_physical_qubit(trace1); auto const trace_pred1 = q_trace1.get_predecessor(); auto const swap_time = q_trace1.get_swap_time(); auto op = qcir::QCirGate(0, SwapGate{}, QubitIdList{trace1, trace_pred1}); - GateInfo gate_info = {op, {swap_time, swap_time + _device.get_delay(op)}}; + GateInfo gate_info = {op, {swap_time, swap_time + _device_state.get_delay(op)}}; operation_list.emplace_back(std::move(gate_info)); trace1 = trace_pred1; } @@ -400,7 +398,7 @@ std::vector Router::_traceback(qcir::QCirGate const& gate, PhysicalQub }); for (size_t i = 0; i < operation_list.size(); ++i) { - _device.apply_gate(operation_list[i].first, operation_list[i].second.first); + _device_state.apply_gate(operation_list[i].first, operation_list[i].second.first); } return operation_list; @@ -423,7 +421,7 @@ std::vector Router::assign_gate(qcir::QCirGate const& gate) { _duostra ? duostra_routing(gate, physical_qubits_ids, _tie_breaking_strategy) : apsp_routing(gate, physical_qubits_ids, _tie_breaking_strategy); - auto const change_list = _device.mapping(); + auto const change_list = _device_state.mapping(); // i is the idx of device qubit for (size_t i = 0; i < change_list.size(); ++i) { diff --git a/src/duostra/router.hpp b/src/duostra/router.hpp index 1e3572b11..f7a58abd6 100644 --- a/src/duostra/router.hpp +++ b/src/duostra/router.hpp @@ -12,6 +12,7 @@ #include "./duostra_def.hpp" #include "device/device.hpp" +#include "duostra/device_state.hpp" #include "qcir/qcir_gate.hpp" #include "qsyn/qsyn_type.hpp" @@ -43,8 +44,8 @@ class AStarComp { class Router { public: - using Device = qsyn::device::Device; - using PhysicalQubit = qsyn::device::PhysicalQubit; + using DeviceState = qsyn::duostra::DeviceState; + using PhysicalQubit = qsyn::duostra::PhysicalQubitState; enum CostStrategyType : std::uint8_t { start, @@ -52,12 +53,12 @@ class Router { }; using PriorityQueue = std::priority_queue, AStarComp>; - Router(Device device, RouterType type, CostStrategyType cost_strategy, MinMaxOptionType tie_breaking_strategy); + Router(DeviceState device, RouterType type, CostStrategyType cost_strategy, MinMaxOptionType tie_breaking_strategy); std::unique_ptr clone() const; - auto& get_device() { return _device; } - auto const& get_device() const { return _device; } + auto& get_device_state() { return _device_state; } + auto const& get_device_state() const { return _device_state; } size_t get_gate_cost(qcir::QCirGate const& gate, MinMaxOptionType min_max, size_t apsp_coeff); bool is_executable(qcir::QCirGate const& gate); @@ -70,7 +71,7 @@ class Router { private: MinMaxOptionType _tie_breaking_strategy; - Device _device; + DeviceState _device_state; std::vector _logical_to_physical; bool _apsp : 1; bool _duostra : 1; diff --git a/src/duostra/scheduler.cpp b/src/duostra/scheduler.cpp index f7e624d5c..847854045 100644 --- a/src/duostra/scheduler.cpp +++ b/src/duostra/scheduler.cpp @@ -132,8 +132,8 @@ size_t BaseScheduler::get_operations_cost() const { * @param router * @return Device */ -BaseScheduler::Device BaseScheduler::assign_gates_and_sort(std::unique_ptr router) { - Device d = _assign_gates(std::move(router)); +BaseScheduler::DeviceState BaseScheduler::assign_gates_and_sort(std::unique_ptr router) { + DeviceState d = _assign_gates(std::move(router)); _sort(); return d; } @@ -144,14 +144,14 @@ BaseScheduler::Device BaseScheduler::assign_gates_and_sort(std::unique_ptr router) { +BaseScheduler::DeviceState BaseScheduler::_assign_gates(std::unique_ptr router) { for (dvlab::TqdmWrapper bar{_circuit_topology.get_num_gates()}; !bar.done(); ++bar) { if (stop_requested()) { - return router->get_device(); + return router->get_device_state(); } route_one_gate(*router, bar.idx()); } - return router->get_device(); + return router->get_device_state(); } /** @@ -194,12 +194,12 @@ std::unique_ptr RandomScheduler::clone() const { * @param router * @return Device */ -RandomScheduler::Device RandomScheduler::_assign_gates(std::unique_ptr router) { +RandomScheduler::DeviceState RandomScheduler::_assign_gates(std::unique_ptr router) { [[maybe_unused]] size_t count = 0; for (dvlab::TqdmWrapper bar{_circuit_topology.get_num_gates()}; !bar.done(); ++bar) { if (stop_requested()) { - return router->get_device(); + return router->get_device_state(); } auto& waitlist = _circuit_topology.get_available_gates(); assert(!waitlist.empty()); @@ -211,7 +211,7 @@ RandomScheduler::Device RandomScheduler::_assign_gates(std::unique_ptr r ++count; } assert(count == _circuit_topology.get_num_gates()); - return router->get_device(); + return router->get_device_state(); } // SECTION - Class StaticScheduler Member Functions @@ -231,11 +231,11 @@ std::unique_ptr NaiveScheduler::clone() const { * @param router * @return Device */ -NaiveScheduler::Device NaiveScheduler::_assign_gates(std::unique_ptr router) { +NaiveScheduler::DeviceState NaiveScheduler::_assign_gates(std::unique_ptr router) { [[maybe_unused]] size_t count = 0; for (dvlab::TqdmWrapper bar{_circuit_topology.get_num_gates()}; !bar.done(); ++bar) { if (stop_requested()) { - return router->get_device(); + return router->get_device_state(); } auto& waitlist = _circuit_topology.get_available_gates(); assert(!waitlist.empty()); @@ -246,7 +246,7 @@ NaiveScheduler::Device NaiveScheduler::_assign_gates(std::unique_ptr rou ++count; } assert(count == _circuit_topology.get_num_gates()); - return router->get_device(); + return router->get_device_state(); } } // namespace qsyn::duostra diff --git a/src/duostra/scheduler.hpp b/src/duostra/scheduler.hpp index e5a0e1881..f620c5c03 100644 --- a/src/duostra/scheduler.hpp +++ b/src/duostra/scheduler.hpp @@ -17,12 +17,13 @@ #include "./duostra_def.hpp" #include "./router.hpp" #include "device/device.hpp" +#include "duostra/device_state.hpp" namespace qsyn::duostra { class BaseScheduler { public: - using Device = qsyn::device::Device; + using DeviceState = qsyn::duostra::DeviceState; BaseScheduler(CircuitTopology topo, bool tqdm) : _circuit_topology(std::move(topo)), _tqdm(tqdm) {} virtual ~BaseScheduler() = default; @@ -47,7 +48,7 @@ class BaseScheduler { std::vector const& get_available_gates() const { return _circuit_topology.get_available_gates(); } std::vector const& get_operations() const { return _operations; } - Device assign_gates_and_sort(std::unique_ptr router); + DeviceState assign_gates_and_sort(std::unique_ptr router); size_t route_one_gate(Router& router, size_t gate_id, bool forget = false); protected: @@ -55,30 +56,30 @@ class BaseScheduler { std::vector _operations; bool _sorted = false; bool _tqdm = true; - virtual Device _assign_gates(std::unique_ptr router); + virtual DeviceState _assign_gates(std::unique_ptr router); void _sort(); }; class RandomScheduler : public BaseScheduler { public: - using Device = BaseScheduler::Device; + using DeviceState = BaseScheduler::DeviceState; RandomScheduler(CircuitTopology const& topo, bool tqdm) : BaseScheduler(topo, tqdm) {} std::unique_ptr clone() const override; protected: - Device _assign_gates(std::unique_ptr /*unused*/) override; + DeviceState _assign_gates(std::unique_ptr /*unused*/) override; }; class NaiveScheduler : public BaseScheduler { public: - using Device = BaseScheduler::Device; + using DeviceState = BaseScheduler::DeviceState; NaiveScheduler(CircuitTopology const& topo, bool tqdm) : BaseScheduler(topo, tqdm) {} std::unique_ptr clone() const override; protected: - Device _assign_gates(std::unique_ptr /*unused*/) override; + DeviceState _assign_gates(std::unique_ptr /*unused*/) override; }; struct GreedyConf { @@ -90,7 +91,7 @@ struct GreedyConf { class GreedyScheduler : public BaseScheduler { // NOLINT(hicpp-special-member-functions, cppcoreguidelines-special-member-functions) : copy-swap idiom public: - using Device = BaseScheduler::Device; + using DeviceState = BaseScheduler::DeviceState; GreedyScheduler(CircuitTopology const& topo, DuostraConfig config, bool tqdm) @@ -106,7 +107,7 @@ class GreedyScheduler : public BaseScheduler { // NOLINT(hicpp-special-member-f protected: GreedyConf _conf; - Device _assign_gates(std::unique_ptr /*unused*/) override; + DeviceState _assign_gates(std::unique_ptr /*unused*/) override; }; struct TreeNodeConf { @@ -193,7 +194,7 @@ class TreeNode { // NOLINT(hicpp-special-member-functions, cppcoreguidelines-sp class SearchScheduler : public GreedyScheduler { // NOLINT(hicpp-special-member-functions, cppcoreguidelines-special-member-functions) : copy-swap idiom public: - using Device = GreedyScheduler::Device; + using DeviceState = GreedyScheduler::DeviceState; SearchScheduler( CircuitTopology const& topo, DuostraConfig config, @@ -206,7 +207,7 @@ class SearchScheduler : public GreedyScheduler { // NOLINT(hicpp-special-member bool _execute_single; size_t _lookahead; - Device _assign_gates(std::unique_ptr /*unused*/) override; + DeviceState _assign_gates(std::unique_ptr /*unused*/) override; void _cache_when_necessary(); }; diff --git a/src/duostra/scheduler_greedy.cpp b/src/duostra/scheduler_greedy.cpp index 35b88a1fc..99c337a48 100644 --- a/src/duostra/scheduler_greedy.cpp +++ b/src/duostra/scheduler_greedy.cpp @@ -57,13 +57,13 @@ std::unique_ptr GreedyScheduler::clone() const { * @param router * @return Device */ -GreedyScheduler::Device GreedyScheduler::_assign_gates(std::unique_ptr router) { +GreedyScheduler::DeviceState GreedyScheduler::_assign_gates(std::unique_ptr router) { [[maybe_unused]] size_t count = 0; auto topo_wrap = TopologyCandidate(_circuit_topology, _conf.num_candidates); for (dvlab::TqdmWrapper bar{_circuit_topology.get_num_gates(), _tqdm}; !topo_wrap.get_available_gates().empty(); ++bar) { if (stop_requested()) { - return router->get_device(); + return router->get_device_state(); } auto waitlist = topo_wrap.get_available_gates(); assert(!waitlist.empty()); @@ -80,7 +80,7 @@ GreedyScheduler::Device GreedyScheduler::_assign_gates(std::unique_ptr r ++count; } assert(count == _circuit_topology.get_num_gates()); - return router->get_device(); + return router->get_device_state(); } /** diff --git a/src/duostra/scheduler_search.cpp b/src/duostra/scheduler_search.cpp index 3bade0fe8..63ca27aa8 100644 --- a/src/duostra/scheduler_search.cpp +++ b/src/duostra/scheduler_search.cpp @@ -264,7 +264,7 @@ void SearchScheduler::_cache_when_necessary() { * @param router * @return Device */ -SearchScheduler::Device SearchScheduler::_assign_gates(std::unique_ptr router) { +SearchScheduler::DeviceState SearchScheduler::_assign_gates(std::unique_ptr router) { auto total_gates = _circuit_topology.get_num_gates(); auto root = make_unique( @@ -277,7 +277,7 @@ SearchScheduler::Device SearchScheduler::_assign_gates(std::unique_ptr r while (!root->done()) { // Update the _candidates. if (stop_requested()) { - return router->get_device(); + return router->get_device_state(); } auto selected_node = std::make_unique(root->best_child(static_cast(_lookahead))); root = std::move(selected_node); @@ -287,7 +287,7 @@ SearchScheduler::Device SearchScheduler::_assign_gates(std::unique_ptr r ++bar; } } - return router->get_device(); + return router->get_device_state(); } } // namespace qsyn::duostra diff --git a/src/hamiltonian/bonsai.cpp b/src/hamiltonian/bonsai.cpp new file mode 100644 index 000000000..c280e412d --- /dev/null +++ b/src/hamiltonian/bonsai.cpp @@ -0,0 +1,161 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Implement the Bonsai mapping for fermionic Hamiltonian to qubit Hamiltonian ] + Author [ Mu-Te (Joshua) Lau (joshmtlau) ] +*/ + +#include "bonsai.hpp" + +#include +#include +#include + +#include "device/device_analysis.hpp" +#include "spdlog/spdlog.h" +#include "util/util.hpp" + +namespace qsyn::hamiltonian { + +namespace { +struct PQItem { + float dist_to_center; + float dist; + QubitIdType qubit; + QubitIdType parent_qubit; // device qubit already in tree; new node will be its child +}; + +auto const comp = [](PQItem const& a, PQItem const& b) { + // note that std::priority_queue is a max heap, so we need to invert the comparison + + // to maintain similar behavior as the Bonsai paper's description, + // we first compare the distance to the center + // this reduces to a layer-by-layer traversal when all couplings are equally good + if (a.dist_to_center < b.dist_to_center) return false; + if (a.dist_to_center > b.dist_to_center) return true; + // for the same level, prioritize the best coupling (min distance) + if (a.dist < b.dist) return false; + if (a.dist > b.dist) return true; + // for the same level and same distance, prioritize the qubit with smaller index + return a.qubit > b.qubit; +}; + +using PQ = std::priority_queue, decltype(comp)>; +} // namespace + +/** + * @brief Build a Bonsai ternary tree for a given device and APSP result. The tree will be rooted at the given qubit. + * @param root_qubit_id ID of the qubit to root the tree at + * @param device Device + * @param apsp APSP result. The caller should compute the APSP result before calling this function. + * @param n_qubits Number of qubits in the final Bonsai tree. If not specified, + * a tree with all qubits in the device will be built. + * @return Bonsai ternary tree, or a failure reason. + */ +tl::expected build_bonsai_ternary_tree(std::size_t root_qubit_id, device::Device const& device, device::APSPResult const& apsp, size_t n_qubits) { + if (root_qubit_id >= device.get_num_qubits()) { + return tl::unexpected(BonsaiFailReason::invalid_root_qubit); + } + + n_qubits = std::min(n_qubits, device.get_num_qubits()); + + // keep track of already-visited device qubits + std::unordered_set visited_qubits; + TernaryTree tt; + + auto const assign_and_mark_visited = [&](size_t node_index, QubitIdType qubit) { + tt.assign_qubit(node_index, qubit); + visited_qubits.insert(qubit); + }; + + PQ qubit_queue(comp); + + // handle the center qubit, which is already in the tree + assign_and_mark_visited(0, root_qubit_id); + for (auto const& neighbor : device.get_adjacencies(root_qubit_id)) { + auto const d = apsp.distance[root_qubit_id][neighbor]; + if (std::isinf(d)) { + continue; + } + qubit_queue.push(PQItem{ + .dist_to_center = d, + .dist = d, + .qubit = neighbor, + .parent_qubit = root_qubit_id, + }); + } + + while (tt.num_qubits() < n_qubits) { + if (qubit_queue.empty()) { + return tl::unexpected(BonsaiFailReason::not_enough_qubits); + } + auto const [dist_to_center, dist, qubit, parent_qubit] = qubit_queue.top(); + qubit_queue.pop(); + if (visited_qubits.contains(qubit)) { + continue; + } + // add the qubit node as child of the node that corresponds to parent_qubit + auto const node_index = tt.add_qubit_node_to_first_empty_branch( + tt.get_node_by_qubit(parent_qubit)); + + DVLAB_ASSERT(node_index.has_value(), "Some empty branch must exist for parent qubit"); + + assign_and_mark_visited(*node_index, qubit); + + for (auto const& neighbor : device.get_adjacencies(qubit)) { + auto const dist_to_center = apsp.distance[root_qubit_id][neighbor]; + if (std::isinf(dist_to_center)) { + continue; + } + + auto const dist = apsp.distance[qubit][neighbor]; + if (std::isinf(dist)) { + continue; + } + + qubit_queue.push( + PQItem{ + .dist_to_center = dist_to_center, + .dist = dist, + .qubit = neighbor, + .parent_qubit = qubit, + }); + } + } + + tt.append_legs_to_tree(); + + return tt; +} +/** + * @brief Build a Bonsai ternary tree for a given device and APSP result. + * The tree will be rooted at one of the centers of the device coupling graph. + * @param device Device + * @param apsp APSP result. The caller should compute the APSP result before + calling this function. + * @param n_qubits Number of qubits in the final Bonsai tree. If not specified, + * a tree with all qubits in the device will be built. + * @return Bonsai ternary tree, or a failure reason. + */ +tl::expected +build_bonsai_ternary_tree( + device::Device const& device, device::APSPResult const& apsp, size_t n_qubits) { + n_qubits = std::min(n_qubits, device.get_num_qubits()); + auto const connected_components = device::get_connected_components(apsp, device); + assert(!connected_components.empty()); + for (auto const& component : connected_components) { + // REVIEW: potential query speed concern + auto const centers = device::get_centers( + apsp, device, [&](QubitIdType const& qubit_id) { + return dvlab::contains(component, qubit_id); + }); + assert(!centers.empty()); + auto const component_size = component.size(); + // for now, we ignore the case where there are multiple centers in the same component + auto result = build_bonsai_ternary_tree(centers[0], device, apsp, n_qubits); + if (result.has_value()) { + return result; + } + } + return tl::unexpected(BonsaiFailReason::not_enough_qubits); +} +} // namespace qsyn::hamiltonian diff --git a/src/hamiltonian/bonsai.hpp b/src/hamiltonian/bonsai.hpp new file mode 100644 index 000000000..dfa9e9b41 --- /dev/null +++ b/src/hamiltonian/bonsai.hpp @@ -0,0 +1,27 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Implement the Bonsai mapping for fermionic Hamiltonian to qubit Hamiltonian ] + Author [ Mu-Te (Joshua) Lau (joshmtlau) ] +*/ + +#pragma once + +#include +#include + +#include "device/device.hpp" +#include "device/device_analysis.hpp" +#include "ternary_tree.hpp" + +namespace qsyn::hamiltonian { + +enum class BonsaiFailReason : uint8_t { + not_enough_qubits, + invalid_root_qubit, +}; + +tl::expected build_bonsai_ternary_tree(std::size_t root_qubit_id, device::Device const& device, device::APSPResult const& apsp, size_t n_qubits = std::numeric_limits::max()); + +tl::expected build_bonsai_ternary_tree(device::Device const& device, device::APSPResult const& apsp, size_t n_qubits = std::numeric_limits::max()); + +} // namespace qsyn::hamiltonian diff --git a/src/hamiltonian/f2q_mappings.cpp b/src/hamiltonian/f2q_mappings.cpp new file mode 100644 index 000000000..96fdbd2c8 --- /dev/null +++ b/src/hamiltonian/f2q_mappings.cpp @@ -0,0 +1,105 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Fermion-to-qubit mappings (reusable F2Q logic) ] + Author [ April Wang (april864) ] +*/ + +#include "hamiltonian/f2q_mappings.hpp" + +#include + +#include +#include + +#include "tableau/pauli_product_trait.hpp" + +namespace qsyn::hamiltonian { + +using namespace qsyn::tableau; +using Pauli = qsyn::tableau::Pauli; + +namespace { + +std::vector +multiply_terms(std::vector const& lhs, + std::vector const& rhs) { + // Multiply two lists of ComplexPauliTerm + // we don't attempt to combine like terms here. that's handled in the caller + std::vector result; + for (const auto& l : lhs) { + for (const auto& r : rhs) { + result.emplace_back(l * r); + } + } + return result; +} + +} // namespace + +std::vector +JordanWignerMapping::map(std::size_t p, bool is_creation) const { + // Make terms + // a_p = Z_0 ... Z_{p-1} (X_p - iY_p) + // a_p^ = Z_0 ... Z_{p-1} (X_p + iY_p) + std::vector z_string(this->n_modes(), Pauli::i); + for (size_t i = 0; i < p; i++) { + z_string[i] = Pauli::z; + } + + std::vector x_part = z_string; + x_part[p] = Pauli::x; + std::vector y_part = z_string; + y_part[p] = Pauli::y; + + return { + ComplexPauliTerm(x_part, 0.5), + ComplexPauliTerm(y_part, is_creation + ? std::complex(0, 0.5) + : std::complex(0, -0.5))}; +} + +std::vector +TernaryTreeMapping::map(std::size_t p, bool is_creation) const { + return _mapper.get_pauli_str(p, is_creation); +} + +QubitHamiltonian qubitize(FermionHamiltonian const& f_hamilt, + FermionToQubitMapping const& mapping) { + std::size_t n_qubits = f_hamilt.n_modes(); + + // Accumulator for the final result; maps Pauli strings to their coefficients + std::unordered_map> term_map; + + for (auto const& [original_coeff, operators] : f_hamilt.get_terms()) { + // Start with identity and original coefficient + std::vector current_state; + current_state.emplace_back( + ComplexPauliTerm( + PauliProduct(std::vector(n_qubits, Pauli::i), false), + original_coeff)); + + // Create JW term for each operator in the fermionic term + for (const auto& [p, is_creation] : operators) { + current_state = multiply_terms( + current_state, + mapping.map(p, is_creation)); + } + + // Add term to term_map and combining like terms + std::ranges::for_each(current_state, [&term_map](const auto& t) { + term_map[t.pauli_product()] += t.coeff(); + }); + } + + // Make final qubit hamiltonian from term_map + QubitHamiltonian final_ham(n_qubits); + std::ranges::for_each(term_map, [&final_ham](const auto& term) { + const auto& [pauli_product, coeff] = term; + if (coeff == std::complex(0, 0)) return; + final_ham.add_term(HermitianPauliTerm(pauli_product, coeff.real())); + }); + + return final_ham; +} + +} // namespace qsyn::hamiltonian diff --git a/src/hamiltonian/f2q_mappings.hpp b/src/hamiltonian/f2q_mappings.hpp new file mode 100644 index 000000000..598f4acb6 --- /dev/null +++ b/src/hamiltonian/f2q_mappings.hpp @@ -0,0 +1,65 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Fermion-to-qubit mappings (reusable F2Q logic) ] + Author [ April Wang (april864) ] +*/ + +#pragma once + +#include "hamiltonian/fermionic_hamiltonian.hpp" +#include "hamiltonian/qubit_hamiltonian.hpp" +#include "hamiltonian/tt_mappings.hpp" +#include "tableau/pauli_rotation.hpp" + +namespace qsyn::hamiltonian { + +// Fermion-to-qubit mapping interface +class FermionToQubitMapping { +public: + FermionToQubitMapping(std::size_t n_modes) : _n_modes(n_modes) {} + virtual ~FermionToQubitMapping() = default; + /** + * @brief Map an annihilation or creation operator to a qubit Hamiltonian. + * @param n_qubits The number of qubits. + * @param p The index of the fermion. + * @param is_creation Whether the operator is a creation (true) or + annihilation (false) operator. + * @return The list of ComplexPauliTerms representing the mapped operator. + */ + virtual std::vector + map(std::size_t p, bool is_creation) const = 0; + + std::size_t n_modes() const { return _n_modes; } + +protected: + std::size_t _n_modes; +}; + +class JordanWignerMapping : public FermionToQubitMapping { +public: + JordanWignerMapping(std::size_t n_modes) + : FermionToQubitMapping(n_modes) {} + ~JordanWignerMapping() override = default; + std::vector map( + std::size_t p, bool is_creation) const override; +}; + +class TernaryTreeMapping : public FermionToQubitMapping { +public: + TernaryTreeMapping(std::size_t n_modes) + : FermionToQubitMapping(n_modes), _mapper(n_modes) {} + TernaryTreeMapping(TernaryTree tree) + : FermionToQubitMapping(tree.num_qubits()), _mapper(std::move(tree)) {} + ~TernaryTreeMapping() override = default; + + std::vector map(std::size_t p, bool is_creation) const override; + +private: + TTMapper _mapper; +}; + +QubitHamiltonian qubitize( + FermionHamiltonian const& f_hamilt, + FermionToQubitMapping const& mapping); + +} // namespace qsyn::hamiltonian diff --git a/src/hamiltonian/fermionic_hamiltonian.cpp b/src/hamiltonian/fermionic_hamiltonian.cpp new file mode 100644 index 000000000..e46b23b61 --- /dev/null +++ b/src/hamiltonian/fermionic_hamiltonian.cpp @@ -0,0 +1,141 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Implement fermionic Hamiltonian term class helpers ] + Author [ April Wang (april864) ] +*/ + +#include "hamiltonian/fermionic_hamiltonian.hpp" + +#include +#include +#include +#include +#include +#include + +#include "spdlog/spdlog.h" + +namespace qsyn::hamiltonian { + +} // namespace qsyn::hamiltonian + +std::optional read_fermionic_hamiltonian( + std::filesystem::path const& filepath) { + using qsyn::hamiltonian::FermionHamiltonian; + + std::ifstream file(filepath); + if (!file.is_open()) { + spdlog::error("Cannot open file: {}", filepath.string()); + return std::nullopt; + } + + struct ParsedTerm { + std::complex coeff; + std::vector> ops; + }; + + std::string line; + std::vector parsed_terms; + std::size_t max_mode = 0; + + while (std::getline(file, line)) { + if (line.empty()) continue; + + std::stringstream ss(line); + + // Default coefficient is 1 + 0j when no explicit "(re, im)" is given + double real = 1.0; + double imag = 0.0; + + // Try to parse an explicit "(re, im)" prefix if present + char ch = 0; + if (ss >> ch && ch == '(') { + // We have an explicit coefficient, parse it + real = 0.0; + imag = 0.0; + + if (!(ss >> real)) { + spdlog::error("Failed to parse real part of coefficient in line: '{}'", line); + return std::nullopt; + } + + if (!(ss >> ch) || ch != ',') { + spdlog::error("Expected ',' after real part in line: '{}'", line); + return std::nullopt; + } + + if (!(ss >> imag)) { + spdlog::error("Failed to parse imaginary part of coefficient in line: '{}'", line); + return std::nullopt; + } + + if (!(ss >> ch) || ch != ')') { + spdlog::error("Expected ')' after imaginary part in line: '{}'", line); + return std::nullopt; + } + } else { + // No leading '(' → treat as implicit coefficient 1+0j. + // If we successfully read a non-'(' character, put it back so + // operator tokens are parsed correctly. + if (ss && ch != 0) { + ss.unget(); + } else { + // If extraction failed entirely, fall back to erroring as before. + spdlog::error("Invalid line format (expected operators) in line: '{}'", line); + return std::nullopt; + } + } + + std::vector> ops; + std::string token; + bool has_mode = false; + + while (ss >> token) { + if (token.empty()) continue; + + bool is_creation = false; + if (token.back() == '^') { + is_creation = true; + token.pop_back(); + } + + if (token.empty() || !std::isdigit(static_cast(token.front()))) { + spdlog::error("Invalid mode index token '{}' in line: '{}'", token, line); + return std::nullopt; + } + + std::size_t mode_index = 0; + try { + mode_index = std::stoul(token); + } catch (std::exception const&) { + spdlog::error("Failed to parse mode index '{}' in line: '{}'", token, line); + return std::nullopt; + } + + max_mode = std::max(max_mode, mode_index); + ops.emplace_back(mode_index, is_creation); + has_mode = true; + } + + if (!has_mode) { + spdlog::error("No fermionic operators found in line: '{}'", line); + return std::nullopt; + } + + parsed_terms.push_back(ParsedTerm{std::complex(real, imag), std::move(ops)}); + } + + if (parsed_terms.empty()) { + spdlog::error("File is empty or contains no valid terms."); + return std::nullopt; + } + + auto const n_modes = max_mode + 1; + FermionHamiltonian hamilt(n_modes); + + for (auto const& term : parsed_terms) { + hamilt.add_term(term.coeff, term.ops); + } + + return hamilt; +} diff --git a/src/hamiltonian/fermionic_hamiltonian.hpp b/src/hamiltonian/fermionic_hamiltonian.hpp new file mode 100644 index 000000000..887b7e8da --- /dev/null +++ b/src/hamiltonian/fermionic_hamiltonian.hpp @@ -0,0 +1,40 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Define fermionic Hamiltonian term class ] + Author [ April Wang (april864) ] +*/ + +#pragma once + +#include +#include +#include +#include +#include + +namespace qsyn::hamiltonian { + +class FermionHamiltonian { +public: + using Term = std::pair, std::vector>>; + // Term format: {coefficient, [(mode_index, is_creation_op), ...]} + + FermionHamiltonian(std::size_t n_modes) : _n_modes(n_modes) {} + + void add_term(std::complex coeff, std::vector> const& ops) { + _terms.emplace_back(coeff, ops); + } + + std::size_t n_modes() const { return _n_modes; } + + std::vector const& get_terms() const { return _terms; } + +private: + std::size_t _n_modes; + std::vector _terms; +}; + +} // namespace qsyn::hamiltonian + +std::optional read_fermionic_hamiltonian( + std::filesystem::path const& filepath); diff --git a/src/hamiltonian/qbham_transformations.cpp b/src/hamiltonian/qbham_transformations.cpp new file mode 100644 index 000000000..4b9a7da3c --- /dev/null +++ b/src/hamiltonian/qbham_transformations.cpp @@ -0,0 +1,125 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Implement transformations on QubitHamiltonians ] + Author [ Mu-Te Lau (joshmtlau) ] +*/ + +#include "./qbham_transformations.hpp" + +#include +#include +#include + +#include "./qubit_hamiltonian.hpp" + +namespace qsyn::hamiltonian { + +using PauliTermsSorter = std::function; + +/** + * @brief Sort the Pauli terms of a QubitHamiltonian lexicographically. + * For example, the Pauli terms "XZ" will be sorted before "YZ" if + * 'Pauli::x' is before 'Pauli::y' in the `order` span. + * + * @param hamilt The QubitHamiltonian to sort. + * @param order The order of the Pauli terms. Must contain all the Pauli types + * in the QubitHamiltonian exactly once. + */ +void lexicographic_sort( + QubitHamiltonian& hamilt, + std::span order) { + using QbHamTerm = HermitianPauliTerm; + using Pauli = qsyn::tableau::Pauli; + + constexpr std::array + all_pauli_types = {Pauli::i, Pauli::x, Pauli::y, Pauli::z}; + + DVLAB_ASSERT( + std::ranges::all_of(order, [&](Pauli p) { + return dvlab::contains(all_pauli_types, p); + }), + "`order` must contain each of the Pauli type exactly once"); + + auto const compare_pauli_terms = + [&](QbHamTerm const& a, QbHamTerm const& b) { + for (size_t i = 0; i < a.n_qubits(); ++i) { + if (a.get_pauli_type(i) != b.get_pauli_type(i)) { + return std::ranges::find(order, a.get_pauli_type(i)) < + std::ranges::find(order, b.get_pauli_type(i)); + } + } + return false; + }; + + std::ranges::sort(hamilt, compare_pauli_terms); +} + +/** + * @brief Sort the Pauli terms of a QubitHamiltonian lexicographically. + * For example, the Pauli terms "XZ" will be sorted before "YZ" if + * 'x' is before 'y' in the `order_str` string_view. + * + * @param hamilt The QubitHamiltonian to sort. + * @param order_str The order of the Pauli terms. Case-sensitive. Must contains + * all the characters in "xyzi" exactly once. + */ +void lexicographic_sort( + QubitHamiltonian& hamilt, + std::string_view order_str) { + DVLAB_ASSERT( + is_valid_pauli_letter_order(order_str), + "`order_str` must contain all characters in 'xyzi' exactly once"); + + std::array order_array{}; + std::ranges::copy( + order_str | + std::views::transform([](char c) -> qsyn::tableau::Pauli { + switch (c) { + case 'x': + return qsyn::tableau::Pauli::x; + case 'y': + return qsyn::tableau::Pauli::y; + case 'z': + return qsyn::tableau::Pauli::z; + case 'i': + return qsyn::tableau::Pauli::i; + default: + DVLAB_UNREACHABLE("Invalid Pauli letter"); + return qsyn::tableau::Pauli::i; + } + }), + order_array.begin()); + + lexicographic_sort(hamilt, std::span{order_array}); +} + +bool is_valid_pauli_letter_order(std::string_view order_str) { + return order_str.size() == 4 && + std::ranges::all_of(order_str, [](char c) { + using namespace std::literals; + return "xyzi"sv.find(c) != std::string_view::npos; + }); +} + +void lexicographic_sort(QubitHamiltonian& hamilt) { + lexicographic_sort(hamilt, "xyzi"); +} + +/** + * @brief Sort the Pauli terms of a QubitHamiltonian in order of decreasing magnitude. + * For example, the Pauli term "(1/2)XZ" will be sorted before "(1/4)YZ". + * + * @param hamilt The QubitHamiltonian to sort. + */ +void magnitude_sort(QubitHamiltonian& hamilt) { + auto const compare_term_magnitudes = + [](HermitianPauliTerm const& a, HermitianPauliTerm const& b) { + double a_magnitude = std::abs(a.coeff()); + double b_magnitude = std::abs(b.coeff()); + return a_magnitude > b_magnitude; + }; + + std::ranges::sort(hamilt, compare_term_magnitudes); +} + +} // namespace qsyn::hamiltonian diff --git a/src/hamiltonian/qbham_transformations.hpp b/src/hamiltonian/qbham_transformations.hpp new file mode 100644 index 000000000..f9eb4f382 --- /dev/null +++ b/src/hamiltonian/qbham_transformations.hpp @@ -0,0 +1,38 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Define transformations on QubitHamiltonians ] + Author [ Mu-Te Lau (joshmtlau) ] +*/ + +#pragma once + +#include +#include + +#include "./qubit_hamiltonian.hpp" + +namespace qsyn::hamiltonian { + +using PauliTermsSorter = std::function; + +/* + * Lexicographic sort + */ +void lexicographic_sort( + QubitHamiltonian& hamilt, + std::span order); + +void lexicographic_sort( + QubitHamiltonian& hamilt, + std::string_view order_str); + +bool is_valid_pauli_letter_order(std::string_view order_str); + +void lexicographic_sort(QubitHamiltonian& hamilt); + +/* + * Magnitude sort + */ +void magnitude_sort(QubitHamiltonian& hamilt); + +} // namespace qsyn::hamiltonian diff --git a/src/hamiltonian/qubit_hamiltonian.cpp b/src/hamiltonian/qubit_hamiltonian.cpp new file mode 100644 index 000000000..a900e8773 --- /dev/null +++ b/src/hamiltonian/qubit_hamiltonian.cpp @@ -0,0 +1,156 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Define qubit Hamiltonian term class ] + Author [ Mu-Te Lau (joshmtlau) ] +*/ + +#include "qubit_hamiltonian.hpp" + +#include + +#include +#include +#include +#include +#include + +#include "spdlog/spdlog.h" + +namespace qsyn { + +namespace hamiltonian { + +ComplexPauliTerm to_complex_pauli_term(HermitianPauliTerm const& term) { + return ComplexPauliTerm(term.pauli_product(), std::complex(term.coeff(), 0.0)); +} + +HermitianPauliTerm to_hermitian_pauli_term(ComplexPauliTerm const& term) { + return HermitianPauliTerm(term.pauli_product(), term.coeff().real()); +} + +QubitHamiltonian::QubitHamiltonian(size_t n_qubits) : _n_qubits(n_qubits) {} + +QubitHamiltonian::QubitHamiltonian( + std::initializer_list const& terms) + : _terms(terms), + _n_qubits(_terms.begin()->n_qubits()) {} + +QubitHamiltonian& +QubitHamiltonian::h(size_t qubit) noexcept { + for (auto& term : _terms) { + term.h(qubit); + } + return *this; +} + +QubitHamiltonian& +QubitHamiltonian::s(size_t qubit) noexcept { + for (auto& term : _terms) { + term.s(qubit); + } + return *this; +} + +QubitHamiltonian& +QubitHamiltonian::cx(size_t control, size_t target) noexcept { + for (auto& term : _terms) { + term.cx(control, target); + } + return *this; +} + +QubitHamiltonian& +QubitHamiltonian::add_term(HermitianPauliTerm const& term) { + if (term.n_qubits() != _n_qubits) { + throw std::invalid_argument("term has different number of qubits"); + } + _terms.push_back(term); + return *this; +} + +std::string QubitHamiltonian::to_string() const { + if (_terms.empty()) { + return "0"; + } + return fmt::format( + "{}", + fmt::join( + _terms | std::views::transform([](auto const& term) { + return term.to_string(); + }), + " + ")); +} + +bool is_all_commutative(QubitHamiltonian const& hamilt) { + for (auto it = hamilt.begin(); it != hamilt.end(); ++it) { + for (auto jt = std::next(it); jt != hamilt.end(); ++jt) { + if (!is_commutative(*it, *jt)) { + return false; + } + } + } + return true; +} + +ComplexPauliTerm& ComplexPauliTerm::operator*=(ComplexPauliTerm const& rhs) { + auto const power_of_i = qsyn::tableau::power_of_i( + this->pauli_product(), rhs.pauli_product()); + if ((power_of_i % 2) == 1) { + this->coeff() *= std::complex(0, 1); + } + this->pauli_product() *= rhs.pauli_product(); + this->coeff() *= rhs.coeff(); + this->_normalize(); + return *this; +} + +} // namespace hamiltonian +} // namespace qsyn + +std::optional read_qubit_hamiltonian( + std::filesystem::path const& filepath) { + using namespace qsyn::hamiltonian; + + std::ifstream file(filepath); + if (!file.is_open()) { + spdlog::error("Cannot open file: {}", filepath.string()); + return std::nullopt; + } + + std::string line; + std::vector> terms; + size_t n_qubits = 0; + + while (std::getline(file, line)) { + if (line.empty()) continue; + + std::stringstream ss(line); + double coeff; + std::string pauli_str; + + if (ss >> coeff >> pauli_str) { + if (n_qubits == 0) { + n_qubits = pauli_str.length(); + } else if (pauli_str.length() != n_qubits) { + spdlog::error( + "Inconsistent qubit count in file. Expected {}, got '{}'", + n_qubits, + pauli_str); + return std::nullopt; + } + terms.emplace_back(coeff, pauli_str); + } + } + + if (n_qubits == 0) { + spdlog::error("File is empty or contains no valid terms."); + return std::nullopt; + } + + QubitHamiltonian hamilt(n_qubits); + for (auto const& [coeff, pauli_str] : terms) { + hamilt.add_term(HermitianPauliTerm(pauli_str, coeff)); + } + + return hamilt; +} diff --git a/src/hamiltonian/qubit_hamiltonian.hpp b/src/hamiltonian/qubit_hamiltonian.hpp new file mode 100644 index 000000000..51ab38900 --- /dev/null +++ b/src/hamiltonian/qubit_hamiltonian.hpp @@ -0,0 +1,226 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Define qubit Hamiltonian term class ] + Author [ Mu-Te Lau (joshmtlau) ] +*/ + +#pragma once + +#include + +#include +#include +#include +#include + +#include "tableau/pauli_product_trait.hpp" + +namespace qsyn { + +namespace hamiltonian { + +template +class PauliTermInterface + : public qsyn::tableau::PauliProductTrait> { +public: + using Pauli = qsyn::tableau::Pauli; + using PauliProduct = qsyn::tableau::PauliProduct; + PauliTermInterface( + std::initializer_list const& pauli_list, + CoeffT coeff) + : _pauli_product(pauli_list, false), _coeff(coeff) { + _normalize(); + } + + PauliTermInterface(std::string_view pauli_str, CoeffT coeff) + : _pauli_product(pauli_str), _coeff(coeff) { + _normalize(); + } + + PauliTermInterface( + PauliProduct const& pauli_product, CoeffT coeff) + : _pauli_product(pauli_product), _coeff(coeff) { + _normalize(); + } + + template S> + requires std::same_as, Pauli> + PauliTermInterface(I first, S last, CoeffT coeff) + : _pauli_product(first, last, false), _coeff(coeff) { + _normalize(); + } + + template + requires std::same_as, Pauli> + PauliTermInterface(R const& r, CoeffT coeff) + : _pauli_product(std::ranges::begin(r), std::ranges::end(r), false), + _coeff(coeff) { + _normalize(); + } + + size_t n_qubits() const { return _pauli_product.n_qubits(); } + Pauli get_pauli_type(size_t i) const { return _pauli_product.get_pauli_type(i); } + + bool is_i(size_t i) const { return _pauli_product.is_i(i); } + bool is_x(size_t i) const { return _pauli_product.is_x(i); } + bool is_y(size_t i) const { return _pauli_product.is_y(i); } + bool is_z(size_t i) const { return _pauli_product.is_z(i); } + + PauliProduct const& pauli_product() const { return _pauli_product; } + PauliProduct& pauli_product() { return _pauli_product; } + CoeffT coeff() const { return _coeff; } + CoeffT& coeff() { return _coeff; } + + bool operator==(PauliTermInterface const& rhs) const { + return _pauli_product == rhs._pauli_product && _coeff == rhs._coeff; + } + bool operator!=(PauliTermInterface const& rhs) const { return !(*this == rhs); } + + std::string to_string(char signedness = '-') const { + return fmt::format("{} * {}", _coeff, _pauli_product.to_string(signedness)); + } + std::string to_bit_string() const { + return fmt::format( + "{} {}", + _pauli_product.to_bit_string().substr(0, 2 * n_qubits() + 1), _coeff); + } + + PauliTermInterface& h(size_t qubit) noexcept override { + _pauli_product.h(qubit); + _normalize(); + return *this; + } + PauliTermInterface& s(size_t qubit) noexcept override { + _pauli_product.s(qubit); + _normalize(); + return *this; + } + PauliTermInterface& cx(size_t control, size_t target) noexcept override { + _pauli_product.cx(control, target); + _normalize(); + return *this; + } + + bool is_commutative(PauliTermInterface const& rhs) const { + return _pauli_product.is_commutative(rhs._pauli_product); + } + + bool is_diagonal() const { return _pauli_product.is_diagonal(); } + +protected: + qsyn::tableau::PauliProduct _pauli_product; + CoeffT _coeff; + + void _normalize() { + if (_pauli_product.is_neg()) { + _pauli_product.negate(); + _coeff *= -1; + } + } +}; + +class HermitianPauliTerm : public PauliTermInterface { +public: + using PauliTermInterface::PauliTermInterface; +}; +class ComplexPauliTerm : public PauliTermInterface> { +public: + using PauliTermInterface::PauliTermInterface; + // NOTE: the multiplication is only closed for ComplexPauliTerm + // This is why we don't define it in the PauliTermInterface base class + ComplexPauliTerm& operator*=(ComplexPauliTerm const& rhs); + friend ComplexPauliTerm operator*( + ComplexPauliTerm lhs, ComplexPauliTerm const& rhs) { + lhs *= rhs; + return lhs; + } +}; + +ComplexPauliTerm to_complex_pauli_term(HermitianPauliTerm const& term); + +/** + * Convert a complex Pauli term to a Hermitian Pauli term. + * This function ignores the imaginary part of the complex coefficient. + * + * @param term The complex Pauli term to convert. + * @return The Hermitian Pauli term. + */ +HermitianPauliTerm to_hermitian_pauli_term(ComplexPauliTerm const& term); + +template +inline bool is_commutative( + PauliTermInterface const& lhs, PauliTermInterface const& rhs) { + return lhs.is_commutative(rhs); +} + +class QubitHamiltonian + : public qsyn::tableau::PauliProductTrait { +public: + QubitHamiltonian(size_t n_qubits); + QubitHamiltonian(std::initializer_list const& terms); + + size_t n_qubits() const { return _terms.begin()->n_qubits(); } + + QubitHamiltonian& h(size_t qubit) noexcept override; + QubitHamiltonian& s(size_t qubit) noexcept override; + QubitHamiltonian& cx(size_t control, size_t target) noexcept override; + + QubitHamiltonian& add_term(HermitianPauliTerm const& term); + template S> + QubitHamiltonian& add_terms(I first, S last) { + for (auto it = first; it != last; ++it) { + add_term(*it); + } + return *this; + } + template + QubitHamiltonian& add_terms(R const& r) { + return add_terms(std::ranges::begin(r), std::ranges::end(r)); + } + + auto begin() const { + return _terms.begin(); + } + auto end() const { + return _terms.end(); + } + auto begin() { + return _terms.begin(); + } + auto end() { + return _terms.end(); + } + + auto n_terms() const { + return _terms.size(); + } + + std::string to_string() const; + +private: + std::vector _terms; + size_t _n_qubits; +}; + +/** + * Check if all terms in the Hamiltonian are commutative. + * + * @param hamiltonian The Hamiltonian to check. + * @return True if all terms are commutative, false otherwise. + */ +bool is_all_commutative(QubitHamiltonian const& hamilt); + +} // namespace hamiltonian +} // namespace qsyn + +std::optional read_qubit_hamiltonian( + std::filesystem::path const& filepath); + +template <> +struct fmt::formatter> { + constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); } + template + auto format(std::complex const& c, FormatContext& ctx) const { + return fmt::format_to(ctx.out(), "({}, {})", c.real(), c.imag()); + } +}; diff --git a/src/hamiltonian/ternary_tree.cpp b/src/hamiltonian/ternary_tree.cpp new file mode 100644 index 000000000..15ce20ff2 --- /dev/null +++ b/src/hamiltonian/ternary_tree.cpp @@ -0,0 +1,277 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Ternary tree structure ] + Author [ April Wang (april864), Mu-Te (Joshua) Lau (joshmtlau) ] +*/ + +#include "ternary_tree.hpp" + +#include + +#include +#include +#include +#include +#include + +namespace qsyn::hamiltonian { + +TernaryEdge* TernaryNode::get_edge(BranchType branch) const { + auto edge_id = static_cast>(branch); + + // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-constant-array-index) + return edges[edge_id].get(); +} + +void TernaryNode::set_edge(BranchType branch, std::unique_ptr&& edge) { + auto edge_id = static_cast>(branch); + + // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-constant-array-index) + edges[edge_id] = std::move(edge); +} + +TernaryTree::TernaryTree() : _num_qubits(1) { + _root = std::make_unique(0); + _index_to_node[0] = _root.get(); +} + +TernaryTree::TernaryTree(size_t num_qubits) { + if (num_qubits == 0) { + throw std::invalid_argument("A ternary tree must have at least one node (root)"); + } + + _root = std::make_unique(0); + _index_to_node[0] = _root.get(); + + _num_qubits = 1; + + size_t parent_index = 0; + while (_num_qubits < num_qubits) { + TernaryNode* parent = get_node_by_index(parent_index); + + for (auto branch : {BranchType::left, BranchType::mid, BranchType::right}) { + if (_num_qubits >= num_qubits) break; + add_qubit_node(parent, branch); + } + + parent_index++; + } + + assert(_num_qubits == num_qubits); + + append_legs_to_tree(); +} + +namespace { + +std::unique_ptr clone_node( + TernaryNode* old_node, TernaryNode* new_parent, + std::unordered_map& old_to_new) { + std::unique_ptr new_node; + if (old_node->is_leg()) { + new_node = std::make_unique(new_parent, nullptr); + } else { + auto const old_qubit_node = dynamic_cast(old_node); + assert(old_qubit_node); + new_node = std::make_unique(old_qubit_node->id, new_parent, nullptr); + dynamic_cast(new_node.get())->qubit_label = old_qubit_node->qubit_label; + } + TernaryNode* new_node_ptr = new_node.get(); + old_to_new[old_node] = new_node_ptr; + + for (int b = 0; b < 3; ++b) { + auto const branch = static_cast(b); + TernaryEdge* old_edge = old_node->get_edge(branch); + if (old_edge && old_edge->target) { + auto new_target = + clone_node(old_edge->target.get(), new_node_ptr, old_to_new); + auto new_edge = + std::make_unique(new_node_ptr, std::move(new_target), branch); + new_edge->target->incoming_edge = new_edge.get(); + new_node_ptr->set_edge(branch, std::move(new_edge)); + } + } + return new_node; +} + +} // namespace + +TernaryTree::TernaryTree(TernaryTree const& other) : _num_qubits(other._num_qubits) { + if (!other._root) { + _root = std::make_unique(0); + _index_to_node[0] = _root.get(); + _num_qubits = 1; + return; + } + std::unordered_map old_to_new; + _root = clone_node(other._root.get(), nullptr, old_to_new); + + for (auto const& [index, old_node] : other._index_to_node) { + _index_to_node[index] = old_to_new.at(old_node); + } + for (auto const& [qubit, old_node] : other._qubit_to_node) { + _qubit_to_node[qubit] = old_to_new.at(old_node); + } + _legs.reserve(other._legs.size()); + for (TernaryLeg* old_leg : other._legs) { + _legs.push_back(dynamic_cast(old_to_new.at(old_leg))); + } +} + +void TernaryTree::swap(TernaryTree& other) noexcept { + _root.swap(other._root); + + std::swap(_num_qubits, other._num_qubits); + + std::swap(_index_to_node, other._index_to_node); + std::swap(_qubit_to_node, other._qubit_to_node); + std::swap(_legs, other._legs); +} + +void swap(TernaryTree& a, TernaryTree& b) noexcept { + a.swap(b); +} + +void TernaryTree::assign_qubit(size_t node_index, QubitIdType qubit_label) { + TernaryNode* node = _index_to_node.at(node_index); + + dynamic_cast(node)->qubit_label = qubit_label; + _qubit_to_node[qubit_label] = node; +} + +void TernaryTree::swap_indices(std::size_t id1, std::size_t id2) { + if (id1 == id2) return; + + auto* node1 = static_cast(_index_to_node.at(id1)); + auto* node2 = static_cast(_index_to_node.at(id2)); + + std::swap(node1->id, node2->id); + + _index_to_node[id1] = node2; + _index_to_node[id2] = node1; + } + +size_t TernaryTree::add_qubit_node(TernaryNode* parent, BranchType branch) { + if (parent->get_edge(branch)) { + throw std::runtime_error("Branch already has a node"); + } + + auto const node_index = _num_qubits++; + auto child = std::make_unique(node_index, parent); + TernaryNode* child_ptr = child.get(); + _index_to_node[node_index] = child_ptr; + + auto edge = std::make_unique(parent, std::move(child), branch); + child_ptr->incoming_edge = static_cast(edge.get()); + parent->set_edge(branch, std::move(edge)); + return node_index; +} + +/** + * @brief Add a qubit node to the first empty branch of the parent. + * @param parent Parent node + * @return Index of the added qubit node, or std::nullopt if no empty branch is found + */ +std::optional TernaryTree::add_qubit_node_to_first_empty_branch(TernaryNode* parent) { + for (auto branch : {BranchType::left, BranchType::mid, BranchType::right}) { + if (!parent->get_edge(branch)) { + return std::make_optional(add_qubit_node(parent, branch)); + } + } + return std::nullopt; +} + +size_t TernaryTree::add_leg_node(TernaryNode* parent, BranchType branch) { + if (parent->get_edge(branch)) { + throw std::runtime_error("Branch already has a node"); + } + + auto child = std::make_unique(parent); + TernaryLeg* child_ptr = child.get(); + auto edge = std::make_unique(parent, std::move(child), branch); + child_ptr->incoming_edge = static_cast(edge.get()); + parent->set_edge(branch, std::move(edge)); + _legs.push_back(child_ptr); + return _legs.size() - 1; +} + +/** + * @brief Append legs all qubit nodes in the tree. + * Call this function after adding all qubit nodes to the tree. + */ +void TernaryTree::append_legs_to_tree() { + for (size_t i = 0; i < _num_qubits; ++i) { + TernaryNode* node = get_node_by_index(i); + for (auto branch : {BranchType::left, BranchType::mid, BranchType::right}) { + if (!node->get_edge(branch)) { + add_leg_node(node, branch); + } + } + } +} + +namespace { + +void append_node_hierarchy(TernaryNode* node, std::string const& prefix, + bool is_last, std::string& out) { + auto const branch_char = is_last ? "└── " : "├── "; + out += prefix + branch_char; + + if (node->is_leg()) { + out += "(leg)\n"; + return; + } + auto const qubit_node = dynamic_cast(node); + assert(qubit_node); + if (qubit_node->qubit_label.has_value()) { + out += fmt::format("q{}\n", *qubit_node->qubit_label); + } else { + out += "(unassigned)\n"; + } + + std::array children = {nullptr, nullptr, nullptr}; + size_t n = 0; + for (auto branch : {BranchType::left, BranchType::mid, BranchType::right}) { + TernaryEdge* e = node->get_edge(branch); + if (e && e->target) { + children.at(n) = e->target.get(); + n++; + } + } + + std::string child_prefix = prefix + (is_last ? " " : "│ "); + for (size_t i = 0; i < n; ++i) { + append_node_hierarchy(children.at(i), child_prefix, i == n - 1, out); + } +} + +} // namespace + +std::string to_string(TernaryTree const& tree) { + std::string out; + TernaryNode* root = tree.get_root(); + if (!root) { + return "(empty tree)"; + } + auto const root_qubit_node = dynamic_cast(root); + assert(root_qubit_node); + if (root_qubit_node->qubit_label.has_value()) { + out += fmt::format("q{}\n", root_qubit_node->qubit_label.value()); + } else { + out += "(unassigned)\n"; + } + std::array children = {nullptr, nullptr, nullptr}; + size_t n = 0; + for (auto branch : {BranchType::left, BranchType::mid, BranchType::right}) { + TernaryEdge* e = root->get_edge(branch); + if (e && e->target) { + children.at(n++) = e->target.get(); + } + } + std::string child_prefix = ""; + for (size_t i = 0; i < n; ++i) { + append_node_hierarchy(children.at(i), child_prefix, i == n - 1, out); + } + return out; +} +} // namespace qsyn::hamiltonian diff --git a/src/hamiltonian/ternary_tree.hpp b/src/hamiltonian/ternary_tree.hpp new file mode 100644 index 000000000..a2d6e5f7c --- /dev/null +++ b/src/hamiltonian/ternary_tree.hpp @@ -0,0 +1,116 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Ternary tree structure ] + Author [ April Wang (april864), Mu-Te (Joshua) Lau (joshmtlau) ] +*/ + +#pragma once + +#include +#include +#include +#include +#include + +#include "qsyn/qsyn_type.hpp" + +namespace qsyn::hamiltonian { + +enum class BranchType : uint8_t { + left = 0, + mid = 1, + right = 2, +}; + +struct TernaryEdge; + +struct TernaryNode { + TernaryNode* parent; + + std::array, 3> edges; + TernaryEdge* incoming_edge; + + TernaryNode(TernaryNode* p = nullptr, TernaryEdge* e = nullptr) + : parent(p), incoming_edge(e) {} + + virtual ~TernaryNode() = default; + virtual bool is_leg() const { return false; } + + TernaryEdge* get_edge(BranchType branch) const; + TernaryEdge* get_left() const { return get_edge(BranchType::left); } + TernaryEdge* get_mid() const { return get_edge(BranchType::mid); } + TernaryEdge* get_right() const { return get_edge(BranchType::right); } + void set_edge(BranchType branch, std::unique_ptr&& edge); +}; + +struct TernaryQubitNode : public TernaryNode { + std::size_t id; + std::optional qubit_label{std::nullopt}; + bool is_braided{false}; + TernaryQubitNode(std::size_t id, TernaryNode* p = nullptr, TernaryEdge* e = nullptr) + : TernaryNode(p, e), id(id) {} +}; + +struct TernaryLeg : public TernaryNode { + TernaryLeg(TernaryNode* p = nullptr, TernaryEdge* e = nullptr) + : TernaryNode(p, e) {} + + bool is_leg() const override { return true; } +}; + +struct TernaryEdge { + TernaryNode* source; + std::unique_ptr target; + BranchType branch; + + TernaryEdge(TernaryNode* s, std::unique_ptr&& t, BranchType b) + : source(s), target(std::move(t)), branch(b) {} +}; + +class TernaryTree { // NOLINT(hicpp-special-member-functions, cppcoreguidelines-special-member-functions) : copy-swap idiom +public: + TernaryTree(); + TernaryTree(size_t num_qubits); + + TernaryTree(TernaryTree const& other); + TernaryTree(TernaryTree&& other) noexcept = default; + + TernaryTree& operator=(TernaryTree copy) { + copy.swap(*this); + return *this; + } + + void swap(TernaryTree& other) noexcept; + friend void swap(TernaryTree& a, TernaryTree& b) noexcept; + + void assign_qubit(size_t node_index, QubitIdType qubit_label); + void swap_indices(std::size_t id1, std::size_t id2); + + TernaryNode* get_root() const { return _root.get(); } + std::unique_ptr& get_root_ptr() { return _root; } + + TernaryNode* get_node_by_qubit(QubitIdType qubit_label) const { return _qubit_to_node.at(qubit_label); } + TernaryNode* get_node_by_index(size_t node_index) const { return _index_to_node.at(node_index); } + + const std::vector& get_legs() const { return _legs; } + TernaryLeg* get_leg(size_t i) const { return _legs.at(i); } + + size_t num_qubits() const { return _num_qubits; } + + size_t add_qubit_node(TernaryNode* parent, BranchType branch); + std::optional add_qubit_node_to_first_empty_branch(TernaryNode* parent); + size_t add_leg_node(TernaryNode* parent, BranchType branch); + + void append_legs_to_tree(); + +private: + std::unique_ptr _root; + std::unordered_map _index_to_node; + std::unordered_map _qubit_to_node; + std::vector _legs; + size_t _num_qubits; +}; + +std::string to_string(TernaryTree const& tree); + +} // namespace qsyn::hamiltonian diff --git a/src/hamiltonian/tree_rotations.cpp b/src/hamiltonian/tree_rotations.cpp new file mode 100644 index 000000000..a32fab3db --- /dev/null +++ b/src/hamiltonian/tree_rotations.cpp @@ -0,0 +1,326 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Ternary tree rotations ] + Author [ April Wang (april864)] +*/ + +#include "tree_rotations.hpp" + +#include +#include +#include + +#include "hamiltonian/f2q_mappings.hpp" +#include "hamiltonian/qubit_hamiltonian.hpp" +#include "hamiltonian/fermionic_hamiltonian.hpp" +#include "hamiltonian/ternary_tree.hpp" + +namespace qsyn::hamiltonian { + +// Non-connectivity preserving (NCP): choose a random terminal node-v with +// three legs and attach it to the free leg of another node-w that is neither +// v nor its parent. For CP, check that this is allowed on the hardware. +void TreeRotator::ncp_leaf_move(TernaryTree* tt) { + if (!tt || tt->num_qubits() < 2) return; + + // Find nodes with three legs + std::vector candidate_nodes; + for (size_t i = 0; i < tt->num_qubits(); ++i) { + TernaryNode* node = tt->get_node_by_index(i); + if (node == tt->get_root()) continue; + + TernaryEdge* left_edge = node->get_left(); + TernaryEdge* mid_edge = node->get_mid(); + TernaryEdge* right_edge = node->get_right(); + + if (left_edge && left_edge->target && left_edge->target->is_leg() && + mid_edge && mid_edge->target && mid_edge->target->is_leg() && + right_edge && right_edge->target && right_edge->target->is_leg()) { + candidate_nodes.push_back(node); + } + } + if (candidate_nodes.empty()) return; + + // Choose random node + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution dist_v(0, candidate_nodes.size() - 1); + TernaryNode* v = candidate_nodes[dist_v(gen)]; + + // Find free leg of another node that is neither v nor its parent + std::vector candidate_legs; + for (TernaryLeg* leg : tt->get_legs()) { + TernaryNode* w = leg->parent; + if (w != v && w != v->parent) { + candidate_legs.push_back(leg); + } + } + if (candidate_legs.empty()) return; + + // Choose random leg + std::uniform_int_distribution dist_leg(0, candidate_legs.size() - 1); + TernaryLeg* l = candidate_legs[dist_leg(gen)]; + + // Do the swap + TernaryEdge* edge_v = v->incoming_edge; + TernaryEdge* edge_l = l->incoming_edge; + edge_v->target.swap(edge_l->target); + + v->parent = edge_l->source; + v->incoming_edge = edge_l; + + l->parent = edge_v->source; + l->incoming_edge = edge_v; +} + +void TreeRotator::cp_leaf_move(TernaryTree* tt, qsyn::device::Device const& device) { + if (!tt || tt->num_qubits() < 2) return; + + struct CandidatePair { + TernaryNode* v; + TernaryLeg* leg; + }; + std::vector candidates; + + // Find all valid node and leg combinations + for (size_t i = 0; i < tt->num_qubits(); ++i) { + TernaryNode* v = tt->get_node_by_index(i); + if (v == tt->get_root()) continue; + + // Find v + auto* e_left = v->get_left(); + auto* e_mid = v->get_mid(); + auto* e_right = v->get_right(); + + // ADDED: Null checks before accessing targets + if (e_left && e_left->target && e_left->target->is_leg() && + e_mid && e_mid->target && e_mid->target->is_leg() && + e_right && e_right->target && e_right->target->is_leg()) { + + auto* v_qubit = static_cast(v); + if (!v_qubit->qubit_label.has_value()) continue; + auto v_qindex = v_qubit->qubit_label.value(); + + // Find w + for (TernaryLeg* leg : tt->get_legs()) { + TernaryNode* w = leg->parent; + + if (w != v && w != v->parent) { + auto* w_qubit = static_cast(w); + if (!w_qubit->qubit_label.has_value()) continue; + auto w_qindex = w_qubit->qubit_label.value(); + + // Check if the hardware has the necessary connection + if (device.is_adjacent(v_qindex, w_qindex) || + device.is_adjacent(w_qindex, v_qindex)) { + candidates.push_back({v, leg}); + } + } + } + } + } + if (candidates.empty()) return; + + // Choose a pair to apply leaf move to + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution dist(0, candidates.size() - 1); + + CandidatePair move_pair = candidates[dist(gen)]; + TernaryNode* v = move_pair.v; + TernaryLeg* l = move_pair.leg; + + // Do the swap + TernaryEdge* edge_v = v->incoming_edge; + TernaryEdge* edge_l = l->incoming_edge; + + edge_v->target.swap(edge_l->target); + + v->parent = edge_l->source; + v->incoming_edge = edge_l; + + l->parent = edge_v->source; + l->incoming_edge = edge_v; +} + +// A node v different from the root with out-degree at most 2 is chosen +// as a new root. The path from root to v is identified, and the tree is +// updated so that child and parent designations are swapped along the path. +void TreeRotator::root_change(TernaryTree* tt) { + if (!tt || tt->num_qubits() < 2) return; + + // Find candidate nodes for new root + std::vector candidate_roots; + for (size_t i = 0; i < tt->num_qubits(); ++i) { + TernaryNode* node = tt->get_node_by_index(i); + if (node == tt->get_root()) continue; + + bool has_leg = false; + for (auto b : {BranchType::left, BranchType::mid, BranchType::right}) { + TernaryEdge* edge = node->get_edge(b); + if (edge && edge->target && edge->target->is_leg()) { + has_leg = true; + break; + } + } + if (has_leg) { candidate_roots.push_back(node); } + } + if (candidate_roots.empty()) return; + + // Pick random new root + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution dist_root(0, candidate_roots.size() - 1); + TernaryNode* new_root = candidate_roots[dist_root(gen)]; + + // Choose which leg will hold the new root's previous parent + std::vector candidate_edges; + for (auto b : {BranchType::left, BranchType::mid, BranchType::right}) { + TernaryEdge* edge = new_root->get_edge(b); + if (edge && edge->target && edge->target->is_leg()) { + candidate_edges.push_back(edge); + } + } + std::uniform_int_distribution dist_leg(0, candidate_edges.size() - 1); + TernaryEdge* leg_edge = candidate_edges[dist_leg(gen)]; + TernaryNode* leg = leg_edge->target.get(); + + // Get path from old root to new root + std::vector path_nodes; + TernaryNode* curr = new_root; + while (curr != nullptr) { + path_nodes.push_back(curr); + curr = curr->parent; + } + std::reverse(path_nodes.begin(), path_nodes.end()); + // path_nodes: [n0, n1, ..., nk] where n0 is old root and nk is new root + + size_t k = path_nodes.size() - 1; + if (k == 0) return; + std::vector path_edges; + for (size_t i = 1; i <= k; ++i) { + path_edges.push_back(path_nodes[i]->incoming_edge); + } + // path_edges: [e1, e2, ..., ek] where ei is the edge from n{i-1} to ni (edges from old root->new root) + + // Get all unique_ptrs involved in the swaps + std::unique_ptr root_ptr = std::move(tt->get_root_ptr()); + std::vector> node_ptrs; + for (size_t i = 0; i < k; ++i) { + node_ptrs.push_back(std::move(path_edges[i]->target)); + } + std::unique_ptr leg_ptr = std::move(leg_edge->target); + + // Reverse edge targets + tt->get_root_ptr() = std::move(node_ptrs.back()); // assigns new root + leg_edge->target = std::move(k > 1 ? node_ptrs[k-2] : root_ptr); // edge to previously chosen leg points to next node + + for (size_t i = k - 1; i >= 1; --i) { + path_edges[i]->target = std::move(i == 1 ? root_ptr : node_ptrs[i-2]); + } + path_edges[0]->target = std::move(leg_ptr); // previous edge to new root points to leg + + // Update parent and incoming_edge pointers + leg->parent = path_nodes[0]; + leg->incoming_edge = path_edges[0]; + + for (size_t i = 0; i < k; ++i) { + path_nodes[i]->parent = path_nodes[i+1]; + path_nodes[i]->incoming_edge = (i == k - 1) ? leg_edge : path_edges[i+1]; + } + + path_nodes[k]->parent = nullptr; + path_nodes[k]->incoming_edge = nullptr; +} + +// A node with an out-degree of at least 1 is chosen, and the Pauli operators +// associated with the links are changed. +void TreeRotator::pauli_shuffle(TernaryTree* tt) { + if (!tt || tt->num_qubits() == 0) return; + + // Get candidate nodes + std::vector candidate_nodes; + for (size_t i = 0; i < tt->num_qubits(); ++i) { + TernaryNode* node = tt->get_node_by_index(i); + + int out_degree = 0; + for (auto b : {BranchType::left, BranchType::mid, BranchType::right}) { + TernaryEdge* edge = node->get_edge(b); + if (!edge->target->is_leg()) { + out_degree++; + } + } + if (out_degree >= 1) { + candidate_nodes.push_back(node); + } + } + if (candidate_nodes.empty()) return; + + // Choose random node + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution dist_v(0, candidate_nodes.size() - 1); + TernaryNode* v = candidate_nodes[dist_v(gen)]; + + // Get unique_ptrs of the node's outgoing edges + std::array, 3> edge_ptrs; + edge_ptrs[0] = std::move(v->edges[static_cast(BranchType::left)]); + edge_ptrs[1] = std::move(v->edges[static_cast(BranchType::mid)]); + edge_ptrs[2] = std::move(v->edges[static_cast(BranchType::right)]); + + // Shuffle edges + std::shuffle(edge_ptrs.begin(), edge_ptrs.end(), gen); + + // Reattach edges and update branch field + int branch_idx = 0; + for (auto& edge_ptr : edge_ptrs) { + auto new_branch = static_cast(branch_idx); + if (edge_ptr) { + edge_ptr->branch = new_branch; + } + + v->set_edge(new_branch, std::move(edge_ptr)); + branch_idx++; + } +} + +// For nodes with labels (i, u, b) and (i', u', b') the labels are changed to +// (i', u, b) and (i, u', b') respectively. +void TreeRotator::mode_association_swap(TernaryTree* tt) { + if (!tt || tt->num_qubits() < 2) return; + + // Choose two nodes + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution dist(0, tt->num_qubits() - 1); + + size_t i = dist(gen); + size_t i_prime = dist(gen); + + // don't pick same node twice + while (i == i_prime) { + i_prime = dist(gen); + } + + // Swap + tt->swap_indices(i, i_prime); +} + +// For a node with label (i, u, b), the braiding b is changed to the +// opposite one, i.e., '+' is changed to '-' and vice versa. +void TreeRotator::majorana_braiding_change(TernaryTree* tt) { + if (!tt || tt->num_qubits() == 0) return; + + // Choose node + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution dist_v(0, tt->num_qubits() - 1); + size_t index = dist_v(gen); + + // Change braiding flag + TernaryNode* node = tt->get_node_by_index(index); + auto* qubit = static_cast(node); + qubit->is_braided = !qubit->is_braided; +} + +} // namespace \ No newline at end of file diff --git a/src/hamiltonian/tree_rotations.hpp b/src/hamiltonian/tree_rotations.hpp new file mode 100644 index 000000000..d1072c546 --- /dev/null +++ b/src/hamiltonian/tree_rotations.hpp @@ -0,0 +1,38 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Ternary tree rotations ] + Author [ April Wang (april864)] +*/ + +#pragma once + +#include "ternary_tree.hpp" +#include "device/device.hpp" +#include "fermionic_hamiltonian.hpp" + +namespace qsyn::hamiltonian { + +class TreeRotator { +public: + // For non-connectivity preserving (NCP), choose a random terminal node-v with + // three legs and attach it to the free leg of another node-w that is neither + // v nor its parent. + void ncp_leaf_move(TernaryTree* tt); + void cp_leaf_move(TernaryTree* tt, qsyn::device::Device const& device); + // A node v different from the root with out-degree at most 2 is chosen + // as a new root. The path from root to v is identified, and the tree is + // updated so that child and parent designations are swapped along the path. + void root_change(TernaryTree* tt); + // A node with an out-degree of at least 1 is chosen, and the Pauli operators + // associated with the links are changed. + void pauli_shuffle(TernaryTree* tt); + // For nodes with labels (i, u, b) and (i', u', b') the labels are changed to + // (i', u, b) and (i, u', b') respectively. + void mode_association_swap(TernaryTree* tt); + // For a node with label (i, u, b), the braiding b is changed to the + // opposite one, i.e., '+' is changed to '-' and vice versa. + void majorana_braiding_change(TernaryTree* tt); + +}; + +} // namespace \ No newline at end of file diff --git a/src/hamiltonian/treespile.cpp b/src/hamiltonian/treespile.cpp new file mode 100644 index 000000000..2ab2f24cd --- /dev/null +++ b/src/hamiltonian/treespile.cpp @@ -0,0 +1,513 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Treespilation mapping from fermionic Hamiltonian to mapped quantum circuits ] + Author [ Mu-Te (Joshua) Lau (joshmtlau) ] +*/ + +#include "hamiltonian/treespile.hpp" + +#include + +#include +#include +#include +#include +#include + +#include "device/device_analysis.hpp" +#include "hamiltonian/bonsai.hpp" +#include "hamiltonian/f2q_mappings.hpp" +#include "hamiltonian/ternary_tree.hpp" +#include "qcir/basic_gate_type.hpp" +#include "util/graph/minimum_spanning_arborescence.hpp" + +namespace qsyn::hamiltonian { + +namespace { + +TernaryQubitNode* as_qubit_node_or_throw(TernaryNode* node) { + auto const qubit_node = dynamic_cast(node); + if (!qubit_node) { + throw std::runtime_error("Should not happen: tree node is not a qubit node"); + } + return qubit_node; +} + +size_t find_unique_connecting_ancilla( + std::vector> const& connected_components, + std::vector const& physical_qubits, + TernaryTree const& tree) { + std::unordered_set physical_qubits_set( + physical_qubits.begin(), + physical_qubits.end()); + std::vector potential_ancilla_qubits; + + for (auto const& component : connected_components) { + for (auto const& qubit : component) { + auto const tree_node = as_qubit_node_or_throw(tree.get_node_by_qubit(qubit)); + auto const parent = tree_node->parent; + if (!parent) { + // root node; skip + continue; + } + auto const parent_node = as_qubit_node_or_throw(parent); + auto const parent_qubit = parent_node->qubit_label.value(); + if (!physical_qubits_set.contains(parent_qubit)) { + potential_ancilla_qubits.push_back(parent_qubit); + } + } + } + + if (potential_ancilla_qubits.empty()) { + throw std::runtime_error("Should not happen: no potential ancilla qubits found"); + } + + auto majority_ancilla_qubit = potential_ancilla_qubits[0]; + for (auto const& qubit : potential_ancilla_qubits) { + if (std::ranges::count(potential_ancilla_qubits, qubit) > potential_ancilla_qubits.size() / 2) { + majority_ancilla_qubit = qubit; + } + } + + return majority_ancilla_qubit; +} + +struct TermSynthesisInfo { + std::vector qubits; + std::vector is_ancilla; + + void add_ancilla(size_t qubit) { + qubits.push_back(qubit); + is_ancilla.push_back(true); + } +}; + +std::pair find_shortest_terminals_between_two_connected_components( + std::vector> const& connected_components, + device::APSPResult const& apsp) { + auto const& component0 = connected_components[0]; + auto const& component1 = connected_components[1]; + + float min_dist = std::numeric_limits::infinity(); + std::pair min_pair = {0, 0}; + for (auto const& qubit : component0) { + for (auto const& other_qubit : component1) { + auto const dist = apsp.distance[qubit][other_qubit]; + if (dist < min_dist) { + min_dist = dist; + min_pair = {qubit, other_qubit}; + } + } + } + + return min_pair; +} + +TermSynthesisInfo form_connected_components( + HermitianPauliTerm const& term, + TernaryTree const& tree, + device::APSPResult const& apsp, + device::Device const& device) { + // + auto const& pauli_product = term.pauli_product(); + std::vector physical_qubits; + + for (size_t i = 0; i < pauli_product.n_qubits(); i++) { + if (pauli_product.is_i(i)) { + continue; + } + auto const tree_node = as_qubit_node_or_throw(tree.get_node_by_index(i)); + physical_qubits.push_back(tree_node->qubit_label.value()); + } + + auto const connected_components = + get_connected_components(apsp, device, [&](size_t qubit) { + return dvlab::contains(physical_qubits, qubit); + }); + + spdlog::debug("Connected components for term {}:", term.to_string()); + for (auto const& component : connected_components) { + spdlog::debug("- Component: [{}]", fmt::join(component, ", ")); + } + + TermSynthesisInfo result{ + .qubits = physical_qubits, + .is_ancilla = std::vector(physical_qubits.size(), false), + }; + + // case 1: all qubits are in the same connected component + if (connected_components.size() == 1) { + return result; + } + + // case 2: qubits are in two connected components + // find the shortest path between the two connected components using the APSP result + // add them to the synthesis info as ancilla qubits + + if (connected_components.size() == 2) { + auto const [terminal0, terminal1] = find_shortest_terminals_between_two_connected_components(connected_components, apsp); + auto const path = device::get_shortest_path(apsp, terminal0, terminal1); + if (!path.has_value()) { + throw std::runtime_error("Should not happen: no path found between two connected components"); + } + + // the two terminals are a part of the physical qubits. The rest must be + // ancilla qubits because we are using the shortest path. + auto const n_ancilla = path.value().size() - 2; + result.qubits.reserve(result.qubits.size() + n_ancilla); + result.is_ancilla.reserve(result.is_ancilla.size() + n_ancilla); + for (auto const& qubit : path.value() | std::views::drop(1) | std::views::take(n_ancilla)) { + result.add_ancilla(qubit); + } + + return result; + } + + // case 3: qubits are in multiple connected components + // in this case, there must be a unique qubit that is not in physical_qubits + // such that adding it to physical_qubits will form a single connected component + // use the tree to check the parent of each tree nodes. + + auto const ancilla_qubit = + find_unique_connecting_ancilla(connected_components, physical_qubits, tree); + + result.add_ancilla(ancilla_qubit); + return result; +} + +dvlab::Digraph form_device_subgraph( + TermSynthesisInfo const& synthesis_info, + device::Device const& device, + device::APSPResult const& apsp) { + auto device_subgraph = dvlab::Digraph{}; + // add all physical qubits to the subgraph (use qubit IDs as vertex IDs so + // apsp.distance[src][dst] and ancilla lookups work correctly) + for (auto const& qubit : synthesis_info.qubits) { + device_subgraph.add_vertex_with_id(qubit); + } + for (auto const& qubit : synthesis_info.qubits) { + for (auto const& other_qubit : synthesis_info.qubits) { + if (qubit == other_qubit) continue; + if (device.is_adjacent(qubit, other_qubit)) { + device_subgraph.add_edge(qubit, other_qubit, apsp.distance[qubit][other_qubit]); + } + } + } + + return device_subgraph; +} + +void append_mst_node( + dvlab::Digraph const& mst, + size_t v, + std::unordered_set const* ancilla_qubits, + std::string const& prefix, + bool is_last, + std::string& out) { + auto const branch_char = is_last ? "└── " : "├── "; + out += prefix + branch_char; + + out += fmt::format("q{}", v); + if (ancilla_qubits && ancilla_qubits->contains(v)) { + out += " (ancilla)"; + } + out += "\n"; + + std::vector children_vec(mst.out_neighbors(v).begin(), + mst.out_neighbors(v).end()); + std::ranges::sort(children_vec); + + std::string child_prefix = prefix + (is_last ? " " : "│ "); + for (size_t i = 0; i < children_vec.size(); ++i) { + append_mst_node(mst, children_vec[i], ancilla_qubits, child_prefix, + i == children_vec.size() - 1, out); + } +} + +std::string mst_to_string( + dvlab::Digraph const& mst, + size_t root, + std::unordered_set const* ancilla_qubits = nullptr) { + std::string out; + out += fmt::format("q{}", root); + if (ancilla_qubits && ancilla_qubits->contains(root)) { + out += " (ancilla)"; + } + out += "\n"; + + std::vector children_vec(mst.out_neighbors(root).begin(), + mst.out_neighbors(root).end()); + std::ranges::sort(children_vec); + + for (size_t i = 0; i < children_vec.size(); ++i) { + append_mst_node(mst, children_vec[i], ancilla_qubits, "", + i == children_vec.size() - 1, out); + } + return out; +} + +void synthesize_term( + HermitianPauliTerm const& term, + TernaryTree const& tree, + device::APSPResult const& apsp, + device::Device const& device, + double dt, + qcir::QCir& qcir) { + auto const& pauli_product = term.pauli_product(); + std::vector physical_qubits; + for (size_t i = 0; i < pauli_product.n_qubits(); i++) { + if (pauli_product.is_i(i)) { + continue; + } + auto const tree_node = as_qubit_node_or_throw(tree.get_node_by_index(i)); + physical_qubits.push_back(tree_node->qubit_label.value()); + } + + if (pauli_product.is_identity()) { + return; + } + + auto const synthesis_info = form_connected_components(term, tree, apsp, device); + + auto const device_subgraph = form_device_subgraph(synthesis_info, device, apsp); + + // Build set of ancilla qubit IDs (is_ancilla is parallel to qubits, not indexed by qubit ID) + auto ancilla_qubits = std::unordered_set{}; + for (size_t i = 0; i < synthesis_info.qubits.size(); ++i) { + if (synthesis_info.is_ancilla[i]) { + ancilla_qubits.insert(synthesis_info.qubits[i]); + } + } + + auto const mst_cost_fn = [&](auto const& e) { + auto const [src, dst] = e; + + // a cnot (dst, src) is needed to connect the two qubits + // if src is an ancilla qubit, we also need to synthesize a cnot (src, dst) + if (ancilla_qubits.contains(src)) { + return apsp.distance[dst][src] + apsp.distance[src][dst]; + } + return apsp.distance[dst][src]; + }; + auto const [mst, root] = + dvlab::minimum_spanning_arborescence_with_cost(device_subgraph, mst_cost_fn); + + spdlog::debug("MST for term {}:\n{}", term.to_string(), mst_to_string(mst, root, &ancilla_qubits)); + + std::vector post_order_traversal; + std::stack stack; + + stack.push(root); + while (!stack.empty()) { + auto const v = stack.top(); + stack.pop(); + post_order_traversal.push_back(v); + for (auto const& n : mst.out_neighbors(v)) { + stack.push(n); + } + } + + std::ranges::reverse(post_order_traversal); + + qcir::QCir conjugation_qcir(device.get_num_qubits()); + + // conjugate by V and H gates to put all Pauli letters to Z + for (size_t i = 0; i < term.pauli_product().n_qubits(); ++i) { + if (term.pauli_product().is_i(i)) { + continue; + } + + auto const tree_node = as_qubit_node_or_throw(tree.get_node_by_index(i)); + auto const physical_qubit = tree_node->qubit_label.value(); + if (term.pauli_product().is_x(i)) { + conjugation_qcir.append(qcir::HGate(), {physical_qubit}); + } + if (term.pauli_product().is_y(i)) { + conjugation_qcir.append(qcir::SXGate(), {physical_qubit}); + } + } + + // build CX sequence according to the post-order traversal + for (auto const& dst : post_order_traversal) { + if (mst.in_degree(dst) == 0) { + continue; + } + auto const src = *mst.in_neighbors(dst).begin(); + conjugation_qcir.append(qcir::CXGate(), {dst, src}); + if (ancilla_qubits.contains(dst)) { + conjugation_qcir.append(qcir::CXGate(), {src, dst}); + } + } + qcir.compose(conjugation_qcir); + + // synthesize a phase gate at the root. + // for now, assumes there's only one trotterization step + + qcir.append(qcir::PZGate(-term.coeff() * dt), {root}); + conjugation_qcir.adjoint_inplace(); + qcir.compose(conjugation_qcir); +} + +} // namespace + +double pauli_weight_cost(const TernaryTree& tt, const FermionHamiltonian& f_ham) { + TernaryTreeMapping mapping(tt); + QubitHamiltonian q_ham = qubitize(f_ham, mapping); + + double total_weight = 0; + for (const auto& term : q_ham) { + for (size_t i = 0; i < term.n_qubits(); ++i) { + if (!term.is_i(i)) { + total_weight += 1.0; + } + } + } + return total_weight; +} + +/** + * @brief Optimizes a fermion-to-qubit mapping to minimize Pauli weight. + * @param initial_tree Initital mapping. + * @param f_ham Fermionic Hamiltonian to be mapped. + * @param device (Optional) Hardware device. + * @return Optimized TernaryTree mapping. + */ +TernaryTree optimize_mapping( + TernaryTree initial_tree, + const FermionHamiltonian& f_ham, + const qsyn::device::Device* device) { + + TernaryTree current_tree = initial_tree; + TernaryTree best_tree = initial_tree; + + double current_cost = pauli_weight_cost(current_tree, f_ham); + double best_cost = current_cost; + + // Simulated annealing parameters + double temperature = 20.0; + double cooling_rate = 0.99995; + double min_temperature = 0.3; + + // Used to randomly choose tree rotation + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_real_distribution<> prob_dist(0.0, 1.0); + std::uniform_int_distribution<> choose_rotation(0, 4); + + TreeRotator rotator; + int iterations = 0; + + while (temperature > min_temperature) { + TernaryTree test_tree = current_tree; + + int rotation = choose_rotation(gen); + switch (rotation) { + case 0: + if (device) rotator.cp_leaf_move(&test_tree, *device); + else rotator.ncp_leaf_move(&test_tree); + break; + case 1: + rotator.root_change(&test_tree); + break; + case 2: + rotator.pauli_shuffle(&test_tree); + break; + case 3: + rotator.mode_association_swap(&test_tree); + break; + case 4: + rotator.majorana_braiding_change(&test_tree); + break; + } + + // Calculate new Pauli weight, accept if lower or by probabiltiy + double new_cost = pauli_weight_cost(test_tree, f_ham); + if (new_cost < current_cost || + std::exp((current_cost - new_cost) / temperature) > prob_dist(gen)) { + + current_tree = test_tree; + current_cost = new_cost; + + if (current_cost < best_cost) { + best_tree = current_tree; + best_cost = current_cost; + } + } + + temperature *= cooling_rate; + iterations++; + } + + fmt::println("Final Optimized Pauli Weight: {} \n", best_cost); + + return best_tree; +} + +tl::expected +treespile( + FermionHamiltonian const& hamiltonian, + device::Device const& device, + double time, + size_t n_trotterization_steps, + device::APSPCostFnType const& cost_fn, + bool optimize) { + // + using FailReason = TreespileFailReason; + + if (n_trotterization_steps == 0) { + return tl::unexpected(FailReason::invalid_n_trotterization_steps); + } + + auto const n_modes = hamiltonian.n_modes(); + if (n_modes == 0) { + return tl::unexpected(FailReason::empty_hamiltonian); + } + + if (n_modes > device.get_num_qubits()) { + return tl::unexpected(FailReason::device_too_small); + } + + // generate a ternary tree + + auto const apsp = floyd_warshall(device, cost_fn); + + auto tree = build_bonsai_ternary_tree(device, apsp, n_modes); + + if (!tree.has_value()) { + // NOTE: it's still possible for bonsai to fail because the device might + // be disconnected. + return tl::unexpected(FailReason::tt_build_failed_not_enough_qubits); + } + + if (optimize) { + tree = optimize_mapping(*tree, hamiltonian, &device); + } + + auto const mapping = TernaryTreeMapping(tree.value()); + + auto const qubit_hamiltonian = qubitize(hamiltonian, mapping); + + // if all terms are commutative, fix trotter steps to 1 + if (is_all_commutative(qubit_hamiltonian)) { + n_trotterization_steps = 1; + } + + qcir::QCir qcir(device.get_num_qubits()); + + auto const dt = time / static_cast(n_trotterization_steps); + + for (auto const& term : qubit_hamiltonian) { + synthesize_term(term, tree.value(), apsp, device, dt, qcir); + } + + if (n_trotterization_steps > 1) { + auto copy_qcir = qcir; + for (size_t i = 1; i < n_trotterization_steps; ++i) { + qcir.compose(copy_qcir); + } + } + + return qcir; +} + +} // namespace qsyn::hamiltonian diff --git a/src/hamiltonian/treespile.hpp b/src/hamiltonian/treespile.hpp new file mode 100644 index 000000000..cf5b6bdcb --- /dev/null +++ b/src/hamiltonian/treespile.hpp @@ -0,0 +1,44 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Implement the Treespilation mapping from fermionic Hamiltonian directly to mapped quantum circuits ] + Author [ Mu-Te (Joshua) Lau (joshmtlau) ] +*/ + +#pragma once + +#include + +#include "device/device.hpp" +#include "device/device_analysis.hpp" +#include "hamiltonian/fermionic_hamiltonian.hpp" +#include "qcir/qcir.hpp" +#include "hamiltonian/tree_rotations.hpp" +#include "ternary_tree.hpp" + +namespace qsyn::hamiltonian { + +enum class TreespileFailReason : uint8_t { + empty_hamiltonian, + device_too_small, + invalid_n_trotterization_steps, + tt_build_failed_not_enough_qubits, +}; + +double pauli_weight_cost(const TernaryTree& tt, const FermionHamiltonian& f_ham); + +TernaryTree optimize_mapping( + TernaryTree initial_tree, + const FermionHamiltonian& f_ham, + const qsyn::device::Device* device = nullptr); + +tl::expected +treespile( + FermionHamiltonian const& hamiltonian, + device::Device const& device, + double time, + size_t n_trotterization_steps, + device::APSPCostFnType const& cost_fn = device::default_floyd_warshall_cost, + bool optimize = false); + + +} // namespace qsyn::hamiltonian diff --git a/src/hamiltonian/trotterize.cpp b/src/hamiltonian/trotterize.cpp new file mode 100644 index 000000000..b14d9a9b7 --- /dev/null +++ b/src/hamiltonian/trotterize.cpp @@ -0,0 +1,93 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Define Trotterization functions ] + Author [ Mu-Te Lau (joshmtlau) ] + */ + +#include "trotterize.hpp" + +#include "tableau/pauli_rotation.hpp" + +namespace qsyn::hamiltonian { + +namespace { + +/** + * trotterize a single step of a Hamiltonian composed of only commutative terms. + * Basically, for each term $H_i$ in a Hamiltonian $H$, this function appends + * Pauli rotations $U_i = \exp(-i H_i \Delta t / 2)$ to the given tableau. + * + * @param tableau The tableau to append the Trotterization to. + * @param hamiltonian The Hamiltonian to trotterize. + * @param dt The time step. + */ +void append_trotterize_step( + qsyn::tableau::PauliRotationTableau& prtabl, + QubitHamiltonian const& hamilt, + double dt) noexcept { + using qsyn::tableau::PauliRotation; + // TODO: Implement the Trotterization for a single step. + + for (auto const& term : hamilt) { + if (term.coeff() == 0.0) { + continue; + } + if (term.pauli_product().is_identity()) { + continue; + } + prtabl.push_back( + PauliRotation(term.pauli_product(), + dvlab::Phase(-term.coeff() * dt))); + } +} + +} // namespace + +/** + * Trotterize a Hamiltonian for a given time and number of steps. + * If the Hamiltonian is commutative, the resulting PauliRotationTableau is + * exact. Otherwise, it implements the Hamiltonian up to an error of + * order $O(t^2/\mathrm{n\_steps})$. + * + * @param hamiltonian The Hamiltonian to trotterize. + * @param time The time to trotterize for. + * @param n_steps The number of steps to trotterize for. setting this to 0 + * will return an empty PauliRotationTableau. + * @return The Trotterized PauliRotationTableau. + */ +qsyn::tableau::PauliRotationTableau trotterize( + QubitHamiltonian const& hamiltonian, double time, size_t n_steps) noexcept { + using dvlab::iterator::next; + using qsyn::tableau::PauliRotationTableau; + + auto prtabl = PauliRotationTableau{}; + if (hamiltonian.n_terms() == 0 || time == 0.0 || n_steps == 0) { + return prtabl; + } + + auto all_commutative = is_all_commutative(hamiltonian); + auto n_terms = hamiltonian.n_terms(); + + if (all_commutative) { + prtabl.reserve(n_terms); + } else { + prtabl.reserve(n_terms * n_steps); + } + + auto dt = all_commutative ? time : (time / static_cast(n_steps)); + + append_trotterize_step(prtabl, hamiltonian, dt); + + // if the Hamiltonian is not commutative, repeat (n_steps - 1) time more + // since all steps are the same, we can just copy the existing terms + if (!all_commutative) { + for (size_t i = 1; i < n_steps; ++i) { + prtabl.insert(prtabl.end(), + prtabl.begin(), next(prtabl.begin(), n_terms)); + } + } + + return prtabl; +} + +} // namespace qsyn::hamiltonian diff --git a/src/hamiltonian/trotterize.hpp b/src/hamiltonian/trotterize.hpp new file mode 100644 index 000000000..634a97150 --- /dev/null +++ b/src/hamiltonian/trotterize.hpp @@ -0,0 +1,17 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Define Trotterization functions ] + Author [ Mu-Te Lau (joshmtlau) ] +*/ + +#pragma once + +#include "./qubit_hamiltonian.hpp" +#include "tableau/pauli_rotation.hpp" + +namespace qsyn::hamiltonian { + +qsyn::tableau::PauliRotationTableau trotterize( + QubitHamiltonian const& hamiltonian, double time, size_t n_steps) noexcept; + +} // namespace qsyn::hamiltonian diff --git a/src/hamiltonian/tt_mappings.cpp b/src/hamiltonian/tt_mappings.cpp new file mode 100644 index 000000000..9f57c3804 --- /dev/null +++ b/src/hamiltonian/tt_mappings.cpp @@ -0,0 +1,117 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Ternary tree mappings ] + Author [ April Wang (april864) ] +*/ + +#include "tt_mappings.hpp" + +#include +#include +#include + +#include "qubit_hamiltonian.hpp" +#include "ternary_tree.hpp" + +namespace qsyn::hamiltonian { + +using Pauli = qsyn::tableau::Pauli; + +std::unordered_map const simple_branch_assignment = { + {BranchType::left, Pauli::x}, + {BranchType::mid, Pauli::y}, + {BranchType::right, Pauli::z}}; + +/** + * @brief Basic method of assigning qubits to nodes. + * Assigns qubit i to node i. + */ +void TTMapper::_basic_assign_qubits() { + for (size_t i = 0; i < _tree.num_qubits(); i++) { + _tree.assign_qubit(i, i); + } +} + +/** + * @brief Basic method of getting fermionic operators from Bonsai paper. + */ +void TTMapper::_basic_load_pauli_strs() { + for (TernaryLeg* leg : _tree.get_legs()) { + std::vector pauli_str(_tree.num_qubits(), Pauli::i); + + TernaryNode* curr = leg; + while (curr->incoming_edge) { + TernaryEdge* edge = curr->incoming_edge; + TernaryNode* parent = edge->source; + + auto const parent_qubit_node = dynamic_cast(parent); + assert(parent_qubit_node); + + auto const parent_id = parent_qubit_node->id; + + assert(parent_id < _tree.num_qubits()); + + pauli_str[parent_id] = simple_branch_assignment.at(edge->branch); + + curr = parent; + } + + _pauli_strs.emplace(leg, std::move(pauli_str)); + } +} + +void TTMapper::_pair_legs() { + for (size_t i = 0; i < _tree.num_qubits(); i++) { + TernaryNode* curr = _tree.get_node_by_index(i); + + TernaryNode* left_path = curr->get_left()->target.get(); + while (!left_path->is_leg()) { + left_path = left_path->get_right()->target.get(); + } + + TernaryNode* right_path = curr->get_mid()->target.get(); + while (!right_path->is_leg()) { + right_path = right_path->get_right()->target.get(); + } + + assert(left_path && left_path->is_leg()); + assert(right_path && right_path->is_leg()); + + auto left_leg = dynamic_cast(left_path); + auto right_leg = dynamic_cast(right_path); + DVLAB_ASSERT(left_leg, "left_path is not a leg"); + DVLAB_ASSERT(right_path, "right_path is not a leg"); + _leg_pairs.emplace(i, std::pair{left_leg, right_leg}); + } +} + +void TTMapper::_load_ferm_ops() { + for (size_t i = 0; i < _tree.num_qubits(); ++i) { + auto left_str = _pauli_strs.at(_leg_pairs.at(i).first); + auto right_str = _pauli_strs.at(_leg_pairs.at(i).second); + + auto* qubit_node = dynamic_cast(_tree.get_node_by_index(i)); + assert(qubit_node); + + FermionOps ops; + if (!qubit_node->is_braided) { + // a_j^ = 0.5 Sx - 0.5i Sy + ops.creation = {ComplexPauliTerm(left_str, std::complex(0.5, 0)), + ComplexPauliTerm(right_str, std::complex(0, -0.5))}; + // a_j = 0.5 Sx + 0.5i Sy + ops.annihilation = {ComplexPauliTerm(left_str, std::complex(0.5, 0)), + ComplexPauliTerm(right_str, std::complex(0, 0.5))}; + } else { + // a_j^ = 0.5 Sy + 0.5i Sx + ops.creation = {ComplexPauliTerm(left_str, std::complex(0, 0.5)), + ComplexPauliTerm(right_str, std::complex(0.5, 0))}; + // a_j = 0.5 Sy - 0.5i Sx + ops.annihilation = {ComplexPauliTerm(left_str, std::complex(0, -0.5)), + ComplexPauliTerm(right_str, std::complex(0.5, 0))}; + } + + _mode_to_ferm_ops.emplace(i, std::move(ops)); + } +} + +} // namespace qsyn::hamiltonian diff --git a/src/hamiltonian/tt_mappings.hpp b/src/hamiltonian/tt_mappings.hpp new file mode 100644 index 000000000..f55a3ba4b --- /dev/null +++ b/src/hamiltonian/tt_mappings.hpp @@ -0,0 +1,61 @@ +/* + PackageName [ hamiltonian ] + Synopsis [ Ternary tree mappings ] + Author [ April Wang (april864) ] +*/ + +#pragma once + +#include +#include + +#include "qubit_hamiltonian.hpp" +#include "ternary_tree.hpp" + +namespace qsyn::hamiltonian { + +using Pauli = qsyn::tableau::Pauli; + +struct FermionOps { + std::vector creation; + std::vector annihilation; +}; + +/** + * @brief Mapper for Ternary Tree fermionic operators to qubit operators. + * @param num_qubits The number of qubits in the Ternary Tree. + */ +class TTMapper { +public: + TTMapper(size_t num_qubits) + : _tree(TernaryTree(num_qubits)) { + _basic_assign_qubits(); + _basic_load_pauli_strs(); + _pair_legs(); + _load_ferm_ops(); + } + + TTMapper(TernaryTree tree) + : _tree(std::move(tree)) { + _basic_load_pauli_strs(); + _pair_legs(); + _load_ferm_ops(); + } + + std::vector get_pauli_str(size_t mode, bool is_creation) const { + return is_creation ? _mode_to_ferm_ops.at(mode).creation : _mode_to_ferm_ops.at(mode).annihilation; + } + +private: + TernaryTree _tree; + std::unordered_map> _pauli_strs; + std::unordered_map> _leg_pairs; + std::unordered_map _mode_to_ferm_ops; + + void _basic_assign_qubits(); + void _basic_load_pauli_strs(); + void _pair_legs(); + void _load_ferm_ops(); +}; + +} // namespace qsyn::hamiltonian diff --git a/src/qcir/basic_gate_type.hpp b/src/qcir/basic_gate_type.hpp index 81285bb91..95c514a80 100644 --- a/src/qcir/basic_gate_type.hpp +++ b/src/qcir/basic_gate_type.hpp @@ -299,7 +299,6 @@ inline std::optional to_basic_gates(ControlGate const& op) { qcir.append(SXGate(), {2}); } // optimal decomposition of CCZ - qcir.append(TGate(), {2}); // R_IIZ(pi/4) qcir.append(CXGate(), {1, 2}); // qubit 2: IIZ -> IZZ qcir.append(TdgGate(), {2}); // R_IZZ(-pi/4) qcir.append(CXGate(), {0, 2}); // qubit 2: IZZ -> ZZZ @@ -307,6 +306,8 @@ inline std::optional to_basic_gates(ControlGate const& op) { qcir.append(CXGate(), {1, 2}); // qubit 2: ZZZ -> ZIZ qcir.append(TdgGate(), {2}); // R_ZIZ(-pi/4) qcir.append(TGate(), {1}); // R_IZI(pi/4) + qcir.append(CXGate(), {0, 2}); // qubit 2: IZZ -> ZZZ + qcir.append(TGate(), {2}); // R_IIZ(pi/4) qcir.append(CXGate(), {0, 1}); // qubit 1: IZI -> ZZI qcir.append(TGate(), {0}); // R_ZII(pi/4) qcir.append(TdgGate(), {1}); // R_ZZI(-pi/4) diff --git a/src/qcir/operation.hpp b/src/qcir/operation.hpp index 7ab18a1e9..45010d44f 100644 --- a/src/qcir/operation.hpp +++ b/src/qcir/operation.hpp @@ -29,7 +29,7 @@ template std::optional> to_tensor(T const& /* op */); template bool append_to_tableau(T const& /* op */, - experimental::Tableau& /* tableau */, + tableau::Tableau& /* tableau */, QubitIdList const& /* qubits */); } // namespace qsyn @@ -97,7 +97,7 @@ class Operation { // NOLINT(hicpp-special-member-functions, return op._pimpl->do_to_tensor(); } friend bool append_to_tableau(Operation const& op, - experimental::Tableau& tableau, + tableau::Tableau& tableau, QubitIdList const& qubits) { return op._pimpl->do_append_to_tableau(tableau, qubits); } @@ -148,7 +148,7 @@ class Operation { // NOLINT(hicpp-special-member-functions, virtual std::optional do_to_zxgraph() const = 0; virtual std::optional> do_to_tensor() const = 0; - virtual bool do_append_to_tableau(experimental::Tableau& tableau, + virtual bool do_append_to_tableau(tableau::Tableau& tableau, QubitIdList const& qubits) const = 0; virtual std::optional do_to_basic_gates() const = 0; }; @@ -173,7 +173,7 @@ class Operation { // NOLINT(hicpp-special-member-functions, std::optional> do_to_tensor() const override { return qsyn::to_tensor(value); } - bool do_append_to_tableau(experimental::Tableau& tableau, + bool do_append_to_tableau(tableau::Tableau& tableau, QubitIdList const& qubits) const override { return qsyn::append_to_tableau(value, tableau, qubits); } diff --git a/src/qcir/optimizer/basic_optimization.cpp b/src/qcir/optimizer/basic_optimization.cpp index dd4edd391..b6f589c31 100644 --- a/src/qcir/optimizer/basic_optimization.cpp +++ b/src/qcir/optimizer/basic_optimization.cpp @@ -111,8 +111,6 @@ QCir Optimizer::_parse_once(QCir const& qcir, bool reversed, bool do_minimize_cz } QCir result = _build_from_storage(qcir.get_num_qubits(), reversed); - result.set_filename(qcir.get_filename()); - result.add_procedures(qcir.get_procedures()); for (size_t t = 0; t < _xs.size(); ++t) { if (!_xs[t]) continue; diff --git a/src/qcir/optimizer/phase_teleport.cpp b/src/qcir/optimizer/phase_teleport.cpp index 26a8a75de..2690e7086 100644 --- a/src/qcir/optimizer/phase_teleport.cpp +++ b/src/qcir/optimizer/phase_teleport.cpp @@ -86,9 +86,9 @@ bool is_single_qubit_rotation(Operation const& op) { return (op.is() || op.is() || op.is() || op.is() || op.is() || op.is()); } -std::optional>> +std::optional>> to_tableau_with_gate_ids(QCir const& qcir) { - experimental::Tableau tabl{qcir.get_num_qubits()}; + tableau::Tableau tabl{qcir.get_num_qubits()}; std::vector gate_ids; for (auto const& gate : qcir.get_gates()) { @@ -114,7 +114,7 @@ to_tableau_with_gate_ids(QCir const& qcir) { } } - return std::make_pair(std::get(tabl.back()), gate_ids); + return std::make_pair(std::get(tabl.back()), gate_ids); } /** @@ -124,7 +124,7 @@ to_tableau_with_gate_ids(QCir const& qcir) { * @param gate_ids */ void remove_identities_teleport( - experimental::PauliRotationTableau& rotations, + tableau::PauliRotationTableau& rotations, std::vector& gate_ids) { for (size_t i = 0; i < rotations.size(); ++i) { if (rotations[i].phase() == dvlab::Phase(0)) { @@ -152,7 +152,7 @@ void remove_identities_teleport( */ sul::dynamic_bitset<> get_negated_phases( QCir const& qcir, - experimental::PauliRotationTableau const& rotations, + tableau::PauliRotationTableau const& rotations, std::vector const& gate_ids) { sul::dynamic_bitset<> negated(rotations.size(), false); @@ -172,7 +172,7 @@ sul::dynamic_bitset<> get_negated_phases( */ void merge_rotations_teleport( QCir& qcir, - experimental::PauliRotationTableau& rotations, + tableau::PauliRotationTableau& rotations, std::vector& gate_ids) { auto const negated = get_negated_phases(qcir, rotations, gate_ids); @@ -181,7 +181,7 @@ void merge_rotations_teleport( continue; } for (size_t j = i + 1; j < rotations.size(); ++j) { - if (!experimental::is_commutative(rotations[i], rotations[j])) { + if (!tableau::is_commutative(rotations[i], rotations[j])) { break; } if (rotations[i].pauli_product() == rotations[j].pauli_product()) { @@ -223,10 +223,10 @@ void merge_rotations_teleport( * @brief Conjugation view specifically for phase teleport optimization, and not for general use. * */ -class ConjugationView : public experimental::PauliProductTrait { +class ConjugationView : public tableau::PauliProductTrait { public: ConjugationView( - experimental::PauliRotationTableau& rotations, + tableau::PauliRotationTableau& rotations, size_t upto) : _rotations{rotations}, _upto{upto} {} ConjugationView& h(size_t qubit) noexcept override { @@ -251,7 +251,7 @@ class ConjugationView : public experimental::PauliProductTrait } private: - std::reference_wrapper _rotations; + std::reference_wrapper _rotations; size_t _upto; }; @@ -262,7 +262,7 @@ class ConjugationView : public experimental::PauliProductTrait * @param gate_ids */ void remove_clifford_rotations_teleport( - experimental::PauliRotationTableau& rotations, + tableau::PauliRotationTableau& rotations, std::vector& gate_ids) { for (size_t i = 0; i < rotations.size(); ++i) { if (rotations[i].phase().denominator() >= 2 || rotations[i].phase() == dvlab::Phase(0)) { @@ -271,7 +271,7 @@ void remove_clifford_rotations_teleport( auto conjugation_view = ConjugationView{rotations, i}; - auto [ops, qubit] = experimental::extract_clifford_operators(rotations[i]); + auto [ops, qubit] = tableau::extract_clifford_operators(rotations[i]); conjugation_view.apply(ops); diff --git a/src/qcir/optimizer/trivial_optimization.cpp b/src/qcir/optimizer/trivial_optimization.cpp index 8edb9efcf..946b1c264 100644 --- a/src/qcir/optimizer/trivial_optimization.cpp +++ b/src/qcir/optimizer/trivial_optimization.cpp @@ -32,8 +32,6 @@ std::optional Optimizer::trivial_optimization(QCir const& qcir) { reset(qcir); QCir result{qcir.get_num_qubits()}; - result.set_filename(qcir.get_filename()); - result.add_procedures(qcir.get_procedures()); result.set_gate_set(qcir.get_gate_set()); for (auto gate : qcir.get_gates()) { @@ -164,7 +162,6 @@ size_t match_gate_sequence(std::vector const& type_seq, QCir replace_single_qubit_gate_sequence(QCir& qcir, QubitIdType qubit, size_t gate_num, size_t seq_len, std::vector const& seq) { QCir replaced; - replaced.add_procedures(qcir.get_procedures()); replaced.add_qubits(qcir.get_num_qubits()); replaced.set_gate_set(qcir.get_gate_set()); diff --git a/src/qcir/qcir.cpp b/src/qcir/qcir.cpp index 799943263..28a316f25 100644 --- a/src/qcir/qcir.cpp +++ b/src/qcir/qcir.cpp @@ -71,9 +71,6 @@ QCir::QCir(QCir const& other) { other.get_gates() | views::transform( [](QCirGate* g) { return g->get_id(); })); - - this->set_filename(other._filename); - this->add_procedures(other._procedures); } /** * @brief Get Gate. @@ -551,13 +548,13 @@ QCir::get_last_gate(QubitIdType qubit) const { } bool is_clifford(qcir::QCir const& qcir) { - auto tabl = experimental::to_tableau(qcir); + auto tabl = tableau::to_tableau(qcir); if (!tabl.has_value()) { return false; } - experimental::collapse(*tabl); + tableau::collapse(*tabl); - return (tabl->size() == 1) && std::holds_alternative(tabl->front()); + return (tabl->size() == 1) && std::holds_alternative(tabl->front()); } Operation adjoint(qcir::QCir const& qcir) { diff --git a/src/qcir/qcir.hpp b/src/qcir/qcir.hpp index 9673e0a49..8967d9eb5 100644 --- a/src/qcir/qcir.hpp +++ b/src/qcir/qcir.hpp @@ -79,9 +79,7 @@ class QCir { // NOLINT(hicpp-special-member-functions, void swap(QCir& other) noexcept { std::swap(_gate_id, other._gate_id); std::swap(_dirty, other._dirty); - std::swap(_filename, other._filename); std::swap(_gate_set, other._gate_set); - std::swap(_procedures, other._procedures); std::swap(_qubits, other._qubits); std::swap(_gate_list, other._gate_list); std::swap(_id_to_gates, other._id_to_gates); @@ -109,17 +107,10 @@ class QCir { // NOLINT(hicpp-special-member-functions, } QCirGate* get_gate(std::optional gid) const; - std::string get_filename() const { return _filename; } - std::vector const& get_procedures() const { return _procedures; } std::string get_gate_set() const { return _gate_set; } bool is_empty() const { return _qubits.empty() || _id_to_gates.empty(); } - void set_filename(std::string f) { _filename = std::move(f); } - void add_procedures(std::vector const& ps) { - _procedures.insert(_procedures.end(), ps.begin(), ps.end()); - } - void add_procedure(std::string const& p) { _procedures.emplace_back(p); } void set_gate_set(std::string g) { _gate_set = std::move(g); } void reset(); @@ -180,13 +171,11 @@ class QCir { // NOLINT(hicpp-special-member-functions, // additional APIs to make qcir::QCir an qcir::Operation std::string get_type() const { return "qcir"; } - std::string get_repr() const { return _filename; } + std::string get_repr() const { return "qcir"; } private: size_t _gate_id = 0; - std::string _filename; std::string _gate_set; - std::vector _procedures; std::vector _qubits; dvlab::utils::ordered_hashmap> _id_to_gates; std::unordered_map>> _predecessors; diff --git a/src/qcir/qcir_equiv.cpp b/src/qcir/qcir_equiv.cpp index 8763cbb07..2ef74b38e 100644 --- a/src/qcir/qcir_equiv.cpp +++ b/src/qcir/qcir_equiv.cpp @@ -28,12 +28,12 @@ bool is_equivalent(QCir const& qcir1, QCir const& qcir2) { adjoint_composed.adjoint_inplace(); adjoint_composed.compose(qcir2); - auto tableau = qsyn::experimental::to_tableau(adjoint_composed); + auto tableau = qsyn::tableau::to_tableau(adjoint_composed); if (!tableau) { spdlog::error("Failed to convert adjoint composed QCir to tableau."); return false; } - qsyn::experimental::full_optimize(*tableau); + qsyn::tableau::full_optimize(*tableau); if (tableau->is_empty()) { return true; @@ -48,7 +48,7 @@ bool is_equivalent(QCir const& qcir1, QCir const& qcir2) { spdlog::info("Cannot prove equivalence via tableau optimization."); spdlog::info("Trying to verify equivalence via tensor contraction..."); - auto const optimized_qcir = qsyn::experimental::to_qcir(*tableau, experimental::HOptSynthesisStrategy{}, experimental::NaivePauliRotationsSynthesisStrategy{}); + auto const optimized_qcir = qsyn::tableau::to_qcir(*tableau, tableau::HOptSynthesisStrategy{}, tableau::NaivePauliRotationsSynthesisStrategy{}); if (!optimized_qcir) { spdlog::error("Failed to convert optimized tableau to QCir."); diff --git a/src/qcir/qcir_reader.cpp b/src/qcir/qcir_reader.cpp index 5d1dc296a..b97427153 100644 --- a/src/qcir/qcir_reader.cpp +++ b/src/qcir/qcir_reader.cpp @@ -54,31 +54,48 @@ std::optional from_qasm(std::filesystem::path const& filepath) { return std::nullopt; } std::string str; - for (int i = 0; i < 6; i++) { - // OPENQASM 2.0; - // include "qelib1.inc"; - // qreg q[int]; - qasm_file >> str; - } - - auto const nqubit = stoul(str.substr(str.find('[') + 1, str.size() - str.find('[') - 3)); - QCir qcir{nqubit}; + QCir qcir; - getline(qasm_file, str); - while (getline(qasm_file, str)) { + while (std::getline(qasm_file, str)) { str = dvlab::str::trim_spaces(dvlab::str::trim_comments(str)); if (str.empty()) continue; + if (str == "OPENQASM 2.0;") continue; + if (str == "include \"qelib1.inc\";") continue; + if (str.starts_with("qreg")) { + if (qcir.get_num_qubits() != 0) { + spdlog::error("Qsyn does not support multiple qreg definition at the moment."); + return std::nullopt; + } + auto const nqubit = stoul(str.substr(str.find('[') + 1, str.size() - str.find('[') - 3)); + qcir.add_qubits(nqubit); + continue; + } + if (str.starts_with("gate")) { + // if qsyn recognizes the gate, ignore gate definition + // example: gate ccz q0,q1,q2 { h q2; ccx q0,q1,q2; h q2; } + auto const gate_name_start = str.find(' ') + 1; + auto const gate_name_end = str.find(' ', gate_name_start); + auto const gate_name = str.substr(gate_name_start, gate_name_end - gate_name_start); + if (str_to_operation(gate_name).has_value()) { + continue; + } + // else, we cannot support this gate. + spdlog::error("Qsyn does not support gate \"{}\"!!", gate_name); + return std::nullopt; + } + if (str.starts_with("creg")) { + // implicitly ignore creg definition + continue; + } std::string type; auto const type_end = str_get_token(str, type); std::string phase_str = "0"; if (str_get_token(str, phase_str, 0, '(') != std::string::npos) { auto const stop = str_get_token(str, type, 0, '('); str_get_token(str, phase_str, stop + 1, ')'); - } else + } else { phase_str = "0"; - if (type == "creg" || type == "qreg" || type.empty()) { - continue; } QubitIdList qubit_ids; std::string token; @@ -87,7 +104,7 @@ std::optional from_qasm(std::filesystem::path const& filepath) { while (!token.empty()) { str_get_token(token, qubit_id_str, str_get_token(token, qubit_id_str, 0, '[') + 1, ']'); auto qubit_id_num = dvlab::str::from_string(qubit_id_str); - if (!qubit_id_num.has_value() || qubit_id_num >= nqubit) { + if (!qubit_id_num.has_value() || qubit_id_num >= qcir.get_num_qubits()) { spdlog::error("invalid qubit id on line {}!!", str); return std::nullopt; } diff --git a/src/qcir/qcir_writer.cpp b/src/qcir/qcir_writer.cpp index 98bc9de08..8696e239f 100644 --- a/src/qcir/qcir_writer.cpp +++ b/src/qcir/qcir_writer.cpp @@ -86,14 +86,21 @@ bool QCir::draw(QCirDrawerType drawer, std::filesystem::path const& output_path, auto const path_to_script = "scripts/qccdraw_qiskit_interface.py"; - auto cmd = fmt::format("python3 {} -input {} -drawer {} -scale {}", path_to_script, tmp_qasm.string(), drawer, scale); - // auto cmd = fmt::format("python3 {} -input {} -drawer {} -scale {}", path_to_script, tmp_qasm.string(), drawer, scale); + auto args = std::vector{ + "-input", + tmp_qasm.string(), + "-drawer", + fmt::format("{}", drawer), + "-scale", + std::to_string(scale), + }; if (!output_path.string().empty()) { - cmd += " -output " + output_path.string(); + args.push_back("-output"); + args.push_back(output_path.string()); } - return system(cmd.c_str()) == 0; + return dvlab::utils::uv_run_script(path_to_script, args) == 0; } std::string to_qasm(QCir const& qcir) { diff --git a/src/qsyn/qsyn_helper.cpp b/src/qsyn/qsyn_helper.cpp index c84fecf88..a94d03c65 100644 --- a/src/qsyn/qsyn_helper.cpp +++ b/src/qsyn/qsyn_helper.cpp @@ -20,6 +20,8 @@ #include "cmd/device_cmd.hpp" #include "cmd/duostra_cmd.hpp" #include "cmd/extractor_cmd.hpp" +#include "cmd/qbham_cmd.hpp" +#include "cmd/fham_cmd.hpp" #include "cmd/qcir_cmd.hpp" #include "cmd/tableau_cmd.hpp" #include "cmd/tensor_cmd.hpp" @@ -124,7 +126,9 @@ bool read_qsynrc_file(dvlab::CommandLineInterface& cli, std::filesystem::path qs bool initialize_qsyn( dvlab::CommandLineInterface& cli, qsyn::device::DeviceMgr& device_mgr, qsyn::qcir::QCirMgr& qcir_mgr, - qsyn::tensor::TensorMgr& tensor_mgr, qsyn::zx::ZXGraphMgr& zxgraph_mgr, qsyn::experimental::TableauMgr& tableau_mgr) { + qsyn::tensor::TensorMgr& tensor_mgr, qsyn::zx::ZXGraphMgr& zxgraph_mgr, qsyn::tableau::TableauMgr& tableau_mgr, + qsyn::hamiltonian::QubitHamiltonianMgr& qbham_mgr, + qsyn::hamiltonian::FermionHamiltonianMgr& fham_mgr) { spdlog::set_pattern("%L%v"); spdlog::set_level(spdlog::level::warn); @@ -132,12 +136,14 @@ bool initialize_qsyn( qsyn::add_qsyn_cmds(cli) && qsyn::device::add_device_cmds(cli, device_mgr) && qsyn::duostra::add_duostra_cmds(cli, qcir_mgr, device_mgr) && - qsyn::add_conversion_cmds(cli, qcir_mgr, tensor_mgr, zxgraph_mgr, tableau_mgr) && + qsyn::add_conversion_cmds(cli, qcir_mgr, tensor_mgr, zxgraph_mgr, tableau_mgr, qbham_mgr) && qsyn::extractor::add_extract_cmds(cli, zxgraph_mgr, qcir_mgr) && qsyn::qcir::add_qcir_cmds(cli, qcir_mgr) && qsyn::tensor::add_tensor_cmds(cli, tensor_mgr) && qsyn::zx::add_zx_cmds(cli, zxgraph_mgr) && - qsyn::experimental::add_tableau_command(cli, tableau_mgr); + qsyn::tableau::add_tableau_command(cli, tableau_mgr) && + qsyn::hamiltonian::add_qbham_cmds(cli, device_mgr, qbham_mgr, tableau_mgr) && + qsyn::hamiltonian::add_fham_cmds(cli, fham_mgr, qbham_mgr, qcir_mgr, device_mgr); } dvlab::argparse::ArgumentParser get_qsyn_parser(std::string_view const prog_name) { diff --git a/src/qsyn/qsyn_helper.hpp b/src/qsyn/qsyn_helper.hpp index 56874ae60..d9f5a484d 100644 --- a/src/qsyn/qsyn_helper.hpp +++ b/src/qsyn/qsyn_helper.hpp @@ -11,6 +11,8 @@ #include "cli/cli.hpp" #include "cmd/device_mgr.hpp" +#include "cmd/qbham_mgr.hpp" +#include "cmd/fham_mgr.hpp" #include "cmd/qcir_mgr.hpp" #include "cmd/tableau_mgr.hpp" #include "cmd/tensor_mgr.hpp" @@ -21,7 +23,9 @@ namespace qsyn { bool read_qsynrc_file(dvlab::CommandLineInterface& cli, std::filesystem::path qsynrc_path); bool initialize_qsyn(dvlab::CommandLineInterface& cli, qsyn::device::DeviceMgr& device_mgr, qsyn::qcir::QCirMgr& qcir_mgr, qsyn::tensor::TensorMgr& tensor_mgr, - qsyn::zx::ZXGraphMgr& zxgraph_mgr, qsyn::experimental::TableauMgr& tableau_mgr); + qsyn::zx::ZXGraphMgr& zxgraph_mgr, qsyn::tableau::TableauMgr& tableau_mgr, + qsyn::hamiltonian::QubitHamiltonianMgr& qbham_mgr, + qsyn::hamiltonian::FermionHamiltonianMgr& fham_mgr); dvlab::argparse::ArgumentParser get_qsyn_parser(std::string_view prog_name); } // namespace qsyn diff --git a/src/qsyn/qsyn_main.cpp b/src/qsyn/qsyn_main.cpp index 346001ac0..89cba09a9 100644 --- a/src/qsyn/qsyn_main.cpp +++ b/src/qsyn/qsyn_main.cpp @@ -21,6 +21,8 @@ #include "argparse/arg_parser.hpp" #include "cli/cli.hpp" #include "cmd/device_mgr.hpp" +#include "cmd/qbham_mgr.hpp" +#include "cmd/fham_mgr.hpp" #include "cmd/qcir_mgr.hpp" #include "cmd/tableau_mgr.hpp" #include "cmd/tensor_mgr.hpp" @@ -40,7 +42,9 @@ qsyn::device::DeviceMgr device_mgr{"Device"}; qsyn::qcir::QCirMgr qcir_mgr{"QCir"}; qsyn::tensor::TensorMgr tensor_mgr{"Tensor"}; qsyn::zx::ZXGraphMgr zxgraph_mgr{"ZXGraph"}; -qsyn::experimental::TableauMgr tableau_mgr{"Tableau"}; +qsyn::tableau::TableauMgr tableau_mgr{"Tableau"}; +qsyn::hamiltonian::QubitHamiltonianMgr qbham_mgr{"QbHam"}; +qsyn::hamiltonian::FermionHamiltonianMgr fham_mgr{"FHam"}; // NOLINTEND(readability-identifier-naming) std::string const version_str = fmt::format( @@ -60,7 +64,7 @@ int main(int argc, char** argv) { return; }); - if (!qsyn::initialize_qsyn(cli, device_mgr, qcir_mgr, tensor_mgr, zxgraph_mgr, tableau_mgr)) { + if (!qsyn::initialize_qsyn(cli, device_mgr, qcir_mgr, tensor_mgr, zxgraph_mgr, tableau_mgr, qbham_mgr, fham_mgr)) { return -1; } diff --git a/src/tableau/optimize/internal_h_opt.cpp b/src/tableau/optimize/internal_h_opt.cpp index 19ef9579d..886a0b593 100644 --- a/src/tableau/optimize/internal_h_opt.cpp +++ b/src/tableau/optimize/internal_h_opt.cpp @@ -9,7 +9,7 @@ #include "tableau/pauli_rotation.hpp" #include "tableau/stabilizer_tableau.hpp" -namespace qsyn::experimental { +namespace qsyn::tableau { namespace { @@ -129,7 +129,7 @@ std::pair minimize_hadamards(Tableau tableau, Stabil context.prepend(adjoint(op)); }); - std::string pauli_str = rotation.pauli_product().to_string(); + std::string const pauli_str = rotation.pauli_product().to_string(); implement_into_tableau(new_tableau, context, qubit, rotation.phase()); std::ranges::for_each(adjoint(ops), [&context](CliffordOperator const& op) { @@ -162,4 +162,4 @@ void minimize_internal_hadamards(Tableau& tableau) { remove_identities(tableau); } -} // namespace qsyn::experimental +} // namespace qsyn::tableau diff --git a/src/tableau/optimize/todd.cpp b/src/tableau/optimize/todd.cpp index bcb7b7727..8eab5f740 100644 --- a/src/tableau/optimize/todd.cpp +++ b/src/tableau/optimize/todd.cpp @@ -18,7 +18,7 @@ extern bool stop_requested(); -namespace qsyn::experimental { +namespace qsyn::tableau { namespace { using Polynomial = std::vector; @@ -402,4 +402,4 @@ std::pair ToddPhasePolynomialOptimizationStrategy return {ret_clifford, ret_polynomial}; } -} // namespace qsyn::experimental +} // namespace qsyn::tableau diff --git a/src/tableau/pauli_product.cpp b/src/tableau/pauli_product.cpp new file mode 100644 index 000000000..9bbbf60dc --- /dev/null +++ b/src/tableau/pauli_product.cpp @@ -0,0 +1,255 @@ +/**************************************************************************** + PackageName [ tableau ] + Synopsis [ Define pauli product class ] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#include "pauli_product_trait.hpp" +#include "util/dvlab_string.hpp" + +namespace qsyn { + +namespace tableau { + +std::optional to_clifford_operator_type(std::string_view str) noexcept { + if (str == "h") return CliffordOperatorType::h; + if (str == "s") return CliffordOperatorType::s; + if (str == "cx") return CliffordOperatorType::cx; + if (str == "sdg") return CliffordOperatorType::sdg; + if (str == "v") return CliffordOperatorType::v; + if (str == "vdg") return CliffordOperatorType::vdg; + if (str == "x") return CliffordOperatorType::x; + if (str == "y") return CliffordOperatorType::y; + if (str == "z") return CliffordOperatorType::z; + if (str == "cz") return CliffordOperatorType::cz; + if (str == "swap") return CliffordOperatorType::swap; + if (str == "ecr") return CliffordOperatorType::ecr; + return std::nullopt; +} + +std::string to_string(CliffordOperatorType type) { + switch (type) { + case CliffordOperatorType::h: + return "h"; + case CliffordOperatorType::s: + return "s"; + case CliffordOperatorType::cx: + return "cx"; + case CliffordOperatorType::sdg: + return "sdg"; + case CliffordOperatorType::v: + return "v"; + case CliffordOperatorType::vdg: + return "vdg"; + case CliffordOperatorType::x: + return "x"; + case CliffordOperatorType::y: + return "y"; + case CliffordOperatorType::z: + return "z"; + case CliffordOperatorType::cz: + return "cz"; + case CliffordOperatorType::swap: + return "swap"; + case CliffordOperatorType::ecr: + return "ecr"; + } + DVLAB_UNREACHABLE("Every Clifford type should be handled in the switch-case"); + return ""; +} + +uint8_t power_of_i(Pauli a, Pauli b) { + if (a == Pauli::x && b == Pauli::y) return 1; + if (a == Pauli::y && b == Pauli::z) return 1; + if (a == Pauli::z && b == Pauli::x) return 1; + + if (a == Pauli::x && b == Pauli::z) return 3; + if (a == Pauli::z && b == Pauli::y) return 3; + if (a == Pauli::y && b == Pauli::x) return 3; + return 0; +} + +uint8_t power_of_i(PauliProduct const& lhs, PauliProduct const& rhs) { + uint8_t power = 0; + // NOTE: it's safe to use std::min here because the extra bits don't + // affect the power of i + for (size_t i = 0; i < std::min(lhs.n_qubits(), rhs.n_qubits()); ++i) { + power += power_of_i(lhs.get_pauli_type(i), rhs.get_pauli_type(i)); + } + return power % 4; +} + +PauliProduct::PauliProduct(std::initializer_list const& pauli_list, bool is_neg) + : _bitset(2 * pauli_list.size() + 1, 0) { + if (is_neg) { + _bitset.set(2 * pauli_list.size()); + } + + for (size_t i = 0; i < pauli_list.size(); ++i) { + switch (pauli_list.begin()[i]) { // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic) + case Pauli::i: + break; + case Pauli::z: + _bitset.set(_z_idx(i)); + break; + case Pauli::y: + _bitset.set(_z_idx(i)); + _bitset.set(_x_idx(i)); + break; + case Pauli::x: + _bitset.set(_x_idx(i)); + break; + } + } +} + +PauliProduct::PauliProduct(std::string_view pauli_str) { + bool is_neg = false; + if (pauli_str.front() == '+') { + pauli_str.remove_prefix(1); + } else if (pauli_str.front() == '-') { + pauli_str.remove_prefix(1); + is_neg = true; + } + _bitset.resize(2 * pauli_str.size() + 1); + if (is_neg) { + _bitset.set(2 * pauli_str.size()); + } + for (size_t i = 0; i < pauli_str.size(); ++i) { + switch (dvlab::str::toupper(pauli_str[i])) { + case 'I': + break; + case 'Z': + _bitset.set(_z_idx(i)); + break; + case 'Y': + _bitset.set(_z_idx(i)); + _bitset.set(_x_idx(i)); + break; + case 'X': + _bitset.set(_x_idx(i)); + break; + } + } +} + +PauliProduct& PauliProduct::operator*=(PauliProduct const& rhs) { + // if lhs is shorter than rhs, resize lhs to the same length as rhs + // calculate the sign + uint8_t const power_of_i = qsyn::tableau::power_of_i(*this, rhs); + if ((power_of_i % 4) >> 1 == 1) { + _bitset.flip(_r_idx()); + } + + if (this->n_qubits() < rhs.n_qubits()) { + // REVIEW: maybe we should store z and x separately in the first place? + auto new_bitset = sul::dynamic_bitset<>(2 * rhs.n_qubits() + 1); + for (size_t i = 0; i < this->n_qubits(); ++i) { + new_bitset.set(i, this->is_z_set(i)); + new_bitset.set(i + rhs.n_qubits(), this->is_x_set(i)); + } + new_bitset.set(rhs.n_qubits() * 2, this->is_neg()); + this->_bitset = new_bitset; + } + _bitset ^= rhs._bitset; + return *this; +} + +std::string PauliProduct::to_string(char signedness) const { + std::string str; + if (is_neg()) { + str += '-'; + } else if (signedness == '+') { + str += '+'; + } else if (signedness == ' ') { + str += ' '; + } + + for (size_t i = 0; i < n_qubits(); ++i) { + switch (get_pauli_type(i)) { + case Pauli::i: + str += 'I'; + break; + case Pauli::x: + str += 'X'; + break; + case Pauli::y: + str += 'Y'; + break; + case Pauli::z: + str += 'Z'; + break; + } + } + return str; +} + +std::string PauliProduct::to_bit_string() const { + std::string str; + for (size_t i = 0; i < n_qubits(); ++i) { + str += is_z_set(i) ? '1' : '0'; + } + str += ' '; + for (size_t i = 0; i < n_qubits(); ++i) { + str += is_x_set(i) ? '1' : '0'; + } + str += ' '; + str += is_neg() ? '1' : '0'; + return str; +} + +namespace { + +void bitset_swap_two(size_t i, size_t j, sul::dynamic_bitset<>& bitset) { + assert(i < bitset.size()); + assert(j < bitset.size()); + bitset[i] ^= bitset[j]; + bitset[j] ^= bitset[i]; + bitset[i] ^= bitset[j]; +} + +} // namespace + +PauliProduct& PauliProduct::h(size_t qubit) noexcept { + if (qubit >= n_qubits()) return *this; + if (is_y(qubit)) { + _bitset.flip(_r_idx()); + } + bitset_swap_two(_z_idx(qubit), _x_idx(qubit), _bitset); + return *this; +} + +PauliProduct& PauliProduct::s(size_t qubit) noexcept { + if (qubit >= n_qubits()) return *this; + if (is_y(qubit)) { + _bitset.flip(_r_idx()); + } + _bitset[_z_idx(qubit)] ^= _bitset[_x_idx(qubit)]; + return *this; +} + +PauliProduct& PauliProduct::cx(size_t control, size_t target) noexcept { + if (control >= n_qubits() || target >= n_qubits()) { + return *this; + } + if (_bitset[_x_idx(control)] && _bitset[_z_idx(target)] && (_bitset[_x_idx(target)] == _bitset[_z_idx(control)])) { + _bitset.flip(_r_idx()); + } + _bitset[_x_idx(target)] ^= _bitset[_x_idx(control)]; + _bitset[_z_idx(control)] ^= _bitset[_z_idx(target)]; + + return *this; +} + +bool PauliProduct::is_commutative(PauliProduct const& rhs) const { + assert(n_qubits() == rhs.n_qubits()); + bool is_commutative = true; + for (size_t i = 0; i < n_qubits(); ++i) { + is_commutative ^= (is_z_set(i) && rhs.is_x_set(i)) ^ (is_x_set(i) && rhs.is_z_set(i)); + } + return is_commutative; +} + +} // namespace tableau +} // namespace qsyn diff --git a/src/tableau/pauli_product_trait.hpp b/src/tableau/pauli_product_trait.hpp new file mode 100644 index 000000000..dc362ac03 --- /dev/null +++ b/src/tableau/pauli_product_trait.hpp @@ -0,0 +1,334 @@ +/**************************************************************************** + PackageName [ tableau ] + Synopsis [ Define pauli rotation class ] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#pragma once + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "util/util.hpp" + +namespace qsyn { + +namespace tableau { + +enum class Pauli : std::uint8_t { + i, + x, + y, + z +}; + +uint8_t power_of_i(Pauli a, Pauli b); + +enum class CliffordOperatorType : std::uint8_t { + h, + s, + cx, + sdg, + v, + vdg, + x, + y, + z, + cz, + swap, + ecr, +}; + +std::optional to_clifford_operator_type(std::string_view str) noexcept; +std::string to_string(CliffordOperatorType type); + +using CliffordOperator = std::pair>; +using CliffordOperatorString = std::vector; + +[[nodiscard]] inline CliffordOperatorType adjoint(CliffordOperatorType const& op) { + using COT = CliffordOperatorType; + switch (op) { + case COT::s: + return COT::sdg; + case COT::sdg: + return COT::s; + case COT::v: + return COT::vdg; + case COT::vdg: + return COT::v; + default: + return op; + } +} + +inline void adjoint_inplace(CliffordOperatorType& op) { + op = adjoint(op); +} + +[[nodiscard]] inline CliffordOperator adjoint(CliffordOperator const& op) { + return {adjoint(op.first), op.second}; +} + +inline void adjoint_inplace(CliffordOperator& op) { + op.first = adjoint(op.first); +} + +inline void adjoint_inplace(CliffordOperatorString& ops) { + std::ranges::reverse(ops); + for (auto& op : ops) { + adjoint_inplace(op); + } +} + +[[nodiscard]] inline CliffordOperatorString adjoint(CliffordOperatorString const& ops) { + auto ret = ops; + adjoint_inplace(ret); + return ret; +} + +/** + * @brief Traits for Pauli Product-like classes. Such classes should implement the h, s, cx methods. + The trait will generate the sdg, v, vdg, x, y, z, cz methods. + * @tparam T should be the derived class. + */ +template +class PauliProductTrait { +public: + virtual ~PauliProductTrait() = default; + + virtual T& h(size_t qubit) noexcept = 0; + virtual T& s(size_t qubit) noexcept = 0; + virtual T& cx(size_t control, size_t target) noexcept = 0; + + T& sdg(size_t qubit) noexcept { return s(qubit).s(qubit).s(qubit); } + T& v(size_t qubit) noexcept { return h(qubit).s(qubit).h(qubit); } + T& vdg(size_t qubit) noexcept { return h(qubit).sdg(qubit).h(qubit); } + + T& x(size_t qubit) noexcept { return h(qubit).z(qubit).h(qubit); } + T& y(size_t qubit) noexcept { return x(qubit).z(qubit); } + T& z(size_t qubit) noexcept { return s(qubit).s(qubit); } + T& cz(size_t control, size_t target) noexcept { return h(target).cx(control, target).h(target); } + T& swap(size_t qubit1, size_t qubit2) noexcept { return cx(qubit1, qubit2).cx(qubit2, qubit1).cx(qubit1, qubit2); } + T& ecr(size_t control, size_t target) noexcept { return cx(control, target).s(control).x(control).v(target); } + + T& apply(CliffordOperator const& op) { + auto& [type, qubits] = op; + switch (type) { + case CliffordOperatorType::h: + return h(qubits[0]); + case CliffordOperatorType::s: + return s(qubits[0]); + case CliffordOperatorType::cx: + return cx(qubits[0], qubits[1]); + case CliffordOperatorType::sdg: + return sdg(qubits[0]); + case CliffordOperatorType::v: + return v(qubits[0]); + case CliffordOperatorType::vdg: + return vdg(qubits[0]); + case CliffordOperatorType::x: + return x(qubits[0]); + case CliffordOperatorType::y: + return y(qubits[0]); + case CliffordOperatorType::z: + return z(qubits[0]); + case CliffordOperatorType::cz: + return cz(qubits[0], qubits[1]); + case CliffordOperatorType::swap: + return swap(qubits[0], qubits[1]); + case CliffordOperatorType::ecr: + return ecr(qubits[0], qubits[1]); + } + DVLAB_UNREACHABLE("Every Clifford type should be handled in the switch-case"); + return *static_cast(this); + } + + T& apply(CliffordOperatorString const& ops) { + for (auto const& op : ops) { + this->apply(op); + } + return *static_cast(this); + } +}; + +class PauliProduct : public PauliProductTrait { +public: + PauliProduct(std::initializer_list const& pauli_list, bool is_neg); + PauliProduct(std::string_view pauli_str); + + template S> + requires std::same_as, Pauli> + PauliProduct(I first, S last, bool is_neg) : _bitset(2 * std::ranges::distance(first, last) + 1) { + size_t i = 0; + for (auto it = first; it != last; ++it) { + set_pauli_type(i++, *it); + } + _bitset[_r_idx()] = is_neg; + } + + template + requires std::same_as, Pauli> + PauliProduct(R const& r, bool is_neg) : PauliProduct(std::ranges::begin(r), std::ranges::end(r), is_neg) {} + + size_t n_qubits() const { return (_bitset.size() - 1) / 2; } + Pauli get_pauli_type(size_t i) const { + return is_z_set(i) ? (is_x_set(i) ? Pauli::y : Pauli::z) + : (is_x_set(i) ? Pauli::x : Pauli::i); + } + + bool is_i(size_t i) const { return !is_z_set(i) && !is_x_set(i); } + bool is_x(size_t i) const { return !is_z_set(i) && is_x_set(i); } + bool is_y(size_t i) const { return is_z_set(i) && is_x_set(i); } + bool is_z(size_t i) const { return is_z_set(i) && !is_x_set(i); } + + bool is_neg() const { return _bitset[_r_idx()]; } + + PauliProduct& operator*=(PauliProduct const& rhs); + + friend PauliProduct operator*(PauliProduct lhs, PauliProduct const& rhs) { + lhs *= rhs; + return lhs; + } + + bool operator==(PauliProduct const& rhs) const { return _bitset == rhs._bitset; } + bool operator!=(PauliProduct const& rhs) const { return _bitset != rhs._bitset; } + + std::string to_string(char signedness = '-') const; + std::string to_bit_string() const; + + PauliProduct& h(size_t qubit) noexcept override; + PauliProduct& s(size_t qubit) noexcept override; + PauliProduct& cx(size_t control, size_t target) noexcept override; + + PauliProduct& negate() { + _bitset.flip(_r_idx()); + return *this; + } + + bool is_commutative(PauliProduct const& rhs) const; + + void set_pauli_type(size_t i, Pauli type) { + switch (type) { + case Pauli::i: + _bitset[_z_idx(i)] = false; + _bitset[_x_idx(i)] = false; + break; + case Pauli::x: + _bitset[_z_idx(i)] = false; + _bitset[_x_idx(i)] = true; + break; + case Pauli::y: + _bitset[_z_idx(i)] = true; + _bitset[_x_idx(i)] = true; + break; + case Pauli::z: + _bitset[_z_idx(i)] = true; + _bitset[_x_idx(i)] = false; + break; + } + } + + bool is_z_set(size_t i) const { return _bitset[_z_idx(i)]; } + bool is_x_set(size_t i) const { return _bitset[_x_idx(i)]; } + + void set_z(size_t i, bool z) { _bitset[_z_idx(i)] = z; } + void set_x(size_t i, bool x) { _bitset[_x_idx(i)] = x; } + + bool is_diagonal() const { + return std::ranges::all_of(std::views::iota(0ul, n_qubits()), [this](size_t i) { return is_i(i) || is_z(i); }); + } + + bool is_identity() const { + return std::ranges::all_of(std::views::iota(0ul, n_qubits()), [this](size_t i) { return is_i(i); }); + } + + /** @brief Direct access to the underlying bitset (e.g. for hashing or low-level use). */ + sul::dynamic_bitset<> const& bitset() const { return _bitset; } + +private: + sul::dynamic_bitset<> _bitset; + + size_t _z_idx(size_t i) const { return i; } + size_t _x_idx(size_t i) const { return i + n_qubits(); } + size_t _r_idx() const { return n_qubits() * 2; } +}; + +inline bool is_commutative(PauliProduct const& lhs, PauliProduct const& rhs) { + return lhs.is_commutative(rhs); +} + +uint8_t power_of_i(PauliProduct const& lhs, PauliProduct const& rhs); + +} // namespace tableau +} // namespace qsyn + +namespace std { + +template <> +struct hash { + size_t operator()(qsyn::tableau::PauliProduct const& p) const noexcept { + auto const& b = p.bitset(); + size_t h = std::hash{}(b.size()); + for (size_t i = 0; i < b.size(); ++i) { + h = (h * 31) + static_cast(b[i]); + } + return h; + } +}; + +} // namespace std + +template <> +struct fmt::formatter { + // parse is inherited from formatter. + template + auto format(qsyn::tableau::Pauli c, FormatContext& ctx) { + string_view name = "I"; + switch (c) { + case qsyn::tableau::Pauli::i: + name = "I"; + break; + case qsyn::tableau::Pauli::x: + name = "X"; + break; + case qsyn::tableau::Pauli::y: + name = "Y"; + break; + case qsyn::tableau::Pauli::z: + name = "Z"; + break; + } + return fmt::format_to(ctx.out(), "{}", name); + } +}; + +template <> +struct fmt::formatter { + char presentation = 'c'; + char signedness = '-'; + + constexpr auto parse(format_parse_context& ctx) { + auto it = ctx.begin(), end = ctx.end(); + if (it != end && (*it == '+' || *it == '-' || *it == ' ')) signedness = *it++; + if (it != end && (*it == 'c' || *it == 'b')) presentation = *it++; + if (it != end && *it != '}') detail::throw_format_error("invalid format"); + return it; + } + + template + auto format(qsyn::tableau::PauliProduct const& c, FormatContext& ctx) { + if (presentation == 'b') { + return fmt::format_to(ctx.out(), "{}", c.to_bit_string()); + } else { + return fmt::format_to(ctx.out(), "{}", c.to_string(signedness)); + } + } +}; diff --git a/src/tableau/pauli_rotation.cpp b/src/tableau/pauli_rotation.cpp index ca38f95f0..47150f000 100644 --- a/src/tableau/pauli_rotation.cpp +++ b/src/tableau/pauli_rotation.cpp @@ -12,232 +12,10 @@ #include #include "util/boolean_matrix.hpp" -#include "util/dvlab_string.hpp" namespace qsyn { -namespace experimental { - -std::optional to_clifford_operator_type(std::string_view str) noexcept { - if (str == "h") return CliffordOperatorType::h; - if (str == "s") return CliffordOperatorType::s; - if (str == "cx") return CliffordOperatorType::cx; - if (str == "sdg") return CliffordOperatorType::sdg; - if (str == "v") return CliffordOperatorType::v; - if (str == "vdg") return CliffordOperatorType::vdg; - if (str == "x") return CliffordOperatorType::x; - if (str == "y") return CliffordOperatorType::y; - if (str == "z") return CliffordOperatorType::z; - if (str == "cz") return CliffordOperatorType::cz; - if (str == "swap") return CliffordOperatorType::swap; - if (str == "ecr") return CliffordOperatorType::ecr; - return std::nullopt; -} - -std::string to_string(CliffordOperatorType type) { - switch (type) { - case CliffordOperatorType::h: - return "h"; - case CliffordOperatorType::s: - return "s"; - case CliffordOperatorType::cx: - return "cx"; - case CliffordOperatorType::sdg: - return "sdg"; - case CliffordOperatorType::v: - return "v"; - case CliffordOperatorType::vdg: - return "vdg"; - case CliffordOperatorType::x: - return "x"; - case CliffordOperatorType::y: - return "y"; - case CliffordOperatorType::z: - return "z"; - case CliffordOperatorType::cz: - return "cz"; - case CliffordOperatorType::swap: - return "swap"; - case CliffordOperatorType::ecr: - return "ecr"; - } - DVLAB_UNREACHABLE("Every Clifford type should be handled in the switch-case"); - return ""; -} - -uint8_t power_of_i(Pauli a, Pauli b) { - if (a == Pauli::x && b == Pauli::y) return 1; - if (a == Pauli::y && b == Pauli::z) return 1; - if (a == Pauli::z && b == Pauli::x) return 1; - - if (a == Pauli::x && b == Pauli::z) return 3; - if (a == Pauli::z && b == Pauli::y) return 3; - if (a == Pauli::y && b == Pauli::x) return 3; - return 0; -} - -PauliProduct::PauliProduct(std::initializer_list const& pauli_list, bool is_neg) - : _bitset(2 * pauli_list.size() + 1, 0) { - if (is_neg) { - _bitset.set(2 * pauli_list.size()); - } - - for (size_t i = 0; i < pauli_list.size(); ++i) { - switch (pauli_list.begin()[i]) { // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic) - case Pauli::i: - break; - case Pauli::z: - _bitset.set(_z_idx(i)); - break; - case Pauli::y: - _bitset.set(_z_idx(i)); - _bitset.set(_x_idx(i)); - break; - case Pauli::x: - _bitset.set(_x_idx(i)); - break; - } - } -} - -PauliProduct::PauliProduct(std::string_view pauli_str) { - bool is_neg = false; - if (pauli_str.front() == '+') { - pauli_str.remove_prefix(1); - } else if (pauli_str.front() == '-') { - pauli_str.remove_prefix(1); - is_neg = true; - } - _bitset.resize(2 * pauli_str.size() + 1); - if (is_neg) { - _bitset.set(2 * pauli_str.size()); - } - for (size_t i = 0; i < pauli_str.size(); ++i) { - switch (dvlab::str::toupper(pauli_str[i])) { - case 'I': - break; - case 'Z': - _bitset.set(_z_idx(i)); - break; - case 'Y': - _bitset.set(_z_idx(i)); - _bitset.set(_x_idx(i)); - break; - case 'X': - _bitset.set(_x_idx(i)); - break; - } - } -} - -PauliProduct& PauliProduct::operator*=(PauliProduct const& rhs) { - assert(n_qubits() == rhs.n_qubits()); - // calculate the sign - uint8_t power_of_i = 0; - for (size_t i = 0; i < n_qubits(); ++i) { - power_of_i += qsyn::experimental::power_of_i(get_pauli_type(i), rhs.get_pauli_type(i)); - } - if ((power_of_i % 4) >> 1 == 1) { - _bitset.flip(_r_idx()); - } - _bitset ^= rhs._bitset; - return *this; -} - -std::string PauliProduct::to_string(char signedness) const { - std::string str; - if (is_neg()) { - str += '-'; - } else if (signedness == '+') { - str += '+'; - } else if (signedness == ' ') { - str += ' '; - } - - for (size_t i = 0; i < n_qubits(); ++i) { - switch (get_pauli_type(i)) { - case Pauli::i: - str += 'I'; - break; - case Pauli::x: - str += 'X'; - break; - case Pauli::y: - str += 'Y'; - break; - case Pauli::z: - str += 'Z'; - break; - } - } - return str; -} - -std::string PauliProduct::to_bit_string() const { - std::string str; - for (size_t i = 0; i < n_qubits(); ++i) { - str += is_z_set(i) ? '1' : '0'; - } - str += ' '; - for (size_t i = 0; i < n_qubits(); ++i) { - str += is_x_set(i) ? '1' : '0'; - } - str += ' '; - str += is_neg() ? '1' : '0'; - return str; -} - -namespace { - -void bitset_swap_two(size_t i, size_t j, sul::dynamic_bitset<>& bitset) { - assert(i < bitset.size()); - assert(j < bitset.size()); - bitset[i] ^= bitset[j]; - bitset[j] ^= bitset[i]; - bitset[i] ^= bitset[j]; -} - -} // namespace - -PauliProduct& PauliProduct::h(size_t qubit) noexcept { - if (qubit >= n_qubits()) return *this; - if (is_y(qubit)) { - _bitset.flip(_r_idx()); - } - bitset_swap_two(_z_idx(qubit), _x_idx(qubit), _bitset); - return *this; -} - -PauliProduct& PauliProduct::s(size_t qubit) noexcept { - if (qubit >= n_qubits()) return *this; - if (is_y(qubit)) { - _bitset.flip(_r_idx()); - } - _bitset[_z_idx(qubit)] ^= _bitset[_x_idx(qubit)]; - return *this; -} - -PauliProduct& PauliProduct::cx(size_t control, size_t target) noexcept { - if (control >= n_qubits() || target >= n_qubits()) { - return *this; - } - if (_bitset[_x_idx(control)] && _bitset[_z_idx(target)] && (_bitset[_x_idx(target)] == _bitset[_z_idx(control)])) { - _bitset.flip(_r_idx()); - } - _bitset[_x_idx(target)] ^= _bitset[_x_idx(control)]; - _bitset[_z_idx(control)] ^= _bitset[_z_idx(target)]; - - return *this; -} - -bool PauliProduct::is_commutative(PauliProduct const& rhs) const { - assert(n_qubits() == rhs.n_qubits()); - bool is_commutative = true; - for (size_t i = 0; i < n_qubits(); ++i) { - is_commutative ^= (is_z_set(i) && rhs.is_x_set(i)) ^ (is_x_set(i) && rhs.is_z_set(i)); - } - return is_commutative; -} +namespace tableau { PauliRotation::PauliRotation(std::initializer_list const& pauli_list, dvlab::Phase const& phase) : _pauli_product(pauli_list, false), _phase(phase) { _normalize(); } @@ -245,6 +23,10 @@ PauliRotation::PauliRotation(std::initializer_list const& pauli_list, dvl PauliRotation::PauliRotation(std::string_view pauli_str, dvlab::Phase const& phase) : _pauli_product(pauli_str), _phase(phase) { _normalize(); } +PauliRotation::PauliRotation(PauliProduct const& pauli_product, dvlab::Phase const& phase) : _pauli_product(pauli_product), _phase(phase) { + _normalize(); +} + std::string PauliRotation::to_string(char signedness) const { return fmt::format("exp(i * {} * {})", _phase.get_print_string(), _pauli_product.to_string(signedness)); } @@ -310,6 +92,6 @@ size_t matrix_rank(std::vector const& rotations) { return matrix.matrix_rank(); }; -} // namespace experimental +} // namespace tableau } // namespace qsyn diff --git a/src/tableau/pauli_rotation.hpp b/src/tableau/pauli_rotation.hpp index 66718ac8f..fd40bbb9a 100644 --- a/src/tableau/pauli_rotation.hpp +++ b/src/tableau/pauli_rotation.hpp @@ -9,271 +9,36 @@ #include -#include -#include #include #include -#include #include #include #include +#include "tableau/pauli_product_trait.hpp" #include "util/phase.hpp" namespace qsyn { -namespace experimental { - -enum class Pauli : std::uint8_t { - i, - x, - y, - z -}; - -uint8_t power_of_i(Pauli a, Pauli b); - -enum class CliffordOperatorType : std::uint8_t { - h, - s, - cx, - sdg, - v, - vdg, - x, - y, - z, - cz, - swap, - ecr, -}; - -std::optional to_clifford_operator_type(std::string_view str) noexcept; -std::string to_string(CliffordOperatorType type); - -using CliffordOperator = std::pair>; -using CliffordOperatorString = std::vector; - -[[nodiscard]] inline CliffordOperatorType adjoint(CliffordOperatorType const& op) { - using COT = CliffordOperatorType; - switch (op) { - case COT::s: - return COT::sdg; - case COT::sdg: - return COT::s; - case COT::v: - return COT::vdg; - case COT::vdg: - return COT::v; - default: - return op; - } -} - -inline void adjoint_inplace(CliffordOperatorType& op) { - op = adjoint(op); -} - -[[nodiscard]] inline CliffordOperator adjoint(CliffordOperator const& op) { - return {adjoint(op.first), op.second}; -} - -inline void adjoint_inplace(CliffordOperator& op) { - op.first = adjoint(op.first); -} - -inline void adjoint_inplace(CliffordOperatorString& ops) { - std::ranges::reverse(ops); - for (auto& op : ops) { - adjoint_inplace(op); - } -} - -[[nodiscard]] inline CliffordOperatorString adjoint(CliffordOperatorString const& ops) { - auto ret = ops; - adjoint_inplace(ret); - return ret; -} - -/** - * @brief Traits for Pauli Product-like classes. Such classes should implement the h, s, cx methods. - The trait will generate the sdg, v, vdg, x, y, z, cz methods. - * @tparam T should be the derived class. - */ -template -class PauliProductTrait { -public: - virtual ~PauliProductTrait() = default; - - virtual T& h(size_t qubit) noexcept = 0; - virtual T& s(size_t qubit) noexcept = 0; - virtual T& cx(size_t control, size_t target) noexcept = 0; - - T& sdg(size_t qubit) noexcept { return s(qubit).s(qubit).s(qubit); } - T& v(size_t qubit) noexcept { return h(qubit).s(qubit).h(qubit); } - T& vdg(size_t qubit) noexcept { return h(qubit).sdg(qubit).h(qubit); } - - T& x(size_t qubit) noexcept { return h(qubit).z(qubit).h(qubit); } - T& y(size_t qubit) noexcept { return x(qubit).z(qubit); } - T& z(size_t qubit) noexcept { return s(qubit).s(qubit); } - T& cz(size_t control, size_t target) noexcept { return h(target).cx(control, target).h(target); } - T& swap(size_t qubit1, size_t qubit2) noexcept { return cx(qubit1, qubit2).cx(qubit2, qubit1).cx(qubit1, qubit2); } - T& ecr(size_t control, size_t target) noexcept { return cx(control, target).s(control).x(control).v(target); } - - T& apply(CliffordOperator const& op) { - auto& [type, qubits] = op; - switch (type) { - case CliffordOperatorType::h: - return h(qubits[0]); - case CliffordOperatorType::s: - return s(qubits[0]); - case CliffordOperatorType::cx: - return cx(qubits[0], qubits[1]); - case CliffordOperatorType::sdg: - return sdg(qubits[0]); - case CliffordOperatorType::v: - return v(qubits[0]); - case CliffordOperatorType::vdg: - return vdg(qubits[0]); - case CliffordOperatorType::x: - return x(qubits[0]); - case CliffordOperatorType::y: - return y(qubits[0]); - case CliffordOperatorType::z: - return z(qubits[0]); - case CliffordOperatorType::cz: - return cz(qubits[0], qubits[1]); - case CliffordOperatorType::swap: - return swap(qubits[0], qubits[1]); - case CliffordOperatorType::ecr: - return ecr(qubits[0], qubits[1]); - } - DVLAB_UNREACHABLE("Every Clifford type should be handled in the switch-case"); - return *static_cast(this); - } - - T& apply(CliffordOperatorString const& ops) { - for (auto const& op : ops) { - this->apply(op); - } - return *static_cast(this); - } -}; - -class PauliProduct : public PauliProductTrait { -public: - PauliProduct(std::initializer_list const& pauli_list, bool is_neg); - PauliProduct(std::string_view pauli_str); - - template S> - PauliProduct(I first, S last, bool is_neg) : _bitset(2 * std::ranges::distance(first, last) + 1) { - size_t i = 0; - for (auto it = first; it != last; ++it) { - set_pauli_type(i++, *it); - } - _bitset[_r_idx()] = is_neg; - } - - template - PauliProduct(R const& r, bool is_neg) : PauliProduct(std::ranges::begin(r), std::ranges::end(r), is_neg) {} - - size_t n_qubits() const { return (_bitset.size() - 1) / 2; } - Pauli get_pauli_type(size_t i) const { - return is_z_set(i) ? (is_x_set(i) ? Pauli::y : Pauli::z) - : (is_x_set(i) ? Pauli::x : Pauli::i); - } - - bool is_i(size_t i) const { return !is_z_set(i) && !is_x_set(i); } - bool is_x(size_t i) const { return !is_z_set(i) && is_x_set(i); } - bool is_y(size_t i) const { return is_z_set(i) && is_x_set(i); } - bool is_z(size_t i) const { return is_z_set(i) && !is_x_set(i); } - - bool is_neg() const { return _bitset[_r_idx()]; } - - PauliProduct& operator*=(PauliProduct const& rhs); - - friend PauliProduct operator*(PauliProduct lhs, PauliProduct const& rhs) { - lhs *= rhs; - return lhs; - } - - bool operator==(PauliProduct const& rhs) const { return _bitset == rhs._bitset; } - bool operator!=(PauliProduct const& rhs) const { return _bitset != rhs._bitset; } - - std::string to_string(char signedness = '-') const; - std::string to_bit_string() const; - - PauliProduct& h(size_t qubit) noexcept override; - PauliProduct& s(size_t qubit) noexcept override; - PauliProduct& cx(size_t control, size_t target) noexcept override; - - PauliProduct& negate() { - _bitset.flip(_r_idx()); - return *this; - } - - bool is_commutative(PauliProduct const& rhs) const; - - void set_pauli_type(size_t i, Pauli type) { - switch (type) { - case Pauli::i: - _bitset[_z_idx(i)] = false; - _bitset[_x_idx(i)] = false; - break; - case Pauli::x: - _bitset[_z_idx(i)] = false; - _bitset[_x_idx(i)] = true; - break; - case Pauli::y: - _bitset[_z_idx(i)] = true; - _bitset[_x_idx(i)] = true; - break; - case Pauli::z: - _bitset[_z_idx(i)] = true; - _bitset[_x_idx(i)] = false; - break; - } - } - - bool is_z_set(size_t i) const { return _bitset[_z_idx(i)]; } - bool is_x_set(size_t i) const { return _bitset[_x_idx(i)]; } - - bool is_diagonal() const { - return std::ranges::all_of(std::views::iota(0ul, n_qubits()), [this](size_t i) { return is_i(i) || is_z(i); }); - } - - bool is_identity() const { - return std::ranges::all_of(std::views::iota(0ul, n_qubits()), [this](size_t i) { return is_i(i); }); - } - -private: - sul::dynamic_bitset<> _bitset; - - size_t _z_idx(size_t i) const { return i; } - size_t _x_idx(size_t i) const { return i + n_qubits(); } - size_t _r_idx() const { return n_qubits() * 2; } -}; - -inline bool is_commutative(PauliProduct const& lhs, PauliProduct const& rhs) { - return lhs.is_commutative(rhs); -} +namespace tableau { class PauliRotation : public PauliProductTrait { public: PauliRotation(std::initializer_list const& pauli_list, dvlab::Phase const& phase); PauliRotation(std::string_view pauli_str, dvlab::Phase const& phase); - PauliRotation(PauliProduct const& pauli_product, dvlab::Phase const& phase) : _pauli_product(pauli_product), _phase(phase) { - _normalize(); - } + PauliRotation(PauliProduct const& pauli_product, dvlab::Phase const& phase); template S> + requires std::same_as, Pauli> PauliRotation(I first, S last, dvlab::Phase const& phase) : _pauli_product(first, last, false), _phase(phase) { _normalize(); } template - PauliRotation(R const& r, dvlab::Phase const& phase) : PauliRotation(std::ranges::begin(r), std::ranges::end(r), phase) {} + requires std::same_as, Pauli> + PauliRotation(R const& r, dvlab::Phase const& phase) + : PauliRotation(std::ranges::begin(r), std::ranges::end(r), phase) {} size_t n_qubits() const { return _pauli_product.n_qubits(); } Pauli get_pauli_type(size_t i) const { return _pauli_product.get_pauli_type(i); } @@ -325,59 +90,12 @@ std::pair extract_clifford_operators(PauliRotati using PauliRotationTableau = std::vector; size_t matrix_rank(std::vector const& rotations); -} // namespace experimental +} // namespace tableau } // namespace qsyn template <> -struct fmt::formatter { - // parse is inherited from formatter. - template - auto format(qsyn::experimental::Pauli c, FormatContext& ctx) { - string_view name = "I"; - switch (c) { - case qsyn::experimental::Pauli::i: - name = "I"; - break; - case qsyn::experimental::Pauli::x: - name = "X"; - break; - case qsyn::experimental::Pauli::y: - name = "Y"; - break; - case qsyn::experimental::Pauli::z: - name = "Z"; - break; - } - return fmt::format_to(ctx.out(), "{}", name); - } -}; - -template <> -struct fmt::formatter { - char presentation = 'c'; - char signedness = '-'; - - constexpr auto parse(format_parse_context& ctx) { - auto it = ctx.begin(), end = ctx.end(); - if (it != end && (*it == '+' || *it == '-' || *it == ' ')) signedness = *it++; - if (it != end && (*it == 'c' || *it == 'b')) presentation = *it++; - if (it != end && *it != '}') detail::throw_format_error("invalid format"); - return it; - } - - template - auto format(qsyn::experimental::PauliProduct const& c, FormatContext& ctx) { - if (presentation == 'b') { - return fmt::format_to(ctx.out(), "{}", c.to_bit_string()); - } else { - return fmt::format_to(ctx.out(), "{}", c.to_string(signedness)); - } - } -}; - -template <> -struct fmt::formatter { +struct fmt::formatter { char presentation = 'c'; char signedness = '-'; @@ -390,7 +108,7 @@ struct fmt::formatter { } template - auto format(qsyn::experimental::PauliRotation const& c, FormatContext& ctx) const { + auto format(qsyn::tableau::PauliRotation const& c, FormatContext& ctx) const { if (presentation == 'b') { return fmt::format_to(ctx.out(), "{}", c.to_bit_string()); } else { diff --git a/src/tableau/stabilizer_tableau.cpp b/src/tableau/stabilizer_tableau.cpp index df1120b87..294fa576a 100644 --- a/src/tableau/stabilizer_tableau.cpp +++ b/src/tableau/stabilizer_tableau.cpp @@ -8,14 +8,16 @@ #include "./stabilizer_tableau.hpp" #include +#include #include #include +#include #include "tableau/pauli_rotation.hpp" bool stop_requested(); -namespace qsyn::experimental { +namespace qsyn::tableau { std::string StabilizerTableau::to_string() const { std::string ret; @@ -59,6 +61,21 @@ StabilizerTableau& StabilizerTableau::cx(size_t ctrl, size_t targ) noexcept { return *this; } +StabilizerTableau& StabilizerTableau::sdg(size_t qubit) noexcept { + s(qubit).s(qubit).s(qubit); + return *this; +} + +StabilizerTableau& StabilizerTableau::v(size_t qubit) noexcept { + h(qubit).s(qubit).h(qubit); + return *this; +} + +StabilizerTableau& StabilizerTableau::vdg(size_t qubit) noexcept { + h(qubit).sdg(qubit).h(qubit); + return *this; +} + StabilizerTableau& StabilizerTableau::prepend_h(size_t qubit) { if (qubit >= n_qubits()) return *this; std::swap(stabilizer(qubit), destabilizer(qubit)); @@ -147,12 +164,17 @@ StabilizerTableau& StabilizerTableau::prepend(CliffordOperator const& op) { } StabilizerTableau& StabilizerTableau::prepend(CliffordOperatorString const& ops) { - for (auto const& op : ops) { + for (auto const& op : ops | std::views::reverse) { prepend(op); } return *this; } +StabilizerTableau& StabilizerTableau::prepend(StabilizerTableau const& tableau) { + auto const ops = extract_clifford_operators(tableau); + return prepend(ops); +} + StabilizerTableau adjoint(StabilizerTableau const& tableau) { return StabilizerTableau{tableau.n_qubits()}.apply(adjoint(extract_clifford_operators(tableau))); } @@ -160,33 +182,53 @@ StabilizerTableau adjoint(StabilizerTableau const& tableau) { CliffordOperatorString extract_clifford_operators(StabilizerTableau copy, StabilizerTableauSynthesisStrategy const& strategy) { return strategy.synthesize(std::move(copy)); } -CliffordOperatorString AGSynthesisStrategy::synthesize(StabilizerTableau copy) const { - CliffordOperatorString clifford_ops; - auto const add_cx = [&](size_t ctrl, size_t targ) { - copy.cx(ctrl, targ); - clifford_ops.push_back({CliffordOperatorType::cx, {ctrl, targ}}); - }; +namespace { +void add_cx(StabilizerTableau& tableau, size_t ctrl, size_t targ, CliffordOperatorString& clifford_ops) { + tableau.cx(ctrl, targ); + clifford_ops.push_back({CliffordOperatorType::cx, {ctrl, targ}}); +} - auto const add_h = [&](size_t qubit) { - copy.h(qubit); - clifford_ops.push_back({CliffordOperatorType::h, {qubit, 0}}); - }; +void add_h(StabilizerTableau& tableau, size_t qubit, CliffordOperatorString& clifford_ops) { + tableau.h(qubit); + clifford_ops.push_back({CliffordOperatorType::h, {qubit, 0}}); +} - auto const add_s = [&](size_t qubit) { - copy.s(qubit); - clifford_ops.push_back({CliffordOperatorType::s, {qubit, 0}}); - }; +void add_s(StabilizerTableau& tableau, size_t qubit, CliffordOperatorString& clifford_ops) { + tableau.s(qubit); + clifford_ops.push_back({CliffordOperatorType::s, {qubit, 0}}); +} - auto const add_x = [&](size_t qubit) { - copy.x(qubit); - clifford_ops.push_back({CliffordOperatorType::x, {qubit, 0}}); - }; +void add_v(StabilizerTableau& tableau, size_t qubit, CliffordOperatorString& clifford_ops) { + tableau.v(qubit); + clifford_ops.push_back({CliffordOperatorType::v, {qubit, 0}}); +} - auto const add_z = [&](size_t qubit) { - copy.z(qubit); - clifford_ops.push_back({CliffordOperatorType::z, {qubit, 0}}); - }; +void add_x(StabilizerTableau& tableau, size_t qubit, CliffordOperatorString& clifford_ops) { + tableau.x(qubit); + clifford_ops.push_back({CliffordOperatorType::x, {qubit, 0}}); +} + +void add_z(StabilizerTableau& tableau, size_t qubit, CliffordOperatorString& clifford_ops) { + tableau.z(qubit); + clifford_ops.push_back({CliffordOperatorType::z, {qubit, 0}}); +} + +void handle_negatives(StabilizerTableau& tableau, CliffordOperatorString& ops) { + for (size_t qubit = 0; qubit < tableau.n_qubits(); ++qubit) { + if (tableau.stabilizer(qubit).is_neg()) { + add_x(tableau, qubit, ops); + } + if (tableau.destabilizer(qubit).is_neg()) { + add_z(tableau, qubit, ops); + } + } +} + +} // namespace + +CliffordOperatorString AGSynthesisStrategy::synthesize(StabilizerTableau copy) const { + CliffordOperatorString clifford_ops; auto const make_destab_x_main_diag_1 = [&](size_t qubit) { if (copy.destabilizer(qubit).is_x_set(qubit)) return; @@ -201,15 +243,15 @@ CliffordOperatorString AGSynthesisStrategy::synthesize(StabilizerTableau copy) c search_idx_range.begin() + qubit + 1); if (ctrl < copy.n_qubits()) { - add_cx(ctrl, qubit); + add_cx(copy, ctrl, qubit, clifford_ops); return; } for (size_t ctrl = qubit; ctrl < copy.n_qubits(); ++ctrl) { if (copy.destabilizer(qubit).is_z_set(ctrl)) { - add_h(ctrl); + add_h(copy, ctrl, clifford_ops); if (ctrl != qubit) { - add_cx(ctrl, qubit); + add_cx(copy, ctrl, qubit, clifford_ops); } break; } @@ -219,7 +261,7 @@ CliffordOperatorString AGSynthesisStrategy::synthesize(StabilizerTableau copy) c auto const make_destab_x_off_diag_0 = [&](size_t qubit) { for (size_t targ = qubit + 1; targ < copy.n_qubits(); ++targ) { if (copy.destabilizer(qubit).is_x_set(targ)) { - add_cx(qubit, targ); + add_cx(copy, qubit, targ, clifford_ops); } } @@ -231,22 +273,22 @@ CliffordOperatorString AGSynthesisStrategy::synthesize(StabilizerTableau copy) c if (some_z_set) { if (!copy.destabilizer(qubit).is_z_set(qubit)) { - add_s(qubit); + add_s(copy, qubit, clifford_ops); } for (size_t ctrl = qubit + 1; ctrl < copy.n_qubits(); ++ctrl) { if (copy.destabilizer(qubit).is_z_set(ctrl)) { - add_cx(ctrl, qubit); + add_cx(copy, ctrl, qubit, clifford_ops); } } - add_s(qubit); + add_s(copy, qubit, clifford_ops); } }; auto const make_stab_z_off_diag_0 = [&](size_t qubit) { for (size_t ctrl = qubit + 1; ctrl < copy.n_qubits(); ++ctrl) { if (copy.stabilizer(qubit).is_z_set(ctrl)) { - add_cx(ctrl, qubit); + add_cx(copy, ctrl, qubit, clifford_ops); } } @@ -257,39 +299,81 @@ CliffordOperatorString AGSynthesisStrategy::synthesize(StabilizerTableau copy) c }); if (some_x_set) { - add_h(qubit); + add_h(copy, qubit, clifford_ops); for (size_t targ = qubit + 1; targ < copy.n_qubits(); ++targ) { if (copy.stabilizer(qubit).is_x_set(targ)) { - add_cx(qubit, targ); + add_cx(copy, qubit, targ, clifford_ops); } } if (copy.stabilizer(qubit).is_z_set(qubit)) { - add_s(qubit); + add_s(copy, qubit, clifford_ops); + } + + add_h(copy, qubit, clifford_ops); + } + }; + + auto const make_destab_x_off_diag_0_plus = [&](size_t qubit) { + if (copy.destabilizer(qubit).is_z_set(qubit)) { + add_s(copy, qubit, clifford_ops); + } + + for (size_t qid = qubit + 1; qid < copy.n_qubits(); ++qid) { + if (copy.destabilizer(qubit).is_z_set(qid)) { + if (copy.destabilizer(qubit).is_x_set(qid)) { + add_s(copy, qid, clifford_ops); + } else { + add_h(copy, qid, clifford_ops); + } } + } - add_h(qubit); + for (size_t targ = qubit + 1; targ < copy.n_qubits(); ++targ) { + if (copy.destabilizer(qubit).is_x_set(targ)) { + add_cx(copy, qubit, targ, clifford_ops); + } + } + }; + + auto const make_stab_z_off_diag_0_plus = [&](size_t qubit) { + if (copy.stabilizer(qubit).is_x_set(qubit)) { + add_v(copy, qubit, clifford_ops); + } + + for (size_t qid = qubit + 1; qid < copy.n_qubits(); ++qid) { + if (copy.stabilizer(qubit).is_x_set(qid)) { + if (copy.stabilizer(qubit).is_z_set(qid)) { + add_v(copy, qid, clifford_ops); + } else { + add_h(copy, qid, clifford_ops); + } + } + } + + for (size_t ctrl = qubit + 1; ctrl < copy.n_qubits(); ++ctrl) { + if (copy.stabilizer(qubit).is_z_set(ctrl)) { + add_cx(copy, ctrl, qubit, clifford_ops); + } } }; for (size_t qubit = 0; qubit < copy.n_qubits(); ++qubit) { if (stop_requested()) break; make_destab_x_main_diag_1(qubit); - make_destab_x_off_diag_0(qubit); - make_stab_z_off_diag_0(qubit); + if (mode == Mode::ag_plus) { + make_destab_x_off_diag_0_plus(qubit); + make_stab_z_off_diag_0_plus(qubit); + } else { + make_destab_x_off_diag_0(qubit); + make_stab_z_off_diag_0(qubit); + } } if (stop_requested()) return {}; - for (size_t qubit = 0; qubit < copy.n_qubits(); ++qubit) { - if (copy.stabilizer(qubit).is_neg()) { - add_x(qubit); - } - if (copy.destabilizer(qubit).is_neg()) { - add_z(qubit); - } - } + handle_negatives(copy, clifford_ops); adjoint_inplace(clifford_ops); @@ -297,7 +381,8 @@ CliffordOperatorString AGSynthesisStrategy::synthesize(StabilizerTableau copy) c } namespace { -std::vector get_qubits_with_stabilizer_set(StabilizerTableau const& tableau, size_t qubit) { +std::vector +get_qubits_with_stabilizer_set(StabilizerTableau const& tableau, size_t qubit) { std::vector qubits_with_stabilizer_set; for (size_t i = 0; i < tableau.n_qubits(); ++i) { if (tableau.stabilizer(qubit).is_x_set(i)) { @@ -308,30 +393,26 @@ std::vector get_qubits_with_stabilizer_set(StabilizerTableau const& tabl } } // namespace -CliffordOperatorString HOptSynthesisStrategy::synthesize(StabilizerTableau copy) const { +/** + * @brief Synthesize the diagonal part of the tableau using the H-opt method. + * Note that the returned CliffordOperatorString is the adjoint of the + * actual diagonalization. This is because when we synthesize the + * remaining Clifford operators, we also synthesize an adjoint circuit. + * The caller is responsible for adjointing the gate string. + * + * @param clifford The tableau to synthesize. + * @return The adjoint of the diagonalization. + */ +CliffordOperatorString +HOptSynthesisStrategy::partial_synthesize(StabilizerTableau& clifford) const { CliffordOperatorString diag_ops; - auto const add_cx = [&](size_t ctrl, size_t targ) { - copy.cx(ctrl, targ); - diag_ops.push_back({CliffordOperatorType::cx, {ctrl, targ}}); - }; - - auto const add_h = [&](size_t qubit) { - copy.h(qubit); - diag_ops.push_back({CliffordOperatorType::h, {qubit, 0}}); - }; - - auto const add_s = [&](size_t qubit) { - copy.s(qubit); - diag_ops.push_back({CliffordOperatorType::s, {qubit, 0}}); - }; - // diagonalize all stabilizers - for (size_t i = 0; i < copy.n_qubits(); ++i) { + for (size_t i = 0; i < clifford.n_qubits(); ++i) { if (stop_requested()) break; - auto const qubit_range = std::views::iota(0ul, copy.n_qubits()); + auto const qubit_range = std::views::iota(0ul, clifford.n_qubits()); auto const qubits_with_stabilizer_set = - get_qubits_with_stabilizer_set(copy, i); + get_qubits_with_stabilizer_set(clifford, i); if (qubits_with_stabilizer_set.empty()) continue; @@ -339,7 +420,7 @@ CliffordOperatorString HOptSynthesisStrategy::synthesize(StabilizerTableau copy) if (mode == Mode::star) { for (auto const targ : qubits_with_stabilizer_set | std::views::drop(1)) { - add_cx(ctrl, targ); + add_cx(clifford, ctrl, targ, diag_ops); } } else /* staircase */ { @@ -347,32 +428,429 @@ CliffordOperatorString HOptSynthesisStrategy::synthesize(StabilizerTableau copy) qubits_with_stabilizer_set | std::views::reverse | tl::views::pairwise) { - add_cx(c, t); + add_cx(clifford, c, t, diag_ops); } } - if (copy.stabilizer(i).is_z_set(ctrl)) { - add_s(ctrl); + if (clifford.stabilizer(i).is_z_set(ctrl)) { + add_s(clifford, ctrl, diag_ops); } - add_h(ctrl); + add_h(clifford, ctrl, diag_ops); } + return diag_ops; +} + +/** + * @brief Synthesize from stabilizer tableau using the H-opt method. + * This function synthesizes the diagonal part of the tableau using the + * H-opt method, and then synthesizes the remaining Clifford operators + * using the Aaronson-Gottesman method. Note that the A-G subcircuit is + * placed before the H-opt subcircuit. + * + * @param copy The tableau to synthesize. + * @return The synthesized CliffordOperatorString. + */ +CliffordOperatorString +HOptSynthesisStrategy::synthesize(StabilizerTableau copy) const { + CliffordOperatorString const diag_ops = adjoint(partial_synthesize(copy)); + if (stop_requested()) return {}; // synthesize the now diagonal stabilizers with Aaronson-Gottesman method + // assert that stab_x are all zeros. This means that the tableau is H-free + + for (size_t i = 0; i < copy.n_qubits(); ++i) { + for (size_t j = 0; j < copy.n_qubits(); ++j) { + if (copy.stabilizer(i).is_x_set(j)) { + DVLAB_ASSERT(false, "Stabilizer tableau is not H-free"); + } + } + } + auto clifford_ops = extract_clifford_operators(copy, AGSynthesisStrategy{}); + // auto clifford_ops = synthesize_h_free_mr(copy); assert(std::ranges::none_of(clifford_ops, [](auto const& op) { return op.first == CliffordOperatorType::h; })); - adjoint_inplace(diag_ops); - clifford_ops.insert(clifford_ops.end(), diag_ops.begin(), diag_ops.end()); return clifford_ops; } -} // namespace qsyn::experimental +namespace { + +// helper function that converts a row operation to a CX gate +// This function is used to avoid confusion because the control-target direction +// is opposite to the row operation direction. +void row_op(StabilizerTableau& tableau, + size_t row1, + size_t row2, + CliffordOperatorString& cx_ops) { + add_cx(tableau, row2, row1, cx_ops); +} + +void eliminate_chunk(StabilizerTableau& tableau, + size_t chunk_begin, + size_t chunk_end, + CliffordOperatorString& cx_ops, + bool up_to_down) { + auto const n_qubits = tableau.n_qubits(); + auto const chunk_size = chunk_end - chunk_begin; + + auto const bitset_hash = [](sul::dynamic_bitset<> const& bitset) { + size_t hash = 0; + for (size_t i = 0; i < bitset.num_blocks(); ++i) { + // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic) + hash ^= std::hash{}(bitset.data()[i]); + } + return hash; + }; + + // record visited chunks and the row index of the first occurrence + std::unordered_map, size_t, decltype(bitset_hash)> + visited_chunks{0, bitset_hash}; + + auto const make_chunk = [&](size_t row) { + sul::dynamic_bitset<> chunk(chunk_size); + for (auto i : std::views::iota(chunk_begin, chunk_end)) { + chunk.set(i - chunk_begin, tableau.stabilizer(i).is_x_set(row)); + } + return chunk; + }; + + if (up_to_down) { + for (auto row : std::views::iota(chunk_begin, n_qubits)) { + auto const chunk = make_chunk(row); + if (chunk.count() == 0) continue; + + if (visited_chunks.contains(chunk)) { + // synthesize the chunk + row_op(tableau, visited_chunks.at(chunk), row, cx_ops); + } else { + visited_chunks.emplace(chunk, row); + } + } + } else { + for (auto row : std::views::iota(0ul, chunk_end) | + std::views::reverse) { + auto const chunk = make_chunk(row); + if (chunk.count() == 0) continue; + if (visited_chunks.contains(chunk)) { + // synthesize the chunk + row_op(tableau, visited_chunks.at(chunk), row, cx_ops); + } else { + visited_chunks.emplace(chunk, row); + } + } + } +} + +void make_main_diag_one(StabilizerTableau& tableau, + size_t col, + CliffordOperatorString& cx_ops, + bool up_to_down) { + if (tableau.stabilizer(col).is_z_set(col)) { + return; + } + auto const n_qubits = tableau.n_qubits(); + if (up_to_down) { + for (auto row : std::views::iota(col + 1, n_qubits)) { + if (tableau.stabilizer(col).is_z_set(row)) { + row_op(tableau, row, col, cx_ops); + break; + } + } + } else { + for (auto row : std::views::iota(0ul, col) | std::views::reverse) { + if (tableau.stabilizer(col).is_z_set(row)) { + row_op(tableau, row, col, cx_ops); + break; + } + } + } +} + +void make_off_diag_zero(StabilizerTableau& tableau, + size_t col, + CliffordOperatorString& cx_ops, + bool up_to_down) { + auto const n_qubits = tableau.n_qubits(); + if (up_to_down) { + for (auto row : std::views::iota(col + 1, n_qubits)) { + if (tableau.stabilizer(col).is_z_set(row)) { + row_op(tableau, col, row, cx_ops); + } + } + } else { + for (auto row : std::views::iota(0ul, col) | std::views::reverse) { + if (tableau.stabilizer(col).is_z_set(row)) { + row_op(tableau, col, row, cx_ops); + } + } + } +} + +void eliminate_remaining(StabilizerTableau& tableau, + size_t chunk_begin, + size_t chunk_end, + CliffordOperatorString& cx_ops, + bool up_to_down) { + auto const n_qubits = tableau.n_qubits(); + + // perform Gaussian elimination in the chunk + if (up_to_down) { + for (auto col : std::views::iota(chunk_begin, chunk_end)) { + make_main_diag_one(tableau, col, cx_ops, up_to_down); + make_off_diag_zero(tableau, col, cx_ops, up_to_down); + } + } else { + for (auto col : std::views::iota(chunk_begin, chunk_end) | + std::views::reverse) { + make_main_diag_one(tableau, col, cx_ops, up_to_down); + make_off_diag_zero(tableau, col, cx_ops, up_to_down); + } + } +} + +} // namespace +/** + * @brief Synthesize the CX circuit using the Patel-Maslov-Hayes method. + * This method produces asymptotically optimal CX circuits. + * + * @param tableau The tableau to synthesize. Assumes the tableau is a + * pure CX circuit. If not, the behavior is undefined. + * @param chunk_size The size of the chunk to use for the synthesis. + * If not provided, the default chunk size is used. + * @return CliffordOperatorString + */ +CliffordOperatorString +synthesize_cx_pmh(StabilizerTableau tableau, + std::optional chunk_size) { + // if chunk_size is not provided, use the default chunk size + DVLAB_ASSERT( + chunk_size != 0, + "Chunk size must be greater than 0"); + + auto const n_qubits = tableau.n_qubits(); + if (!chunk_size) { + chunk_size = std::round( + 0.5 * std::log2(static_cast(n_qubits))); + if (*chunk_size == 0) { + *chunk_size = 1; + } + } + + auto const n_chunks = + std::ceil(static_cast(n_qubits) / + static_cast(*chunk_size)); + + CliffordOperatorString cx_ops; + + // eliminate lower triangular part + for (auto chunk_idx : std::views::iota(0ul, n_chunks)) { + auto const chunk_begin = + chunk_idx * *chunk_size; + auto const chunk_end = + std::min(chunk_begin + *chunk_size, n_qubits); + if (chunk_size > 1) { + eliminate_chunk(tableau, chunk_begin, chunk_end, cx_ops, true); + } + eliminate_remaining(tableau, chunk_begin, chunk_end, cx_ops, true); + } + + for (auto chunk_idx : std::views::iota(0ul, n_chunks) | + std::views::reverse) { + auto const chunk_begin = + chunk_idx * *chunk_size; + auto const chunk_end = + std::min(chunk_begin + *chunk_size, n_qubits); + if (chunk_size > 1) { + eliminate_chunk(tableau, chunk_begin, chunk_end, cx_ops, false); + } + eliminate_remaining(tableau, chunk_begin, chunk_end, cx_ops, false); + } + + return adjoint(cx_ops); +} + +/** + * @brief Synthesize a CX circuit using the Gaussian elimination method. + * + * @param tableau + * @return CliffordOperatorString + */ +CliffordOperatorString +synthesize_cx_gaussian(StabilizerTableau const& tableau) { + CliffordOperatorString cx_ops; + + auto copy = tableau; + + auto const n_qubits = tableau.n_qubits(); + + // eliminate lower triangular part + for (auto i : std::views::iota(0ul, n_qubits)) { + eliminate_remaining(copy, i, i + 1, cx_ops, true); + } + + for (auto i : std::views::iota(0ul, n_qubits) | + std::views::reverse) { + eliminate_remaining(copy, i, i + 1, cx_ops, false); + } + + return adjoint(cx_ops); +} + +/** + * @brief Synthesize a CX circuit using the PMH method with + * an exhaustive search on the chunk size. + * + * @param tableau + * @return CliffordOperatorString + */ +CliffordOperatorString +synthesize_cx_pmh_exhaustive(StabilizerTableau const& tableau) { + auto curr_best_cxs = CliffordOperatorString{}; + auto best_cx_count = std::numeric_limits::max(); + auto chunk_size = SIZE_MAX; + for (auto i : std::views::iota(1ul, tableau.n_qubits() + 1)) { + auto cxs = synthesize_cx_pmh(tableau, i); + if (cxs.size() < best_cx_count) { + curr_best_cxs = std::move(cxs); + best_cx_count = cxs.size(); + chunk_size = i; + } + } + return curr_best_cxs; +} + +namespace { +CliffordOperatorString +resynthesize_cxs(size_t n_qubits, CliffordOperatorString const& cxs) { + auto tableau = StabilizerTableau(n_qubits); + for (auto const& cx : cxs) { + tableau.apply(cx); + } + return synthesize_cx_gaussian(tableau); +} + +std::pair> +find_upper_and_diag(StabilizerTableau tableau) { + auto const n_qubits = tableau.n_qubits(); + + // upper triangular matrix accessor + auto const u = [&](size_t row, size_t col) { + return tableau.stabilizer(col).is_z_set(row); + }; + + // symmetric matrix accessor + auto const s = [&](size_t row, size_t col) { + return tableau.destabilizer(col).is_z_set(row); + }; + + for (auto a : std::views::iota(0ul, n_qubits) | std::views::reverse) { + for (auto b : std::views::iota(a + 1, n_qubits) | std::views::reverse) { + bool sum = 0; + for (auto c : std::views::iota(b + 1, n_qubits)) { + sum ^= u(a, c) & u(b, c); + } + // we don't bother setting destab_x because + // gaussian elimination only use stab_z + tableau.stabilizer(b).set_z(a, sum ^ s(a, b)); + } + } + + auto diag_idx = std::vector{}; + for (auto i : std::views::iota(0ul, n_qubits)) { + bool row_sum = 0; + for (auto j : std::views::iota(0ul, n_qubits)) { + row_sum ^= u(i, j); + } + row_sum ^= s(i, i); + if (row_sum) { + diag_idx.push_back(i); + } + } + + auto const upper = synthesize_cx_gaussian(tableau); + + return {upper, diag_idx}; +} + +} // namespace + +/** + * @brief Synthesize a H-free circuit using the Maslov-Roetteler method. + * + * @param tableau + * @return CliffordOperatorString + */ +CliffordOperatorString +synthesize_h_free_mr(StabilizerTableau tableau) { + auto ops = synthesize_cx_gaussian(tableau); + + // cancel out these CXs + for (auto const& cx : ops | std::views::reverse) { + tableau.apply(cx); + } + + // if the circuit is Hadamard-free, the tableau should be in the form of + // [I B] + // [0 I] + // where B is a symmetric matrix. + + // at this point, if the tableau is identity, we can return right away + if (tableau.is_identity()) { + return ops; + } + + adjoint_inplace(ops); + + // else, we will decompose B = U (U^T) + D, where U is upper triangular + // and D is diagonal. + // This allows us to decompose the tableau into + // [U O ] [I I] [U^-1 O ] [I D] + // [O (U^T)^-1] [O I] [O U^T] [O I] + // first, we need to find the upper triangular matrix U + + auto [upper, diag_idx] = find_upper_and_diag(tableau); + auto const n_qubits = tableau.n_qubits(); + + // reduce the tableau until only Pauli gates are left + + // cancel [U O ] + // [O (U^T)^-1] + for (auto const& cx : upper | std::views::reverse) { + add_cx(tableau, cx.second[0], cx.second[1], ops); + } + + ops = resynthesize_cxs(n_qubits, ops); + + // cancel [I I] + // [O I] + for (auto i : std::views::iota(0ul, n_qubits)) { + add_s(tableau, i, ops); + } + + // cancel [U^-1 O ] + // [O U^T] + for (auto const& cx : upper) { + add_cx(tableau, cx.second[0], cx.second[1], ops); + } + + // cancel [I D] + // [O I] + for (auto const& idx : diag_idx) { + add_s(tableau, idx, ops); + } + + handle_negatives(tableau, ops); + + return adjoint(ops); +} + +} // namespace qsyn::tableau diff --git a/src/tableau/stabilizer_tableau.hpp b/src/tableau/stabilizer_tableau.hpp index 524e7315f..2114ad9f4 100644 --- a/src/tableau/stabilizer_tableau.hpp +++ b/src/tableau/stabilizer_tableau.hpp @@ -17,11 +17,12 @@ namespace qsyn { -namespace experimental { +namespace tableau { class StabilizerTableau : public PauliProductTrait { public: - StabilizerTableau(size_t n_qubits) : _stabilizers(2 * n_qubits, PauliProduct(std::string(n_qubits, 'I'))) { + StabilizerTableau(size_t n_qubits) + : _stabilizers(2 * n_qubits, PauliProduct(std::string(n_qubits, 'I'))) { for (size_t i = 0; i < n_qubits; ++i) { _stabilizers[stabilizer_idx(i)].set_pauli_type(i, Pauli::z); _stabilizers[destabilizer_idx(i)].set_pauli_type(i, Pauli::x); @@ -42,6 +43,9 @@ class StabilizerTableau : public PauliProductTrait { StabilizerTableau& h(size_t qubit) noexcept override; StabilizerTableau& s(size_t qubit) noexcept override; StabilizerTableau& cx(size_t ctrl, size_t targ) noexcept override; + StabilizerTableau& sdg(size_t qubit) noexcept; + StabilizerTableau& v(size_t qubit) noexcept; + StabilizerTableau& vdg(size_t qubit) noexcept; // prepend operations // these operations are specific to the stabilizer tableau @@ -64,6 +68,7 @@ class StabilizerTableau : public PauliProductTrait { StabilizerTableau& prepend(CliffordOperator const& op); StabilizerTableau& prepend(CliffordOperatorString const& ops); + StabilizerTableau& prepend(StabilizerTableau const& tableau); std::string to_string() const; std::string to_bit_string() const; @@ -91,7 +96,11 @@ class StabilizerTableau : public PauliProductTrait { bool is_identity() const { return *this == StabilizerTableau{n_qubits()}; } bool is_commutative(PauliProduct const& rhs) const { - return std::ranges::all_of(_stabilizers | std::views::take(n_qubits()), [&rhs](PauliProduct const& stabilizer) { return stabilizer.is_commutative(rhs); }); + return std::ranges::all_of( + _stabilizers | std::views::take(n_qubits()), + [&rhs](PauliProduct const& stabilizer) { + return stabilizer.is_commutative(rhs); + }); } private: @@ -100,11 +109,14 @@ class StabilizerTableau : public PauliProductTrait { [[nodiscard]] StabilizerTableau adjoint(StabilizerTableau const& tableau); -inline void adjoint_inplace(StabilizerTableau& tableau) { tableau = adjoint(tableau); } +inline void adjoint_inplace(StabilizerTableau& tableau) { + tableau = adjoint(tableau); +} class StabilizerTableauSynthesisStrategy { public: - virtual ~StabilizerTableauSynthesisStrategy() = default; + virtual ~StabilizerTableauSynthesisStrategy() = default; + virtual CliffordOperatorString synthesize(StabilizerTableau copy) const = 0; }; @@ -116,15 +128,34 @@ class StabilizerTableauSynthesisStrategy { */ class AGSynthesisStrategy : public StabilizerTableauSynthesisStrategy { public: + enum class Mode { ag, + ag_plus } mode; + AGSynthesisStrategy(Mode mode = Mode::ag) : mode{mode} {} CliffordOperatorString synthesize(StabilizerTableau copy) const override; }; +CliffordOperatorString +synthesize_cx_pmh(StabilizerTableau tableau, + std::optional chunk_size = std::nullopt); + +CliffordOperatorString +synthesize_cx_pmh_exhaustive(StabilizerTableau const& tableau); + +CliffordOperatorString +synthesize_cx_gaussian(StabilizerTableau const& tableau); + +CliffordOperatorString +synthesize_h_free_mr(StabilizerTableau tableau); + /** * @brief An extractor based on the paper - * [Optimal Hadamard gate count for Clifford$+T$ synthesis of Pauli rotations sequences](https://arxiv.org/abs/2302.07040) + * [Optimal Hadamard gate count for Clifford$+T$ synthesis of + * Pauli rotations sequences](https://arxiv.org/abs/2302.07040) * by Vandaele, Martiel, Perdrix, and Vuillot. - * This method is guaranteed to produce the optimal number of Hadamard gates by first diagonalizing the stabilizers with - * provably optimal number of Hadamard gates and then applying the Aaronson-Gottesman method to the rest of the tableau. + * This method is guaranteed to produce the optimal number of Hadamard + * gates by first diagonalizing the stabilizers with provably optimal + * number of Hadamard gates and then applying the Aaronson-Gottesman + * method to the rest of the tableau. * */ class HOptSynthesisStrategy : public StabilizerTableauSynthesisStrategy { @@ -132,30 +163,38 @@ class HOptSynthesisStrategy : public StabilizerTableauSynthesisStrategy { enum class Mode { star, staircase } mode; HOptSynthesisStrategy(Mode mode = Mode::star) : mode{mode} {} - CliffordOperatorString synthesize(StabilizerTableau copy) const override; + CliffordOperatorString + partial_synthesize(StabilizerTableau& clifford) const; + CliffordOperatorString + synthesize(StabilizerTableau copy) const override; }; CliffordOperatorString extract_clifford_operators( StabilizerTableau copy, - StabilizerTableauSynthesisStrategy const& strategy = HOptSynthesisStrategy{}); + StabilizerTableauSynthesisStrategy const& strategy = + HOptSynthesisStrategy{}); -} // namespace experimental +} // namespace tableau } // namespace qsyn template <> -struct fmt::formatter { +struct fmt::formatter { char presentation = 'c'; constexpr auto parse(format_parse_context& ctx) { auto it = ctx.begin(), end = ctx.end(); - if (it != end && (*it == 'c' || *it == 'b')) presentation = *it++; - if (it != end && *it != '}') detail::throw_format_error("invalid format"); + if (it != end && (*it == 'c' || *it == 'b')) + presentation = *it++; + if (it != end && *it != '}') + detail::throw_format_error("invalid format"); return it; } template - auto format(qsyn::experimental::StabilizerTableau const& tableau, FormatContext& ctx) const { - return presentation == 'c' ? format_to(ctx.out(), "{}", tableau.to_string()) - : format_to(ctx.out(), "{}", tableau.to_bit_string()); + auto format(qsyn::tableau::StabilizerTableau const& tableau, + FormatContext& ctx) const { + return presentation == 'c' + ? format_to(ctx.out(), "{}", tableau.to_string()) + : format_to(ctx.out(), "{}", tableau.to_bit_string()); } }; diff --git a/src/tableau/tableau.cpp b/src/tableau/tableau.cpp index 6728548f1..3ed7777ab 100644 --- a/src/tableau/tableau.cpp +++ b/src/tableau/tableau.cpp @@ -10,7 +10,7 @@ #include -namespace qsyn::experimental { +namespace qsyn::tableau { Tableau& Tableau::h(size_t qubit) noexcept { for (auto& subtableau : _subtableaux | std::views::reverse) { @@ -87,4 +87,4 @@ Tableau adjoint(Tableau const& tableau) { return adjoint_tableau; } -} // namespace qsyn::experimental +} // namespace qsyn::tableau diff --git a/src/tableau/tableau.hpp b/src/tableau/tableau.hpp index 2d11ccb07..8d1540bb5 100644 --- a/src/tableau/tableau.hpp +++ b/src/tableau/tableau.hpp @@ -15,7 +15,7 @@ namespace qsyn { -namespace experimental { +namespace tableau { using SubTableau = std::variant>; @@ -117,23 +117,6 @@ class Tableau : public PauliProductTrait { return _subtableaux[idx]; } - auto get_filename() const { - return _filename; - } - auto set_filename(std::string const& filename) { - _filename = filename; - } - - auto get_procedures() const { - return _procedures; - } - auto add_procedure(std::string const& procedure) { - _procedures.push_back(procedure); - } - auto add_procedures(std::vector const& procedures) { - _procedures.insert(_procedures.end(), procedures.begin(), procedures.end()); - } - Tableau& h(size_t qubit) noexcept override; Tableau& s(size_t qubit) noexcept override; Tableau& cx(size_t control, size_t target) noexcept override; @@ -141,8 +124,6 @@ class Tableau : public PauliProductTrait { private: std::vector _subtableaux; std::size_t _n_qubits; - std::string _filename; - std::vector _procedures; }; void adjoint_inplace(SubTableau& subtableau); @@ -151,11 +132,11 @@ void adjoint_inplace(SubTableau& subtableau); void adjoint_inplace(Tableau& tableau); [[nodiscard]] Tableau adjoint(Tableau const& tableau); -} // namespace experimental +} // namespace tableau } // namespace qsyn template <> -struct fmt::formatter { +struct fmt::formatter { char presentation = 'c'; constexpr auto parse(format_parse_context& ctx) { auto it = ctx.begin(), end = ctx.end(); @@ -165,15 +146,15 @@ struct fmt::formatter { } template - auto format(qsyn::experimental::SubTableau const& subtableau, FormatContext& ctx) const -> format_context::iterator { + auto format(qsyn::tableau::SubTableau const& subtableau, FormatContext& ctx) const -> format_context::iterator { // NOTE - cannot use run-time formatting to choose between 'c' and 'b' // because the format function may be called in compile-time return std::visit( dvlab::overloaded( - [&](qsyn::experimental::StabilizerTableau const& st) -> format_context::iterator { + [&](qsyn::tableau::StabilizerTableau const& st) -> format_context::iterator { return fmt::format_to(ctx.out(), "Clifford:\n{}\n", presentation == 'c' ? st.to_string() : st.to_bit_string()); }, - [&](std::vector const& pr) -> format_context::iterator { + [&](std::vector const& pr) -> format_context::iterator { if (presentation == 'c') return fmt::format_to(ctx.out(), "Pauli Rotations:\n{:c}\n", fmt::join(pr, "\n")); else @@ -184,7 +165,7 @@ struct fmt::formatter { }; template <> -struct fmt::formatter { +struct fmt::formatter { char presentation = 'c'; constexpr auto parse(format_parse_context& ctx) { auto it = ctx.begin(), end = ctx.end(); @@ -194,7 +175,7 @@ struct fmt::formatter { } template - auto format(qsyn::experimental::Tableau const& tableau, FormatContext& ctx) const { + auto format(qsyn::tableau::Tableau const& tableau, FormatContext& ctx) const { return presentation == 'c' ? fmt::format_to(ctx.out(), "{:c}", fmt::join(tableau, "\n")) : fmt::format_to(ctx.out(), "{:b}", fmt::join(tableau, "\n")); diff --git a/src/tableau/tableau_optimization.cpp b/src/tableau/tableau_optimization.cpp index 864736af5..e818502c8 100644 --- a/src/tableau/tableau_optimization.cpp +++ b/src/tableau/tableau_optimization.cpp @@ -23,7 +23,7 @@ namespace qsyn { -namespace experimental { +namespace tableau { /** * @brief Perform the best-known optimization routine on the tableau. The strategy may change in the future. @@ -526,6 +526,6 @@ MatroidPartitionStrategy::Partitions NaiveMatroidPartitionStrategy::partition(Ma return matroids; } -} // namespace experimental +} // namespace tableau } // namespace qsyn diff --git a/src/tableau/tableau_optimization.hpp b/src/tableau/tableau_optimization.hpp index da5863722..dfb500770 100644 --- a/src/tableau/tableau_optimization.hpp +++ b/src/tableau/tableau_optimization.hpp @@ -12,7 +12,7 @@ namespace qsyn { -namespace experimental { +namespace tableau { void full_optimize(Tableau& tableau); @@ -74,6 +74,6 @@ inline bool is_phase_polynomial(std::vector const& polynomial) no std::optional>> matroid_partition(std::vector const& polynomial, MatroidPartitionStrategy const& strategy, size_t num_ancillae = 0); std::optional matroid_partition(Tableau const& tableau, MatroidPartitionStrategy const& strategy, size_t num_ancillae = 0); -} // namespace experimental +} // namespace tableau } // namespace qsyn diff --git a/src/tensor/qtensor.hpp b/src/tensor/qtensor.hpp index e044003af..42c3c8c4b 100644 --- a/src/tensor/qtensor.hpp +++ b/src/tensor/qtensor.hpp @@ -88,13 +88,6 @@ class QTensor : public Tensor> { template friend bool is_equivalent(QTensor const& t1, QTensor const& t2, U eps /* = 1e-6*/); - void set_filename(std::string const& f) { _filename = f; } - void add_procedures(std::vector const& ps) { _procedures.insert(_procedures.end(), ps.begin(), ps.end()); } - void add_procedure(std::string_view p) { _procedures.emplace_back(p); } - - std::string get_filename() const { return _filename; } - std::vector const& get_procedures() const { return _procedures; } - QTensor to_matrix(); QTensor to_matrix(TensorAxisList const& out, TensorAxisList const& in) { return Tensor>::to_matrix(out, in); } diff --git a/src/util/data_structure_manager.hpp b/src/util/data_structure_manager.hpp index 66f083c21..b7ca5ac8d 100644 --- a/src/util/data_structure_manager.hpp +++ b/src/util/data_structure_manager.hpp @@ -9,37 +9,75 @@ #include #include +#include #include #include - -#include "./ordered_hashmap.hpp" +#include namespace dvlab { namespace utils { +// Forward declaration of DataStructureManager (without requires clause for now) template -std::string data_structure_info_string(T const& t); +class DataStructureManager; +// Forward declarations for function templates template -std::string data_structure_name(T const& t); +std::string data_structure_info_string(DataStructureManager const& mgr, size_t id); template -concept manager_manageable = requires { - { data_structure_info_string(std::declval()) } -> std::convertible_to; - { data_structure_name(std::declval()) } -> std::convertible_to; +std::string data_structure_name(DataStructureManager const& mgr, size_t id); + +template +struct ManagerItemAndAttrs { // NOLINT(cppcoreguidelines-special-member-functions) + // : copy-swap idiom + std::unique_ptr data; + std::string filename; + std::vector procedures; + + ManagerItemAndAttrs() : data{nullptr} {} + + ManagerItemAndAttrs(std::unique_ptr d) + : data{std::move(d)} {} + + ManagerItemAndAttrs(std::unique_ptr d, std::string f, std::vector p) + : data{std::move(d)}, filename{std::move(f)}, procedures{std::move(p)} {} + + ManagerItemAndAttrs(ManagerItemAndAttrs const& other) + : data{other.data ? std::make_unique(*other.data) : nullptr}, + filename{other.filename}, + procedures{other.procedures} {} + + ManagerItemAndAttrs(ManagerItemAndAttrs&& other) noexcept = default; + + ~ManagerItemAndAttrs() = default; + + ManagerItemAndAttrs& operator=(ManagerItemAndAttrs copy) { + swap(copy); + return *this; + } + + void swap(ManagerItemAndAttrs& other) noexcept { + std::swap(data, other.data); + std::swap(filename, other.filename); + std::swap(procedures, other.procedures); + } + + friend void swap(ManagerItemAndAttrs& a, ManagerItemAndAttrs& b) noexcept { + a.swap(b); + } }; template -requires manager_manageable class DataStructureManager { // NOLINT(hicpp-special-member-functions, cppcoreguidelines-special-member-functions) : copy-swap idiom public: DataStructureManager(std::string_view name) : _type_name{name} {} virtual ~DataStructureManager() = default; DataStructureManager(DataStructureManager const& other) : _next_id{other._next_id}, _focused_id{other._focused_id} { - for (auto& [id, data] : other._list) { - _list.emplace(id, std::make_unique(*data)); + for (auto& [id, item] : other._list) { + _list.emplace(id, item); } } DataStructureManager(DataStructureManager&& other) noexcept = default; @@ -69,13 +107,18 @@ class DataStructureManager { // NOLINT(hicpp-special-member-functions, cppcoreg size_t get_next_id() const { return _next_id; } - T* get() const { return size() ? _list.at(_focused_id).get() : nullptr; } + T* get() const { return size() ? _list.at(_focused_id).data.get() : nullptr; } void set_by_id(size_t id, std::unique_ptr t) { if (_list.contains(id)) { spdlog::info("Note: Replacing {} {}...", _type_name, id); + // Preserve filename and procedures when replacing + auto filename = _list.at(id).filename; + auto procedures = _list.at(id).procedures; + _list.insert_or_assign(id, ManagerItemAndAttrs{std::move(t), std::move(filename), std::move(procedures)}); + } else { + _list.insert_or_assign(id, ManagerItemAndAttrs{std::move(t)}); } - _list.insert_or_assign(id, std::move(t)); } void set(std::unique_ptr t) { @@ -87,7 +130,7 @@ class DataStructureManager { // NOLINT(hicpp-special-member-functions, cppcoreg size_t focused_id() const { return _focused_id; } T* add(size_t id) { - _list.emplace(id, std::make_unique()); + _list.emplace(id, ManagerItemAndAttrs{std::make_unique()}); _focused_id = id; if (id == _next_id || _next_id < id) _next_id = id + 1; @@ -97,7 +140,7 @@ class DataStructureManager { // NOLINT(hicpp-special-member-functions, cppcoreg } T* add(size_t id, std::unique_ptr t) { - _list.emplace(id, std::move(t)); + _list.emplace(id, ManagerItemAndAttrs{std::move(t)}); _focused_id = id; if (id == _next_id || _next_id < id) _next_id = id + 1; @@ -140,10 +183,12 @@ class DataStructureManager { // NOLINT(hicpp-special-member-functions, cppcoreg spdlog::error("Cannot copy {0}: The {0} list is empty!!", _type_name); return; } - auto copy = std::make_unique(*get()); + auto const& source_item = _list.at(_focused_id); + auto copy_data = std::make_unique(*source_item.data); + ManagerItemAndAttrs copy_item{std::move(copy_data), source_item.filename, source_item.procedures}; if (_next_id <= new_id) _next_id = new_id + 1; - _list.insert_or_assign(new_id, std::move(copy)); + _list.insert_or_assign(new_id, std::move(copy_item)); spdlog::info("Successfully copied {0} {1} to {0} {2}", _type_name, _focused_id, new_id); checkout(new_id); @@ -154,21 +199,21 @@ class DataStructureManager { // NOLINT(hicpp-special-member-functions, cppcoreg _print_id_does_not_exist_error_msg(); return nullptr; } - return _list.at(id).get(); + return _list.at(id).data.get(); } void print_manager() const { fmt::println("-> #{}: {}", _type_name, this->size()); if (this->size()) { - auto name = data_structure_name(*get()); + auto name = data_structure_name(*this, _focused_id); fmt::println("-> Now focused on: {} {}{}", _type_name, _focused_id, name.empty() ? "" : fmt::format(" ({})", name)); } } void print_list() const { if (this->size()) { - for (auto& [id, data] : _list) { - fmt::println("{} {} {}", (id == _focused_id ? "★" : " "), id, data_structure_info_string(*data.get())); + for (auto& [id, item] : _list) { + fmt::println("{} {} {}", (id == _focused_id ? "★" : " "), id, data_structure_info_string(*this, id)); } } else { fmt::println("The {} list is empty", _type_name); @@ -177,7 +222,7 @@ class DataStructureManager { // NOLINT(hicpp-special-member-functions, cppcoreg void print_focus() const { if (this->size()) { - auto name = data_structure_name(*get()); + auto name = data_structure_name(*this, _focused_id); fmt::println("-> Now focused on: {} {}{}", _type_name, _focused_id, name.empty() ? "" : fmt::format(" ({})", name)); } else { fmt::println("The {} list is empty", _type_name); @@ -186,10 +231,97 @@ class DataStructureManager { // NOLINT(hicpp-special-member-functions, cppcoreg std::string get_type_name() const { return _type_name; } + // Filename access methods + std::string get_filename(size_t id) const { + if (!is_id(id)) { + _print_id_does_not_exist_error_msg(); + return {}; + } + return _list.at(id).filename; + } + + std::string get_filename() const { + return size() ? get_filename(_focused_id) : std::string{}; + } + + void set_filename(size_t id, std::string const& filename) { + if (!is_id(id)) { + _print_id_does_not_exist_error_msg(); + return; + } + _list.at(id).filename = filename; + } + + void set_filename(std::string const& filename) { + if (size()) { + set_filename(_focused_id, filename); + } + } + + // Procedures access methods + std::vector const& get_procedures(size_t id) const { + if (!is_id(id)) { + _print_id_does_not_exist_error_msg(); + static std::vector const empty; + return empty; + } + return _list.at(id).procedures; + } + + std::vector const& get_procedures() const { + if (size()) { + return get_procedures(_focused_id); + } + static std::vector const empty; + return empty; + } + + void add_procedure(size_t id, std::string procedure) { + if (!is_id(id)) { + _print_id_does_not_exist_error_msg(); + return; + } + _list.at(id).procedures.push_back(std::move(procedure)); + } + + void add_procedure(std::string procedure) { + if (size()) { + add_procedure(_focused_id, std::move(procedure)); + } + } + + void add_procedures(size_t id, std::vector const& procedures) { + if (!is_id(id)) { + _print_id_does_not_exist_error_msg(); + return; + } + _list.at(id).procedures.insert(_list.at(id).procedures.end(), procedures.begin(), procedures.end()); + } + + void add_procedures(std::vector const& procedures) { + if (size()) { + add_procedures(_focused_id, procedures); + } + } + + void set_procedures(size_t id, std::vector const& procedures) { + if (!is_id(id)) { + _print_id_does_not_exist_error_msg(); + return; + } + _list.at(id).procedures = procedures; + } + + void set_procedures(std::vector const& procedures) { + if (size()) { + set_procedures(_focused_id, procedures); + } + } + private: size_t _next_id = 0; size_t _focused_id = 0; - ordered_hashmap> _list; + std::map> _list; std::string _type_name; void _print_id_does_not_exist_error_msg() const { @@ -197,6 +329,13 @@ class DataStructureManager { // NOLINT(hicpp-special-member-functions, cppcoreg } }; +// Concept definition - must come after DataStructureManager is defined +template +concept manager_manageable = requires { + { data_structure_info_string(std::declval const&>(), std::declval()) } -> std::convertible_to; + { data_structure_name(std::declval const&>(), std::declval()) } -> std::convertible_to; +}; + } // namespace utils } // namespace dvlab diff --git a/src/util/graph/dag_peeler.hpp b/src/util/graph/dag_peeler.hpp new file mode 100644 index 000000000..a97f6062f --- /dev/null +++ b/src/util/graph/dag_peeler.hpp @@ -0,0 +1,228 @@ +#pragma once + +#include +#include +#include +#include + +namespace dvlab { + +/** + * @brief High-performance DAG peeler optimized for repeated layer extraction and vertex removal + * + * Uses vector-based adjacency lists with lazy deletion for maximum performance. + * Maintain queues of degree-0 vertices for O(1) layer access + */ +class DagPeeler { +public: + using Vertex = std::size_t; + static constexpr Vertex npos = static_cast(-1); + + /** + * @brief Construct a DagPeeler with n vertices + * @param n Number of vertices (vertices are 0, 1, ..., n-1) + */ + explicit DagPeeler(std::size_t n) + : _n(n), + out_adj(n), + in_adj(n), + in_deg(n, 0), + out_deg(n, 0), + alive(n, true), + _alive_cnt(n) {} + + /** + * @brief Add an edge from u to v (build phase) + * Call this during graph construction, before finalize() + */ + void add_edge(Vertex u, Vertex v) { + assert(u < _n && v < _n); + out_adj[u].push_back(v); + ++out_deg[u]; + ++in_deg[v]; + } + + /** + * @brief Finalize the graph after all edges are added + * Builds in_adj and initializes queues + */ + void finalize() { + // Build in_adj in one scan + for (Vertex u = 0; u < _n; ++u) { + for (Vertex v : out_adj[u]) { + in_adj[v].push_back(u); + } + } + + // Initialize queues with degree-0 vertices + for (Vertex v = 0; v < _n; ++v) { + if (!alive[v]) continue; + if (in_deg[v] == 0) first_q.push_back(v); + if (out_deg[v] == 0) last_q.push_back(v); + } + } + + /** + * @brief Check if the graph is empty (all vertices removed) + */ + bool empty() const { return _alive_cnt == 0; } + + /** + * @brief Check if a vertex is still alive + */ + bool is_alive(Vertex v) const { + if (v >= _n) return false; + return alive[v]; + } + + /** + * @brief Get in-degree of a vertex + */ + std::size_t in_degree(Vertex v) const { + if (v >= _n) return 0; + return in_deg[v]; + } + + /** + * @brief Get out-degree of a vertex + */ + std::size_t out_degree(Vertex v) const { + if (v >= _n) return 0; + return out_deg[v]; + } + + /** + * @brief Get one vertex from first layer (in_deg == 0) + * Uses lazy evaluation: skips dead vertices or vertices with non-zero degree + * @return Vertex ID or npos if no vertex available + */ + Vertex pop_first() { + while (!first_q.empty()) { + Vertex v = first_q.front(); + first_q.pop_front(); + if (alive[v] && in_deg[v] == 0) { + return v; + } + } + return npos; + } + + /** + * @brief Get one vertex from last layer (out_deg == 0) + * Uses lazy evaluation: skips dead vertices or vertices with non-zero degree + * @return Vertex ID or npos if no vertex available + */ + Vertex pop_last() { + while (!last_q.empty()) { + Vertex v = last_q.front(); + last_q.pop_front(); + if (alive[v] && out_deg[v] == 0) { + return v; + } + } + return npos; + } + + /** + * @brief Get all vertices in first layer (in_deg == 0) + * @return Vector of alive vertices with in_deg == 0 + */ + std::vector get_first_layer() const { + std::vector result; + result.reserve(_n); + for (Vertex v = 0; v < _n; ++v) { + if (alive[v] && in_deg[v] == 0) { + result.push_back(v); + } + } + return result; + } + + /**f + * @brief Get all vertices in last layer (out_deg == 0) + * @return Vector of alive vertices with out_deg == 0 + */ + std::vector get_last_layer() const { + std::vector result; + result.reserve(_n); + for (Vertex v = 0; v < _n; ++v) { + if (alive[v] && out_deg[v] == 0) { + result.push_back(v); + } + } + return result; + } + + /** + * @brief Erase a vertex (lazy deletion) + * Updates degrees of neighbors and adds newly degree-0 vertices to queues + * @param v Vertex to erase + */ + void erase(Vertex v) { + if (v == npos) return; + if (v >= _n) return; + if (!alive[v]) return; + + alive[v] = false; + --_alive_cnt; + + // Removing v deletes all incoming edges u->v: decrease out_deg[u] + for (Vertex u : in_adj[v]) { + if (!alive[u]) continue; + if (out_deg[u] == 0) continue; // already processed + --out_deg[u]; + if (out_deg[u] == 0) { + last_q.push_back(u); + } + } + + // Removing v deletes all outgoing edges v->w: decrease in_deg[w] + for (Vertex w : out_adj[v]) { + if (!alive[w]) continue; + if (in_deg[w] == 0) continue; // already processed + --in_deg[w]; + if (in_deg[w] == 0) { + first_q.push_back(w); + } + } + + // Clear degrees for tidiness + in_deg[v] = 0; + out_deg[v] = 0; + } + + /** + * @brief Get the number of vertices (total, including dead ones) + */ + std::size_t num_vertices() const { return _n; } + + /** + * @brief Get the number of alive vertices + */ + std::size_t num_alive() const { return _alive_cnt; } + + /** + * @brief Get the number of edges (approximate, may include edges to dead vertices) + */ + std::size_t num_edges() const { + std::size_t count = 0; + for (auto const& adj : out_adj) { + count += adj.size(); + } + return count; + } + +private: + std::size_t _n; + std::vector> out_adj; // Outgoing adjacency list + std::vector> in_adj; // Incoming adjacency list + std::vector in_deg; // In-degree for each vertex + std::vector out_deg; // Out-degree for each vertex + std::vector alive; // Whether vertex is still alive + std::size_t _alive_cnt; // Number of alive vertices + + std::deque first_q; // Queue of vertices with in_deg == 0 + std::deque last_q; // Queue of vertices with out_deg == 0 +}; + +} // namespace dvlab diff --git a/src/util/graph/digraph.hpp b/src/util/graph/digraph.hpp index 33ca2b8f1..9102e2a0c 100644 --- a/src/util/graph/digraph.hpp +++ b/src/util/graph/digraph.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "util/ordered_hashmap.hpp" #include "util/ordered_hashset.hpp" @@ -97,41 +98,54 @@ class Digraph { size_t remove_vertex(Vertex v) { auto n = _vertex_attributes.erase(v); // remove all edges connected to v - for (auto dst : _out_neighbors[v]) { - _in_neighbors[dst].erase(v); - if constexpr (has_edge_attr) { - _edge_attributes.erase(Edge{v, dst}); - } else { - --_edge_attributes; + auto out_it = _out_neighbors.find(v); + if (out_it != _out_neighbors.end()) { + for (auto dst : out_it->second) { + auto in_it = _in_neighbors.find(dst); + if (in_it != _in_neighbors.end()) { + in_it->second.erase(v); + } + if constexpr (has_edge_attr) { + _edge_attributes.erase(Edge{v, dst}); + } else { + --_edge_attributes; + } } + _out_neighbors.erase(out_it); } - for (auto src : _in_neighbors[v]) { - _out_neighbors[src].erase(v); - if constexpr (has_edge_attr) { - _edge_attributes.erase(Edge{src, v}); - } else { - --_edge_attributes; + + auto in_it = _in_neighbors.find(v); + if (in_it != _in_neighbors.end()) { + for (auto src : in_it->second) { + auto out_it2 = _out_neighbors.find(src); + if (out_it2 != _out_neighbors.end()) { + out_it2->second.erase(v); + } + if constexpr (has_edge_attr) { + _edge_attributes.erase(Edge{src, v}); + } else { + --_edge_attributes; + } } + _in_neighbors.erase(in_it); } - _out_neighbors.erase(v); - _in_neighbors.erase(v); - return n; } std::enable_if_t add_edge(Vertex src, Vertex dst) { - Edge e = {src, dst}; + _out_neighbors[src].insert(dst); + _in_neighbors[dst].insert(src); if constexpr (has_edge_attr) { + Edge e = {src, dst}; _edge_attributes[e] = EdgeAttr{}; + return e; } else { ++_edge_attributes; + return Edge{src, dst}; } - _out_neighbors[src].insert(dst); - _in_neighbors[dst].insert(src); - return e; } std::enable_if_t @@ -139,22 +153,21 @@ class Digraph { return add_edge(e.src, e.dst); } - std::enable_if_t - add_edge( - Vertex src, - Vertex dst, - EdgeAttr const& attr) { - Edge e = {src, dst}; - _edge_attributes[e] = attr; + // add_edge(src, dst, attr) with attribute + template + auto add_edge(Vertex src, Vertex dst, EA const& attr) + -> std::enable_if_t, Edge> { + Edge e = {src, dst}; _out_neighbors[src].insert(dst); _in_neighbors[dst].insert(src); + _edge_attributes[e] = attr; return e; } - std::enable_if_t - add_edge( - Edge e, - EdgeAttr const& attr) { + // add_edge(Edge e, attr) with attribute + template + auto add_edge(Edge e, EA const& attr) + -> std::enable_if_t, Edge> { return add_edge(e.src, e.dst, attr); } @@ -191,8 +204,6 @@ class Digraph { } } - // TODO: add correct edge range for no-edge-attr case - auto in_edges(Vertex v) const { return _in_neighbors.at(v) | std::views::transform( @@ -261,23 +272,27 @@ class Digraph { return vertex_attr(v); } - std::enable_if_t - edge_attr(Edge e) const { + template + requires(has_edge_attr && !std::is_void_v) + T const& edge_attr(Edge e) const { return _edge_attributes.at(e); } - std::enable_if_t - edge_attr(Edge e) { + template + requires(has_edge_attr && !std::is_void_v) + T& edge_attr(Edge e) { return _edge_attributes.at(e); } - std::enable_if_t - operator[](Edge e) const { + template + requires(has_edge_attr && !std::is_void_v) + T const& operator[](Edge e) const { return edge_attr(e); } - std::enable_if_t - operator[](Edge e) { + template + requires(has_edge_attr && !std::is_void_v) + T& operator[](Edge e) { return edge_attr(e); } @@ -287,12 +302,18 @@ class Digraph { for (auto v : vertices()) { if (!other.has_vertex(v)) return false; - if (vertex_attr(v) != other.vertex_attr(v)) return false; + if constexpr (has_vertex_attr) { + if (vertex_attr(v) != other.vertex_attr(v)) return false; + } } - for (auto e : _edge_attributes | std::views::keys) { - if (!other.has_edge(e)) return false; - if (edge_attr(e) != other.edge_attr(e)) return false; + for (auto const& v : vertices()) { + for (auto const& e : out_edges(v)) { + if (!other.has_edge(e)) return false; + if constexpr (has_edge_attr) { + if (edge_attr(e) != other.edge_attr(e)) return false; + } + } } return true; } @@ -315,9 +336,11 @@ class Digraph { VertexAttributes _vertex_attributes; struct EdgeHash { - std::size_t operator()(Edge const& edge) const { - return std::hash{}(edge.src) ^ - std::hash{}(edge.dst); + std::size_t operator()(Edge const& edge) const noexcept { + std::size_t h1 = std::hash{}(edge.src); + std::size_t h2 = std::hash{}(edge.dst); + h1 ^= h2 + 0x9e3779b97f4a7c15ull + (h1 << 6) + (h1 >> 2); + return h1; } }; diff --git a/src/util/graph/floyd_warshall.hpp b/src/util/graph/floyd_warshall.hpp new file mode 100644 index 000000000..306e33238 --- /dev/null +++ b/src/util/graph/floyd_warshall.hpp @@ -0,0 +1,87 @@ +/**************************************************************************** + PackageName [ util/graph ] + Synopsis [ Generic Floyd-Warshall all-pairs shortest path ] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace dvlab { + +/** + * @brief Result of all-pairs shortest path (Floyd-Warshall). + * Indices i, j correspond to vertices[i] and vertices[j]. + */ +template +struct APSPResult { + std::vector vertices; // vertices[k] is the k-th vertex (sorted) + std::vector> distance; // distance[i][j] = dist(vertices[i], vertices[j]) + std::vector>> predecessor; // predecessor of vertices[j] on path from vertices[i] +}; + +/** + * @brief Generic Floyd-Warshall for any digraph with vertices() and edges(). + * @param graph Digraph (e.g. dvlab::Digraph); must have vertices(), edges(). + * @param cost_fn Callable (Edge e) -> float; use inf for absent or blocked edges. + * @return APSPResult with sorted vertices; distance[i][j] uses infinity for no path. + */ +template +auto floyd_warshall(Graph const& graph, CostFn const& cost_fn) -> APSPResult { + using Vertex = typename Graph::Vertex; + constexpr float inf = std::numeric_limits::infinity(); + + std::vector vertices(graph.vertices().begin(), graph.vertices().end()); + std::ranges::sort(vertices); + + size_t const n = vertices.size(); + std::unordered_map v2i; + for (size_t i = 0; i < n; ++i) { + v2i[vertices[i]] = i; + } + + APSPResult result; + result.vertices = vertices; + result.distance.assign(n, std::vector(n, inf)); + result.predecessor.assign(n, std::vector>(n, std::nullopt)); + + for (size_t i = 0; i < n; ++i) { + result.distance[i][i] = 0.f; + } + + for (auto const& e : graph.edges()) { + auto it_src = v2i.find(e.src); + auto it_dst = v2i.find(e.dst); + if (it_src == v2i.end() || it_dst == v2i.end()) continue; + size_t const i = it_src->second; + size_t const j = it_dst->second; + float const c = cost_fn(e); + result.distance[i][j] = c; + result.predecessor[i][j] = e.src; + } + + for (size_t k = 0; k < n; ++k) { + for (size_t i = 0; i < n; ++i) { + if (std::isinf(result.distance[i][k])) continue; + for (size_t j = 0; j < n; ++j) { + if (std::isinf(result.distance[k][j])) continue; + float const through = result.distance[i][k] + result.distance[k][j]; + if (std::isinf(result.distance[i][j]) || result.distance[i][j] > through) { + result.distance[i][j] = through; + result.predecessor[i][j] = result.predecessor[k][j]; + } + } + } + } + + return result; +} + +} // namespace dvlab diff --git a/src/util/graph/minimum_spanning_arborescence.hpp b/src/util/graph/minimum_spanning_arborescence.hpp index 1cb838cc2..05a03477e 100644 --- a/src/util/graph/minimum_spanning_arborescence.hpp +++ b/src/util/graph/minimum_spanning_arborescence.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include "util/graph/digraph.hpp" @@ -72,6 +73,16 @@ build_min_edge_subgraph( } // namespace detail +/** + * Build a minimum spanning arborescence rooted at 'root'. + * + * Assumption: the input graph is (weakly) connected; otherwise Edmonds' + * algorithm is not well-defined for a single global arborescence. + * + * @param g The graph to build the MST of. + * @param root The root vertex of the MST. + * @return The MST. + */ template requires std::signed_integral || std::floating_point Digraph @@ -180,20 +191,34 @@ minimum_spanning_arborescence( return mst; } +/** + * Build a minimum spanning arborescence of the graph. This function will try + * all possible roots and return the one that minimizes the total weight of the + * MST. + * + * Assumption: the input graph is (weakly) connected; otherwise there is no + * single global arborescence spanning all vertices. + * + * @param g The graph to build the MST of. + * @return The MST and the root vertex. + */ template requires std::signed_integral || std::floating_point std::pair, typename Digraph::Vertex> minimum_spanning_arborescence( Digraph const& g) { - using DigraphT = Digraph; - using VertexT = typename DigraphT::Vertex; - auto const total_weight = [&](DigraphT const& g) { + using DigraphT = Digraph; + using VertexT = typename DigraphT::Vertex; + using EdgeT = typename DigraphT::Edge; + + auto const default_cost_fn = [&](EdgeT const& e) { return g[e]; }; + + auto const total_weight = [&](DigraphT const& g_mst) { auto sum = CostType{0}; - // circumvents compilation error in clang for g.edges() - for (auto const& v : g.vertices()) { - for (auto const& e : g.out_edges(v)) { - sum += g[e]; + for (auto const& v : g_mst.vertices()) { + for (auto const& e : g_mst.out_edges(v)) { + sum += default_cost_fn(e); } } return sum; @@ -215,4 +240,45 @@ minimum_spanning_arborescence( return {mst, root}; } +/** + * Build a minimum spanning arborescence of the graph using a custom cost function. + * + * @param g The graph to build the MST of. + * @param cost_fn The cost function to use. + * @return The MST and the root vertex. + */ +template +std::pair, + typename Digraph::Vertex> +minimum_spanning_arborescence_with_cost( + Digraph const& g, + CostFn const& cost_fn) { + using InputDigraphT = Digraph; + using EdgeT = typename InputDigraphT::Edge; + using CostType = typename std::decay_t()))>; + using CostDigraphT = Digraph; + // using VertexT = typename CostDigraphT::Vertex; + + // Build a cost-weighted graph using the custom cost function. + // We create a new graph with the costs because Edmonds' algorithm adds + // new vertices to the graph during the process, rendering the cost function + // ill-defined. + CostDigraphT cost_graph; + for (auto const& v : g.vertices()) { + cost_graph.add_vertex_with_id(v); + } + for (auto const& u : g.vertices()) { + for (auto const& v : g.out_neighbors(u)) { + EdgeT const e{u, v}; + cost_graph.add_edge(e, cost_fn(e)); + } + } + + // Compute MST on the cost-weighted graph using the standard algorithm. + auto const [mst_cost_graph, root] = minimum_spanning_arborescence(cost_graph); + + // Return the MST (with cost-based edge weights) and chosen root. + return {mst_cost_graph, root}; +} + } // namespace dvlab diff --git a/src/util/spinner.cpp b/src/util/spinner.cpp new file mode 100644 index 000000000..6a268fe74 --- /dev/null +++ b/src/util/spinner.cpp @@ -0,0 +1,61 @@ +/**************************************************************************** + PackageName [ util ] + Synopsis [ Implement spinner utility for terminal loading indicator. ] + Author [ Mu-Te (Joshua) Lau ] + Copyright [ Copyright(c) 2026 PARAG@N Lab, CS, Northwestern U, IL, USA ] +****************************************************************************/ + +#include "util/spinner.hpp" + +#include + +#include +#include +#include + +#include "util/terminal_attributes.hpp" + +namespace dvlab { +namespace utils { + +namespace { + +constexpr char const* spinner_chars = "|/-\\"; +constexpr auto spin_interval = std::chrono::milliseconds(80); +} // namespace + +Spinner::Spinner(std::string const& message) + : _message(message), _stop(false) { + if (!is_terminal(stderr)) { + fmt::print(stderr, "{}\n", _message); + return; + } + _thread = std::thread([this]() { + size_t frame = 0; + while (!_stop.load(std::memory_order_relaxed)) { + // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic) + char const c = spinner_chars[frame % 4]; + fmt::print(stderr, "{} {} \r", _message, c); + std::fflush(stderr); + frame++; + for (auto deadline = std::chrono::steady_clock::now() + spin_interval; + !_stop.load(std::memory_order_relaxed) && + std::chrono::steady_clock::now() < deadline;) { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } + } + }); +} + +Spinner::~Spinner() { + _stop.store(true, std::memory_order_relaxed); + if (_thread.joinable()) { + _thread.join(); + // clear the line + fmt::print(stderr, "\r{}\r", std::string(_message.size() + 2, ' ')); + std::fflush(stderr); + } +} + +} // namespace utils +} // namespace dvlab diff --git a/src/util/spinner.hpp b/src/util/spinner.hpp new file mode 100644 index 000000000..49d5ff980 --- /dev/null +++ b/src/util/spinner.hpp @@ -0,0 +1,37 @@ +/**************************************************************************** + PackageName [ device ] + Synopsis [ Define spinner utility. ] + Author [ Mu-Te (Joshua) Lau ] + Copyright [ Copyright(c) 2026 PARAG@N Lab, CS, Northwestern U, IL, USA ] +****************************************************************************/ + +#pragma once + +#include +#include +#include +#include + +namespace dvlab { +namespace utils { + +class Spinner { +public: + Spinner(std::string const& message = ""); + ~Spinner(); + +private: + std::string _message; + std::string _done_message; + std::atomic _stop{false}; + std::thread _thread; +}; + +template +auto with_spinner(F&& call, std::string const& message = "") -> decltype(std::forward(call)()) { + Spinner spinner(message); + return std::forward(call)(); +} + +}; // namespace utils +} // namespace dvlab diff --git a/src/util/sysdep.cpp b/src/util/sysdep.cpp new file mode 100644 index 000000000..06da09b6f --- /dev/null +++ b/src/util/sysdep.cpp @@ -0,0 +1,95 @@ +/**************************************************************************** + PackageName [ util ] + Synopsis [ Define wrapper to system-dependent functions ] + Author [ Mu-Te (Joshua) Lau ] + Copyright [ Copyright(c) 2026 PARAG@N Lab, CS, Northwestern U, IL, USA ] +****************************************************************************/ + +#include "util/sysdep.hpp" + +#include + +#include + +#include "spdlog/spdlog.h" +#ifdef __linux__ +#include +#elif defined(__APPLE__) +#include +#elif defined(_WIN32) +#include +#endif + +namespace dvlab { + +namespace utils { + +bool python_package_exists(std::string_view package_name) { + if (!is_uv_available()) { + spdlog::error("`uv` is required to for this command. Please install `uv` first."); + return false; + } + return system(fmt::format("uv pip show {} > /dev/null 2>&1", package_name).c_str()) == 0; +} + +std::filesystem::path get_qsyn_executable_dir() { +#ifdef __linux__ + std::array path{}; + ssize_t len = readlink("/proc/self/exe", path.data(), path.size() - 1); + if (len == -1) { + return {}; + } + path[static_cast(len)] = '\0'; + return std::filesystem::path(path.data()).parent_path(); +#elif defined(__APPLE__) + std::array path{}; + uint32_t size = static_cast(path.size()); + if (_NSGetExecutablePath(path.data(), &size) != 0) { + return {}; + } + return std::filesystem::path(path.data()).parent_path(); +#elif defined(_WIN32) + std::array path{}; + if (GetModuleFileNameA(nullptr, path.data(), static_cast(path.size())) == 0) { + return {}; + } + return std::filesystem::path(path.data()).parent_path(); +#else + return {}; +#endif +} + +std::optional get_qsyn_config_dir() { + auto home_dir = get_home_directory(); + if (!home_dir) { + return std::nullopt; + } + return home_dir.value() + "/.config/qsyn/"; +} + +bool is_uv_available() { + return system("uv --version > /dev/null 2>&1") == 0; +} + +int uv_run_script(std::string_view script_path, std::vector args) { + if (!is_uv_available()) { + spdlog::error( + "`uv` is required to for this command. Please install `uv` first." + "See `https://docs.astral.sh/uv/getting-started/installation/` for installation instructions."); + return 1; + } + + auto const executable_dir = get_qsyn_executable_dir(); + + if (!std::filesystem::exists(executable_dir / ".venv")) { + spdlog::warn("No uv venv found. A new one will be created..."); + // NOTE: `uv run` will try to create a venv if it doesn't exist. + // We don't need to create it manually. The warning is just to + // inform the user. + } + + return system(fmt::format("uv run --project {} {} {}", executable_dir.string(), script_path, fmt::join(args, " ")).c_str()); +} +} // namespace utils + +} // namespace dvlab diff --git a/src/util/sysdep.hpp b/src/util/sysdep.hpp index efd493a3e..cf66eb91f 100644 --- a/src/util/sysdep.hpp +++ b/src/util/sysdep.hpp @@ -18,7 +18,9 @@ #include #endif +#include #include +#include namespace dvlab { @@ -58,14 +60,21 @@ inline void clear_terminal() { } } -inline auto python_package_exists(std::string_view package_name) -> bool { - return system(fmt::format("python3 -c 'import importlib.util; exit(0 if importlib.util.find_spec(\"{}\") is not None else 1)'", package_name).c_str()) == 0; -}; +[[nodiscard]] +auto python_package_exists(std::string_view package_name) -> bool; inline auto pdflatex_exists() -> bool { return system("pdflatex --version > /dev/null 2>&1") == 0; }; +auto get_qsyn_executable_dir() -> std::filesystem::path; +auto get_qsyn_config_dir() -> std::optional; + +[[nodiscard]] +auto is_uv_available() -> bool; + +auto uv_run_script(std::string_view script_path, std::vector args = {}) -> int; + // if system(...) returns 0, then qiskit is installed } // namespace utils diff --git a/src/util/tabler.cpp b/src/util/tabler.cpp new file mode 100644 index 000000000..e9772e7ca --- /dev/null +++ b/src/util/tabler.cpp @@ -0,0 +1,100 @@ +/**************************************************************************** + PackageName [ util ] + Synopsis [ Implementation of the Tabler class that replaces the fort::utf8_table] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#include "./tabler.hpp" + +#include + +#include +#include +#include + +#include "unicode/display_width.hpp" + +namespace dvlab { + +Tabler::Tabler() = default; + +size_t Tabler::_get_string_width(std::string_view str) const { + int const width = unicode::display_width(std::string(str)); + // display_width can return -1 on error, which when cast to size_t + // becomes SIZE_MAX This would break table formatting, + // so we treat errors as 0 width + return width < 0 ? 0 : static_cast(width); +} + +size_t Tabler::n_columns() const { + return _table.empty() + ? 0 + : std::ranges::max(_table | std::views::transform( + [](auto const& row) { return row.size(); })); +} + +void Tabler::add_row(std::span const& row) { + _table.emplace_back(row.begin(), row.end()); + + if (row.size() > _column_widths.size()) { + _column_widths.resize(row.size()); + } + + for (size_t i = 0; i < row.size(); ++i) { + _column_widths[i] = std::max( + _column_widths[i], _get_string_width(row[i])); + } +} + +void Tabler::add_column(std::span const& column) { + if (column.empty()) return; + + // if the column to insert is longer than the number of rows, + // first append empty rows + if (column.size() > n_rows()) { + _table.resize(column.size()); + } + + // then, get the longest row, and fill the shorter rows with empty strings. + size_t const size_longest_row = n_columns(); + for (auto& row : _table) { + if (row.size() < size_longest_row) { + row.resize(size_longest_row); + } + } + + // finally, add the column to the table + for (size_t i = 0; i < column.size(); ++i) { + _table[i].emplace_back(column[i]); + } + + // update column widths + size_t const new_column_width = + std::ranges::max(column | std::views::transform( + [this](auto const& str) { + return _get_string_width(str); + })); + _column_widths.emplace_back(new_column_width); +} + +std::string Tabler::to_string() const { + std::string ret; + + // print the table + for (size_t i = 0; i < n_rows(); ++i) { + ret += std::string(left_margin(), ' '); + for (size_t j = 0; j < n_columns(); ++j) { + if (i >= _table.size()) continue; + if (j >= _table[i].size()) continue; + ret += std::string(cell_left_padding(), ' '); + ret += fmt::format("{}", _table[i][j]); + size_t const diff = _column_widths[j] - _get_string_width(_table[i][j]); + ret += std::string(cell_right_padding() + diff, ' '); + } + ret += "\n"; + } + return ret; +} + +} // namespace dvlab diff --git a/src/util/tabler.hpp b/src/util/tabler.hpp new file mode 100644 index 000000000..dda5788cd --- /dev/null +++ b/src/util/tabler.hpp @@ -0,0 +1,47 @@ +/**************************************************************************** + PackageName [ util ] + Synopsis [ Definition of the Tabler class that replaces the fort::utf8_table] + Author [ Design Verification Lab ] + Copyright [ Copyright(c) 2023 DVLab, GIEE, NTU, Taiwan ] +****************************************************************************/ + +#pragma once + +#include +#include +#include + +namespace dvlab { + +class Tabler { +public: + using size_t = std::size_t; + Tabler(); + ~Tabler() = default; + + size_t& cell_left_padding() { return _cell_left_padding; } + size_t const& cell_left_padding() const { return _cell_left_padding; } + size_t& cell_right_padding() { return _cell_right_padding; } + size_t const& cell_right_padding() const { return _cell_right_padding; } + size_t& left_margin() { return _left_margin; } + size_t const& left_margin() const { return _left_margin; } + + size_t n_rows() const { return _table.size(); } + size_t n_columns() const; + + void add_row(std::span const& row); + void add_column(std::span const& column); + + std::string to_string() const; + +private: + std::vector> _table; + std::vector _column_widths; + size_t _cell_left_padding{0}; + size_t _cell_right_padding{0}; + size_t _left_margin{0}; + + size_t _get_string_width(std::string_view str) const; +}; + +} // namespace dvlab diff --git a/src/util/terminal_attributes.cpp b/src/util/terminal_attributes.cpp index b008e896f..fd8a478f4 100644 --- a/src/util/terminal_attributes.cpp +++ b/src/util/terminal_attributes.cpp @@ -7,7 +7,7 @@ #include "util/terminal_attributes.hpp" -#if defined(_WIN32) +#ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #define VC_EXTRALEAN #include diff --git a/src/zx/simplifier/causal-flow-opt.cpp b/src/zx/simplifier/causal-flow-opt.cpp index 421997d4f..cf090b9aa 100644 --- a/src/zx/simplifier/causal-flow-opt.cpp +++ b/src/zx/simplifier/causal-flow-opt.cpp @@ -8,6 +8,7 @@ #include "./simplify.hpp" #include "zx/flow/causal-flow.hpp" #include "zx/simplifier/rules/rule-matchers.hpp" +#include "zx/simplifier/rules/zx_rules_template.hpp" #include "zx/zx_def.hpp" #include "zx/zxgraph.hpp" #include "zx/zxgraph_action.hpp" @@ -27,9 +28,9 @@ std::vector get_matches_with_scores( using namespace std::chrono; auto matches = std::vector{}; - auto ifu_matcher = IdentityFusionMatcher{}; - auto lcu_matcher = LCompUnfusionMatcher{max_lcomp_unfusions}; - auto pvu_matcher = PivotUnfusionMatcher{max_pivot_unfusions}; + auto const ifu_matcher = IdentityFusionMatcher{}; + auto const lcu_matcher = LCompUnfusionMatcher{max_lcomp_unfusions}; + auto const pvu_matcher = PivotUnfusionMatcher{max_pivot_unfusions}; auto const ifu_start = high_resolution_clock::now(); @@ -58,36 +59,27 @@ std::vector get_matches_with_scores( } } - auto const sort_start = high_resolution_clock::now(); - - std::ranges::sort(matches, std::less{}, &MatchWithScore::second); - - auto const sort_end = high_resolution_clock::now(); + auto const pvu_end = high_resolution_clock::now(); auto const ifu_duration = duration_cast(lcu_start - ifu_start).count(); auto const lcu_duration = duration_cast(pvu_start - lcu_start).count(); auto const pvu_duration = - duration_cast(sort_end - pvu_start).count(); - auto const sort_duration = - duration_cast(sort_end - sort_start).count(); + duration_cast(pvu_end - pvu_start).count(); spdlog::debug( - "{} matches; IFU: {:.3f} ms, LCU: {:.3f} ms, PVU: {:.3f} ms, Sort: {:.3f} ms", + "{:>5} matches; IFU: {:>5.4f} ms, LCU: {:>5.4f} ms, PVU: {:>5.4f} ms", matches.size(), static_cast(ifu_duration) / 1'000.0, static_cast(lcu_duration) / 1'000.0, - static_cast(pvu_duration) / 1'000.0, - static_cast(sort_duration) / 1'000.0); + static_cast(pvu_duration) / 1'000.0); return matches; } -void update_affected_matches( - ZXGraph& g, std::vector& matches, - std::vector const& affected_vertices, size_t max_lcomp_unfusions, - size_t max_pivot_unfusions) { +std::unordered_set get_search_space( + ZXGraph const& g, std::vector const& affected_vertices) { constexpr auto max_radius = std::max({ IdentityFusion::radius(), LCompUnfusion::radius(), @@ -104,6 +96,15 @@ void update_affected_matches( std::move(search_space_vec.begin(), search_space_vec.end(), std::inserter(search_space, search_space.end())); + return search_space; +} + +void update_affected_matches( + ZXGraph& g, std::vector& matches, + std::vector const& affected_vertices, size_t max_lcomp_unfusions, + size_t max_pivot_unfusions) { + auto search_space = get_search_space(g, affected_vertices); + // remove the matches that becomes invalid or those with changed scores std::erase_if(matches, [&](auto const& mws) { auto const& [match, _] = mws; @@ -127,14 +128,18 @@ void update_affected_matches( auto new_matches = get_matches_with_scores( g, candidates, max_lcomp_unfusions, max_pivot_unfusions); - std::move(new_matches.begin(), - new_matches.end(), + std::move(new_matches.begin(), new_matches.end(), std::back_inserter(matches)); - // matches.insert(matches.end(), new_matches.begin(), new_matches.end()); // sort the matches in the ascending order of the score // so that we can apply the first match and discard it in O(1) time - std::ranges::sort(matches, std::less{}, &MatchWithScore::second); + auto const n_old_matches = matches.size(); + + std::ranges::inplace_merge( + matches.begin(), + matches.begin() + gsl::narrow_cast(n_old_matches), + matches.end(), + std::less{}, &MatchWithScore::second); } /** @@ -147,7 +152,8 @@ void update_affected_matches( */ void causal_flow_opt(ZXGraph& g, size_t max_lcomp_unfusions, - size_t max_pivot_unfusions) { + size_t max_pivot_unfusions, + size_t max_spider_arity) { using namespace std::chrono; constexpr auto const to_us = [](auto const dur) { return duration_cast(dur).count(); @@ -168,6 +174,26 @@ void causal_flow_opt(ZXGraph& g, auto const loop_start_time = high_resolution_clock::now(); // insert redundant vertices between Z-Z or X-X simple edges + hadamard_rule_simp(g); + to_z_graph(g); + while (!stop_requested()) { + auto const rule = SpiderFusionRule{}; + auto matches = rule.find_matches(g); + std::erase_if(matches, [&](auto const& m) { + auto const& [v1, v2] = m; + auto const expected_arity = + g.num_neighbors(v1) + g.num_neighbors(v2) - 2; + return expected_arity > max_spider_arity; + }); + + // check emptiness after erasing to avoid infinite loop + if (matches.empty()) { + break; + } + + rule.apply(g, matches); + } + redundant_hadamard_insertion(g, 1.0); to_graph_like(g); if (!has_causal_flow(g)) { @@ -183,10 +209,6 @@ void causal_flow_opt(ZXGraph& g, auto [match, score] = std::move(matches.back()); matches.pop_back(); - // fmt::println("applying match: {}", - // std::visit( - // [&](auto&& m) { return m.to_string(); }, match)); - std::visit([&](auto&& m) { m.apply_unchecked(g); }, match); ++num_matches_tried; @@ -228,9 +250,6 @@ void causal_flow_opt(ZXGraph& g, update_duration += to_us(high_resolution_clock::now() - update_start); - // fmt::println("max degree vertex: {}; degree: {}", - // get_max_degree_vertex()->get_id(), - // g.num_neighbors(get_max_degree_vertex())); } else { // undo the change and discard the match std::visit([&](auto&& m) { m.undo_unchecked(g); }, match); @@ -276,6 +295,9 @@ void causal_flow_opt(ZXGraph& g, void redundant_hadamard_insertion(ZXGraph& g, double prob) { hadamard_rule_simp(g); to_z_graph(g); + + if (prob <= 0.0) return; + auto vpairs = std::vector>{}; g.for_each_edge([&](auto const& ep) { @@ -290,7 +312,7 @@ void redundant_hadamard_insertion(ZXGraph& g, double prob) { for (auto const& [v0_id, v1_id] : vpairs) { // randomly add... static std::mt19937 gen(std::random_device{}()); - if (std::bernoulli_distribution{prob}(gen)) { + if (prob >= 1.0 || std::bernoulli_distribution{prob}(gen)) { IdentityAddition{ v0_id, v1_id, VertexType::z, EdgeType::hadamard} .apply_unchecked(g); diff --git a/src/zx/simplifier/simplify.hpp b/src/zx/simplifier/simplify.hpp index 0b59c5f5f..0eaed25ee 100644 --- a/src/zx/simplifier/simplify.hpp +++ b/src/zx/simplifier/simplify.hpp @@ -44,7 +44,8 @@ void symbolic_reduce(ZXGraph& g); void partition_reduce(ZXGraph& g, size_t n_partitions); void causal_flow_opt(ZXGraph& g, size_t max_lcomp_unfusions, - size_t max_pivot_unfusions); + size_t max_pivot_unfusions, + size_t max_spider_arity = 20); void redundant_hadamard_insertion(ZXGraph& g, double prob); void to_z_graph(ZXGraph& g); diff --git a/src/zx/zxgraph.cpp b/src/zx/zxgraph.cpp index 8559dc759..c20175981 100644 --- a/src/zx/zxgraph.cpp +++ b/src/zx/zxgraph.cpp @@ -52,7 +52,7 @@ ZXGraph::ZXGraph(ZXVertexList const& vertices, } } -ZXGraph::ZXGraph(ZXGraph const& other) : _filename{other._filename}, _procedures{other._procedures}, _next_v_id(other._next_v_id) { +ZXGraph::ZXGraph(ZXGraph const& other) : _next_v_id(other._next_v_id) { std::unordered_map old_to_new_vertex_map; for (auto& v : other.get_vertices()) { diff --git a/src/zx/zxgraph.hpp b/src/zx/zxgraph.hpp index 9602680b8..2dbcb549b 100644 --- a/src/zx/zxgraph.hpp +++ b/src/zx/zxgraph.hpp @@ -98,6 +98,10 @@ class ZXVertex { private: friend class ZXGraph; struct ZXVertexAttrs { + ZXVertexAttrs(size_t id, VertexType type, QubitIdType qubit, + Phase phase, float row, float col) + : id(id), type(type), qubit(qubit), + phase(phase), row(row), col(col) {} size_t id; VertexType type; QubitIdType qubit; // for boundary vertices, this is the qubit id; @@ -136,8 +140,6 @@ class ZXGraph { // NOLINT(cppcoreguidelines-special-member-functions) void release() { _next_v_id = 0; - _filename = ""; - _procedures.clear(); _inputs.clear(); _outputs.clear(); _vertices.clear(); @@ -148,8 +150,6 @@ class ZXGraph { // NOLINT(cppcoreguidelines-special-member-functions) void swap(ZXGraph& other) noexcept { std::swap(_next_v_id, other._next_v_id); - std::swap(_filename, other._filename); - std::swap(_procedures, other._procedures); std::swap(_inputs, other._inputs); std::swap(_outputs, other._outputs); std::swap(_vertices, other._vertices); @@ -191,19 +191,6 @@ class ZXGraph { // NOLINT(cppcoreguidelines-special-member-functions) size_t num_vertices() const { return get_vertices().size(); } size_t num_neighbors(ZXVertex* v) const { return v->_neighbors.size(); } - // file and procedure related functions - // may be moved to manager class in the future - void set_filename(std::string const& f) { _filename = f; } - void add_procedures(std::vector const& ps) { - _procedures.insert(std::end(_procedures), std::begin(ps), std::end(ps)); - } - void add_procedure(std::string_view p) { _procedures.emplace_back(p); } - - std::string get_filename() const { return _filename; } - std::vector const& get_procedures() const { - return _procedures; - } - // attributes bool is_neighbor(ZXVertex* v1, ZXVertex* v2) const { return v1->_neighbors.contains({v2, EdgeType::simple}) || @@ -373,8 +360,6 @@ class ZXGraph { // NOLINT(cppcoreguidelines-special-member-functions) private: mutable size_t _next_v_id = 0; - std::string _filename; - std::vector _procedures; ZXVertexList _inputs; ZXVertexList _outputs; ZXVertexList _vertices; diff --git a/tests/cli/dof/qcir-help-msg.dof b/tests/cli/dof/qcir-help-msg.dof new file mode 100644 index 000000000..fdf26b96f --- /dev/null +++ b/tests/cli/dof/qcir-help-msg.dof @@ -0,0 +1 @@ +qcir --help \ No newline at end of file diff --git a/tests/cli/ref/qcir-help-msg.log b/tests/cli/ref/qcir-help-msg.log new file mode 100644 index 000000000..cc8a1aee1 --- /dev/null +++ b/tests/cli/ref/qcir-help-msg.log @@ -0,0 +1,32 @@ +qsyn> qcir --help +Usage: qcir [-h] [list | checkout | new | delete | copy | compose | tensor-product | read | write | print | draw | adjoint | gate | qubit | optimize | translate | oracle | equiv | to-basic | transpile-qiskit] ... + +Description: + QCir commands + +Options: + flag -h, --help show this help message + +Subcommands: +[list | checkout | new | delete | copy | compose | tensor-product | read | write | print | draw | adjoint | gate | qubit | optimize | translate | oracle | equiv | to-basic | transpile-qiskit] + list List all QCirs + checkout Checkout to QCir with the ID specified + new Create a new QCir + delete Delete a QCir from the list + copy Copy a QCir + compose compose a QCir + tensor-product tensor a QCir + read read a circuit and construct the corresponding netlist + write write QCir to a QASM file + print print info of QCir + draw draw a QCir. This command relies on qiskit and pdflatex to be present in the system + adjoint transform the QCir to its adjoint, i.e., reverse the order of gates and replace each gate with its adjoint version + gate gate commands + qubit qubit commands + optimize optimize QCir + translate translate the circuit into a specific gate set + oracle synthesize a boolean oracle + equiv check if two circuits are equivalent. A Tableau-based method is used to check the equivalence. If that fails, and the circuits are small enough, also verify the equivalence are through tensor calculation. + to-basic Convert the QCir to use only basic gates + transpile-qiskit Transpile the current QCir using Qiskit and checks the resulting circuit to a new QCir + diff --git a/tests/hamiltonian/hamilt0.txt b/tests/hamiltonian/hamilt0.txt new file mode 100644 index 000000000..2b66b928e --- /dev/null +++ b/tests/hamiltonian/hamilt0.txt @@ -0,0 +1,3 @@ +2 XX +3 ZZ +4 YY \ No newline at end of file diff --git a/tests/hamiltonian/hamilt1.txt b/tests/hamiltonian/hamilt1.txt new file mode 100644 index 000000000..b2726e3b4 --- /dev/null +++ b/tests/hamiltonian/hamilt1.txt @@ -0,0 +1,5 @@ +2 XX +3 XZ +4 ZI +5 IZ +6 YX \ No newline at end of file diff --git a/tests/src/device/device.cpp b/tests/src/device/device.cpp new file mode 100644 index 000000000..e464d1611 --- /dev/null +++ b/tests/src/device/device.cpp @@ -0,0 +1,181 @@ +/* + Unit tests for device::Device (physical device topology and gate info). +*/ + +#include "device/device.hpp" + +#include + +using namespace qsyn::device; +using GateDelayNanoSec = qsyn::device::GateDelayNanoSec; + +static Device make_line_3() { + // 3 qubits in a line: 0 -- 1 -- 2 + Device d; + d.set_name("line-3"); + d.add_gate_type("h"); + d.add_gate_type("cx"); + d.add_gate_info(Device::QubitPair{0, 1}, GateInfo{.gate_idx = 1, .time = GateDelayNanoSec{50.f}, .error = 0.01f}); + d.add_gate_info(Device::QubitPair{1, 0}, GateInfo{.gate_idx = 1, .time = GateDelayNanoSec{50.f}, .error = 0.01f}); + d.add_gate_info(Device::QubitPair{1, 2}, GateInfo{.gate_idx = 1, .time = GateDelayNanoSec{50.f}, .error = 0.01f}); + d.add_gate_info(Device::QubitPair{2, 1}, GateInfo{.gate_idx = 1, .time = GateDelayNanoSec{50.f}, .error = 0.01f}); + for (size_t i = 0; i < 3; ++i) { + d.add_gate_info(i, GateInfo{.gate_idx = 0, .time = GateDelayNanoSec{20.f}, .error = 0.001f}); + } + return d; +} + +TEST_CASE("Device default construction", "[device]") { + Device d; + REQUIRE(d.get_name().empty()); + REQUIRE(d.get_gate_set().empty()); + REQUIRE(d.get_num_qubits() == 0); + REQUIRE(d.get_num_adjacencies() == 0); +} + +TEST_CASE("Device set_name and get_name", "[device]") { + Device d; + d.set_name("ibmq_lima"); + REQUIRE(d.get_name() == "ibmq_lima"); +} + +TEST_CASE("Device add_gate_type and get_gate_set", "[device]") { + Device d; + d.add_gate_type("h"); + d.add_gate_type("cx"); + auto gate_set = d.get_gate_set(); + REQUIRE(gate_set.size() == 2); + REQUIRE(gate_set[0] == "h"); + REQUIRE(gate_set[1] == "cx"); +} + +TEST_CASE("Device add_gate_info single qubit creates vertex and stores info", "[device]") { + Device d; + d.add_gate_type("h"); + d.add_gate_info(0, GateInfo{.gate_idx = 0, .time = GateDelayNanoSec{10.f}, .error = 0.001f}); + REQUIRE(d.get_num_qubits() == 1); + auto const& info = d.get_gate_info(0); + REQUIRE(info.size() == 1); + REQUIRE(info[0].gate_idx == 0); + REQUIRE(info[0].time.count() == 10.f); + REQUIRE(info[0].error == 0.001f); +} + +TEST_CASE("Device add_gate_info single qubit appends multiple infos", "[device]") { + Device d; + d.add_gate_type("h"); + d.add_gate_type("x"); + d.add_gate_info(0, GateInfo{.gate_idx = 0, .time = GateDelayNanoSec{10.f}, .error = 0.001f}); + d.add_gate_info(0, GateInfo{.gate_idx = 1, .time = GateDelayNanoSec{20.f}, .error = 0.002f}); + auto const& info = d.get_gate_info(0); + REQUIRE(info.size() == 2); + REQUIRE(info[0].gate_idx == 0); + REQUIRE(info[1].gate_idx == 1); +} + +TEST_CASE("Device add_gate_info qubit pair creates edge and stores info", "[device]") { + Device d; + d.add_gate_type("cx"); + d.add_gate_info(Device::QubitPair{0, 1}, GateInfo{.gate_idx = 0, .time = GateDelayNanoSec{50.f}, .error = 0.01f}); + REQUIRE(d.get_num_qubits() == 2); + REQUIRE(d.get_num_adjacencies() == 1); + REQUIRE(d.is_adjacent(Device::QubitPair{0, 1})); + REQUIRE(d.is_adjacent(0, 1)); + auto const& info = d.get_gate_info(Device::QubitPair{0, 1}); + REQUIRE(info.size() == 1); + REQUIRE(info[0].gate_idx == 0); + REQUIRE(info[0].time.count() == 50.f); + REQUIRE(info[0].error == 0.01f); +} + +TEST_CASE("Device add_gate_info qubit pair appends multiple infos", "[device]") { + Device d; + d.add_gate_type("cx"); + d.add_gate_type("cz"); + d.add_gate_info(Device::QubitPair{0, 1}, GateInfo{.gate_idx = 0, .time = GateDelayNanoSec{50.f}, .error = 0.01f}); + d.add_gate_info(Device::QubitPair{0, 1}, GateInfo{.gate_idx = 1, .time = GateDelayNanoSec{30.f}, .error = 0.005f}); + auto const& info = d.get_gate_info(Device::QubitPair{0, 1}); + REQUIRE(info.size() == 2); + REQUIRE(info[0].gate_idx == 0); + REQUIRE(info[1].gate_idx == 1); +} + +TEST_CASE("Device get_adjacencies and get_num_adjacencies per qubit", "[device]") { + Device d = make_line_3(); + REQUIRE(d.get_num_qubits() == 3); + REQUIRE(d.get_num_adjacencies() == 4); // (0,1), (1,0), (1,2), (2,1) + auto const& adj0 = d.get_adjacencies(0); + REQUIRE(adj0.size() == 1); + REQUIRE(adj0.contains(1u)); + auto const& adj1 = d.get_adjacencies(1); + REQUIRE(adj1.size() == 2); + REQUIRE(adj1.contains(0u)); + REQUIRE(adj1.contains(2u)); + auto const& adj2 = d.get_adjacencies(2); + REQUIRE(adj2.size() == 1); + REQUIRE(adj2.contains(1u)); + REQUIRE(d.get_num_adjacencies(0) == 1); + REQUIRE(d.get_num_adjacencies(1) == 2); + REQUIRE(d.get_num_adjacencies(2) == 1); +} + +TEST_CASE("Device is_adjacent two-arg form", "[device]") { + Device d = make_line_3(); + REQUIRE(d.is_adjacent(0, 1)); + REQUIRE(d.is_adjacent(1, 0)); + REQUIRE(d.is_adjacent(1, 2)); + REQUIRE(d.is_adjacent(2, 1)); + REQUIRE(!d.is_adjacent(0, 2)); + REQUIRE(!d.is_adjacent(2, 0)); +} + +TEST_CASE("Device info_string", "[device]") { + Device d = make_line_3(); + std::string info = d.info_string(); + REQUIRE(info.find("line-3") != std::string::npos); + REQUIRE(info.find("3 qubits") != std::string::npos); + REQUIRE(info.find("h") != std::string::npos); + REQUIRE(info.find("cx") != std::string::npos); +} + +TEST_CASE("Device gate_info_string single qubit", "[device]") { + Device d = make_line_3(); + auto s0 = d.gate_info_string(0); + REQUIRE(s0.has_value()); + REQUIRE(s0->find("Qubit 0") != std::string::npos); + REQUIRE(s0->find("adjacencies") != std::string::npos); + REQUIRE(s0->find("h") != std::string::npos); + auto s99 = d.gate_info_string(99); + REQUIRE(!s99.has_value()); +} + +TEST_CASE("Device gate_info_string qubit pair", "[device]") { + Device d = make_line_3(); + auto s01 = d.gate_info_string(Device::QubitPair{0, 1}); + REQUIRE(s01.has_value()); + REQUIRE(s01->find("Adjacency (0, 1)") != std::string::npos); + REQUIRE(s01->find("cx") != std::string::npos); + auto invalid_first = d.gate_info_string(Device::QubitPair{99, 0}); + REQUIRE(!invalid_first.has_value()); + REQUIRE(invalid_first.error() == TwoQubitGateInfoAccessError::invalid_first_qubit_id); + auto invalid_second = d.gate_info_string(Device::QubitPair{0, 99}); + REQUIRE(!invalid_second.has_value()); + REQUIRE(invalid_second.error() == TwoQubitGateInfoAccessError::invalid_second_qubit_id); + auto invalid_pair = d.gate_info_string(Device::QubitPair{0, 2}); + REQUIRE(!invalid_pair.has_value()); + REQUIRE(invalid_pair.error() == TwoQubitGateInfoAccessError::invalid_qubit_pair); +} + +TEST_CASE("Device get_coupling_graph returns consistent reference", "[device]") { + Device d = make_line_3(); + auto const& g1 = d.get_coupling_graph(); + auto const& g2 = d.get_coupling_graph(); + REQUIRE(&g1 == &g2); + REQUIRE(g1.num_vertices() == 3); + REQUIRE(g1.num_edges() == 4); // (0,1), (1,0), (1,2), (2,1) +} + +TEST_CASE("Device read_qsyn_device_file missing file returns nullopt", "[device]") { + auto dev = read_qsyn_device_file("/nonexistent/path/device.device"); + REQUIRE(!dev.has_value()); +} diff --git a/tests/src/hamiltonian/ternary_tree.cpp b/tests/src/hamiltonian/ternary_tree.cpp new file mode 100644 index 000000000..e7b47b024 --- /dev/null +++ b/tests/src/hamiltonian/ternary_tree.cpp @@ -0,0 +1,283 @@ +/* + Unit tests for TernaryTree (ternary tree structure used in Hamiltonian handling). +*/ + +#include "hamiltonian/ternary_tree.hpp" + +#include + +using namespace qsyn::hamiltonian; + +size_t num_legs(size_t num_qubits) { + // root has 3 legs, adding each child removes one leg but adds three more + // so total legs is 3 + 2 * (num_qubits - 1) = 1 + 2 * num_qubits + return 1 + 2 * num_qubits; +} + +TEST_CASE("TernaryTree constructor rejects invalid num_qubits", "[ternary_tree]") { + REQUIRE_THROWS_AS(TernaryTree(0), std::invalid_argument); +} + +TEST_CASE("TernaryTree single qubit (root only)", "[ternary_tree]") { + TernaryTree tree(1); + + REQUIRE(tree.num_qubits() == 1); + + TernaryNode* root = tree.get_root(); + REQUIRE(root != nullptr); + REQUIRE(root->parent == nullptr); + auto const root_qubit_node = dynamic_cast(root); + REQUIRE(root_qubit_node != nullptr); + REQUIRE(root_qubit_node->qubit_label == std::nullopt); + REQUIRE(!root->is_leg()); + + // Root has three edges (to legs) + REQUIRE(root->get_edge(BranchType::left) != nullptr); + REQUIRE(root->get_edge(BranchType::mid) != nullptr); + REQUIRE(root->get_edge(BranchType::right) != nullptr); + + // Three legs + REQUIRE(tree.get_legs().size() == 3); + for (size_t i = 0; i < 3; ++i) { + TernaryLeg* leg = tree.get_leg(i); + REQUIRE(leg != nullptr); + REQUIRE(leg->is_leg()); + REQUIRE(leg->parent == root); + REQUIRE(leg->incoming_edge != nullptr); + REQUIRE(leg->incoming_edge->source == root); + } + + REQUIRE(tree.get_node_by_index(0) == root); +} + +TEST_CASE("TernaryTree four qubits (root + 3 children)", "[ternary_tree]") { + TernaryTree tree(4); + + REQUIRE(tree.num_qubits() == 4); + + TernaryNode* root = tree.get_root(); + REQUIRE(root != nullptr); + + TernaryEdge* left_edge = root->get_edge(BranchType::left); + TernaryEdge* mid_edge = root->get_edge(BranchType::mid); + TernaryEdge* right_edge = root->get_edge(BranchType::right); + REQUIRE(left_edge != nullptr); + REQUIRE(mid_edge != nullptr); + REQUIRE(right_edge != nullptr); + + REQUIRE(left_edge->source == root); + REQUIRE(mid_edge->source == root); + REQUIRE(right_edge->source == root); + REQUIRE(left_edge->branch == BranchType::left); + REQUIRE(mid_edge->branch == BranchType::mid); + REQUIRE(right_edge->branch == BranchType::right); + + TernaryNode* left_child = left_edge->target.get(); + TernaryNode* mid_child = mid_edge->target.get(); + TernaryNode* right_child = right_edge->target.get(); + REQUIRE(left_child != nullptr); + REQUIRE(mid_child != nullptr); + REQUIRE(right_child != nullptr); + + REQUIRE(left_child->parent == root); + REQUIRE(mid_child->parent == root); + REQUIRE(right_child->parent == root); + + REQUIRE(left_child->incoming_edge == left_edge); + REQUIRE(mid_child->incoming_edge == mid_edge); + REQUIRE(right_child->incoming_edge == right_edge); + + REQUIRE(tree.get_node_by_index(0) == root); + REQUIRE(tree.get_node_by_index(1) == left_child); + REQUIRE(tree.get_node_by_index(2) == mid_child); + REQUIRE(tree.get_node_by_index(3) == right_child); + + // root has 3 legs, adding each child removes one leg but adds three more + // so total legs is 1 + 2 * 4 = 9 + REQUIRE(tree.get_legs().size() == num_legs(4)); +} + +TEST_CASE("TernaryTree assign_qubit and get_node_by_qubit", "[ternary_tree]") { + TernaryTree tree(4); + + tree.assign_qubit(0, 10); + tree.assign_qubit(1, 20); + tree.assign_qubit(2, 30); + tree.assign_qubit(3, 40); + + REQUIRE(tree.get_node_by_qubit(10) == tree.get_root()); + auto const qubit_10_node = dynamic_cast(tree.get_node_by_qubit(10)); + REQUIRE(qubit_10_node != nullptr); + REQUIRE(qubit_10_node->qubit_label == 10); + auto const qubit_20_node = dynamic_cast(tree.get_node_by_qubit(20)); + REQUIRE(qubit_20_node != nullptr); + REQUIRE(qubit_20_node->qubit_label == 20); + + // Reassign + tree.assign_qubit(1, 99); + auto const qubit_99_node = dynamic_cast(tree.get_node_by_qubit(99)); + REQUIRE(qubit_99_node != nullptr); + REQUIRE(qubit_99_node->qubit_label == 99); +} + +TEST_CASE("TernaryTree legs are TernaryLeg and have correct parent", "[ternary_tree]") { + TernaryTree tree(2); + + TernaryNode* root = tree.get_root(); + TernaryNode* child = root->get_edge(BranchType::left)->target.get(); + + // root has 3 legs, adding each child removes one leg but adds three more + // so total legs is 1 + 2 * 2 = 5 + REQUIRE(tree.get_legs().size() == num_legs(2)); + + for (TernaryLeg* leg : tree.get_legs()) { + REQUIRE(leg->is_leg()); + REQUIRE(dynamic_cast(leg) == leg); + REQUIRE(leg->parent != nullptr); + REQUIRE((leg->parent == root || leg->parent == child)); + REQUIRE(leg->incoming_edge != nullptr); + REQUIRE(leg->incoming_edge->source == leg->parent); + } +} + +TEST_CASE("TernaryTree larger tree structure", "[ternary_tree]") { + // 10 qubits: root + 3 children, then each of those gets up to 3 children until we have 10 nodes + TernaryTree tree(10); + + REQUIRE(tree.num_qubits() == 10); + REQUIRE(tree.get_root() != nullptr); + + for (size_t i = 0; i < 10; ++i) { + TernaryNode* node = tree.get_node_by_index(i); + REQUIRE(node != nullptr); + if (i > 0) { + REQUIRE(node->parent != nullptr); + REQUIRE(node->incoming_edge != nullptr); + REQUIRE(node->incoming_edge->source == node->parent); + REQUIRE(node->incoming_edge->target.get() == node); + } + } + + REQUIRE(tree.get_legs().size() == num_legs(10)); +} + +TEST_CASE("TernaryTree copy constructor deep copy", "[ternary_tree]") { + TernaryTree original(4); + original.assign_qubit(0, 10); + original.assign_qubit(1, 20); + original.assign_qubit(2, 30); + original.assign_qubit(3, 40); + + TernaryTree copy(original); + + REQUIRE(copy.num_qubits() == original.num_qubits()); + REQUIRE(copy.num_qubits() == 4); + + REQUIRE(copy.get_root() != nullptr); + REQUIRE(copy.get_root() != original.get_root()); + + for (size_t i = 0; i < 4; ++i) { + TernaryNode* orig_node = original.get_node_by_index(i); + TernaryNode* copy_node = copy.get_node_by_index(i); + REQUIRE(copy_node != nullptr); + REQUIRE(copy_node != orig_node); + auto const orig_qubit_node = dynamic_cast(orig_node); + auto const copy_qubit_node = dynamic_cast(copy_node); + REQUIRE(copy_qubit_node != nullptr); + REQUIRE(copy_qubit_node != orig_qubit_node); + REQUIRE(copy_qubit_node->qubit_label == orig_qubit_node->qubit_label); + } + + REQUIRE(copy.get_node_by_qubit(10) == copy.get_root()); + { + auto const qubit_10_node = dynamic_cast(copy.get_node_by_qubit(10)); + REQUIRE(qubit_10_node != nullptr); + REQUIRE(qubit_10_node->qubit_label == 10); + auto const qubit_20_node = dynamic_cast(copy.get_node_by_qubit(20)); + REQUIRE(qubit_20_node != nullptr); + REQUIRE(qubit_20_node->qubit_label == 20); + auto const qubit_30_node = dynamic_cast(copy.get_node_by_qubit(30)); + REQUIRE(qubit_30_node != nullptr); + REQUIRE(qubit_30_node->qubit_label == 30); + auto const qubit_40_node = dynamic_cast(copy.get_node_by_qubit(40)); + REQUIRE(qubit_40_node != nullptr); + REQUIRE(qubit_40_node->qubit_label == 40); + } + + REQUIRE(copy.get_legs().size() == original.get_legs().size()); + REQUIRE(copy.get_legs().size() == num_legs(4)); + + // Mutating the copy does not affect the original + copy.assign_qubit(1, 99); + { + auto const qubit_20_node = dynamic_cast(original.get_node_by_qubit(20)); + REQUIRE(qubit_20_node != nullptr); + REQUIRE(qubit_20_node->qubit_label == 20); + auto const qubit_id_1_node = dynamic_cast(original.get_node_by_index(1)); + REQUIRE(qubit_id_1_node != nullptr); + REQUIRE(qubit_id_1_node->qubit_label == 20); + auto const qubit_99_node = dynamic_cast(copy.get_node_by_qubit(99)); + REQUIRE(qubit_99_node != nullptr); + REQUIRE(qubit_99_node->qubit_label == 99); + } +} + +TEST_CASE("TernaryTree copy constructor single qubit", "[ternary_tree]") { + TernaryTree original(1); + TernaryTree copy(original); + + REQUIRE(copy.num_qubits() == 1); + REQUIRE(copy.get_root() != nullptr); + REQUIRE(copy.get_root() != original.get_root()); + REQUIRE(copy.get_legs().size() == 3); +} + +TEST_CASE("TernaryTree move constructor", "[ternary_tree]") { + TernaryTree original(4); + original.assign_qubit(0, 5); + original.assign_qubit(1, 6); + TernaryNode* orig_root = original.get_root(); + size_t orig_num_qubits = original.num_qubits(); + size_t orig_legs_size = original.get_legs().size(); + + TernaryTree moved(std::move(original)); + + REQUIRE(moved.num_qubits() == orig_num_qubits); + REQUIRE(moved.num_qubits() == 4); + REQUIRE(moved.get_root() == orig_root); + REQUIRE(moved.get_node_by_index(0) == orig_root); + auto const qubit_5_node = dynamic_cast(moved.get_node_by_qubit(5)); + REQUIRE(qubit_5_node != nullptr); + REQUIRE(qubit_5_node->qubit_label == 5); + auto const qubit_6_node = dynamic_cast(moved.get_node_by_qubit(6)); + REQUIRE(qubit_6_node != nullptr); + REQUIRE(qubit_6_node->qubit_label == 6); + REQUIRE(moved.get_legs().size() == orig_legs_size); + REQUIRE(moved.get_legs().size() == num_legs(4)); + + // Moved-from tree is in a valid state (can be destroyed or reassigned) + REQUIRE(original.num_qubits() == 4); + REQUIRE(original.get_root() == nullptr); +} + +TEST_CASE("TernaryTree move then use moved-to", "[ternary_tree]") { + TernaryTree a(3); + a.assign_qubit(0, 0); + a.assign_qubit(1, 1); + a.assign_qubit(2, 2); + + TernaryTree b(std::move(a)); + + REQUIRE(b.get_node_by_index(0) != nullptr); + auto const qubit_0_node = dynamic_cast(b.get_node_by_index(0)); + REQUIRE(qubit_0_node != nullptr); + REQUIRE(qubit_0_node->qubit_label == 0); + auto const qubit_1_node = dynamic_cast(b.get_node_by_index(1)); + REQUIRE(qubit_1_node != nullptr); + REQUIRE(qubit_1_node->qubit_label == 1); + auto const qubit_2_node = dynamic_cast(b.get_node_by_index(2)); + REQUIRE(qubit_2_node != nullptr); + REQUIRE(qubit_2_node->qubit_label == 2); + REQUIRE(b.get_leg(0) != nullptr); + REQUIRE(b.get_leg(0)->is_leg()); +} diff --git a/tests/src/util/digraph.cpp b/tests/src/util/digraph.cpp index c20f4d192..2f7b774c5 100644 --- a/tests/src/util/digraph.cpp +++ b/tests/src/util/digraph.cpp @@ -1,8 +1,11 @@ #include "util/graph/digraph.hpp" +#include "util/graph/floyd_warshall.hpp" #include #include +#include + #include "util/graph/minimum_spanning_arborescence.hpp" TEST_CASE("digraph", "[digraph]") { @@ -115,3 +118,32 @@ TEST_CASE("minimum spanning arborescence 2", "[digraph]") { REQUIRE(mst == mst_expected); } + +TEST_CASE("generic floyd_warshall", "[digraph]") { + using Digraph = dvlab::Digraph; + auto g = Digraph{3}; + g.add_edge(0, 1, 0); + g.add_edge(1, 2, 0); + g.add_edge(0, 2, 0); + + auto const cost = [](Digraph::Edge e) { + if (e.src == 0 && e.dst == 1) return 1.f; + if (e.src == 1 && e.dst == 2) return 1.f; + if (e.src == 0 && e.dst == 2) return 10.f; + return std::numeric_limits::infinity(); + }; + + auto const apsp = dvlab::floyd_warshall(g, cost); + + REQUIRE(apsp.vertices.size() == 3); + REQUIRE(apsp.distance.size() == 3); + REQUIRE(apsp.predecessor.size() == 3); + + // 0 -> 1 cost 1, 1 -> 2 cost 1, 0 -> 2 direct cost 10; shortest 0->2 is via 1 = 2 + REQUIRE(apsp.distance[0][2] == 2.f); + REQUIRE(apsp.predecessor[0][2].value() == 1u); + + REQUIRE(apsp.distance[0][0] == 0.f); + REQUIRE(apsp.distance[0][1] == 1.f); + REQUIRE(apsp.predecessor[0][1].value() == 0u); +} diff --git a/tests/topology/reader/dof/topo_hybrid.dof b/tests/topology/reader/dof/topo_hybrid.dof deleted file mode 100644 index 7c651e883..000000000 --- a/tests/topology/reader/dof/topo_hybrid.dof +++ /dev/null @@ -1,18 +0,0 @@ -device read benchmark/topology/ithaca.layout -device print -device read benchmark/topology/example.layout -device print -device checkout 0 -device -device print -q -device print -q 15 -device print -e 15 -device -device list -device print -p 0 64 -device print -p 12 56 -device print -p 35 21 -device print -p 33 33 -quit -f - - diff --git a/tests/topology/reader/ref/topo_hybrid.log b/tests/topology/reader/ref/topo_hybrid.log deleted file mode 100644 index e9d79fee0..000000000 --- a/tests/topology/reader/ref/topo_hybrid.log +++ /dev/null @@ -1,126 +0,0 @@ -qsyn> device read benchmark/topology/ithaca.layout - -qsyn> device print -Topology: ibm_ithaca (65 qubits, 72 edges) -Gate Set: CX, ID, RZ, SX, X - -qsyn> device read benchmark/topology/example.layout - -qsyn> device print -Topology: example_topology (3 qubits, 2 edges) -Gate Set: X, RZ, H, ID, SX, CX - -qsyn> device checkout 0 - -qsyn> device --> #Device: 2 --> Now focused on: Device 0 (ibm_ithaca) - -qsyn> device print -q - -ID: 0 Delay: 4.37 Error: 0.0003 Adjs: 1 10 -ID: 1 Delay: 5.94 Error: 0.00016 Adjs: 0 2 -ID: 2 Delay: 4.72 Error: 0.00036 Adjs: 1 3 -ID: 3 Delay: 4.22 Error: 0.0004 Adjs: 2 4 -ID: 4 Delay: 5.26 Error: 0.00021 Adjs: 3 5 11 -ID: 5 Delay: 5.11 Error: 0.00028 Adjs: 4 6 -ID: 6 Delay: 4.72 Error: 0.00017 Adjs: 5 7 -ID: 7 Delay: 4.01 Error: 0.00027 Adjs: 6 8 -ID: 8 Delay: 4.09 Error: 0.00018 Adjs: 7 9 12 -ID: 9 Delay: 5.1 Error: 0.00047 Adjs: 8 -ID: 10 Delay: 4.22 Error: 0.00021 Adjs: 0 13 -ID: 11 Delay: 5.02 Error: 0.00146 Adjs: 4 17 -ID: 12 Delay: 5.7 Error: 0.00039 Adjs: 8 21 -ID: 13 Delay: 5.44 Error: 0.00038 Adjs: 10 14 -ID: 14 Delay: 5.65 Error: 0.00019 Adjs: 13 15 -ID: 15 Delay: 5.27 Error: 0.00023 Adjs: 14 16 24 -ID: 16 Delay: 5.46 Error: 0.00018 Adjs: 15 17 -ID: 17 Delay: 4.22 Error: 0.00032 Adjs: 11 16 18 -ID: 18 Delay: 5.01 Error: 0.00016 Adjs: 17 19 -ID: 19 Delay: 5.18 Error: 0.00051 Adjs: 18 20 25 -ID: 20 Delay: 5.13 Error: 0.00242 Adjs: 19 21 -ID: 21 Delay: 5.96 Error: 0.00022 Adjs: 12 20 22 -ID: 22 Delay: 4.91 Error: 0.00014 Adjs: 21 23 -ID: 23 Delay: 5.25 Error: 0.00077 Adjs: 22 26 -ID: 24 Delay: 5.46 Error: 0.00015 Adjs: 15 29 -ID: 25 Delay: 4.7 Error: 0.00024 Adjs: 19 33 -ID: 26 Delay: 4.96 Error: 0.00027 Adjs: 23 37 -ID: 27 Delay: 4.54 Error: 0.01 Adjs: 28 38 -ID: 28 Delay: 5.34 Error: 0.00014 Adjs: 27 29 -ID: 29 Delay: 5.48 Error: 0.0003 Adjs: 24 28 30 -ID: 30 Delay: 5.22 Error: 0.00014 Adjs: 29 31 -ID: 31 Delay: 4.88 Error: 0.0002 Adjs: 30 32 39 -ID: 32 Delay: 4.85 Error: 0.00021 Adjs: 31 33 -ID: 33 Delay: 4.32 Error: 0.00025 Adjs: 25 32 34 -ID: 34 Delay: 4.55 Error: 0.00038 Adjs: 33 35 -ID: 35 Delay: 4.97 Error: 0.00041 Adjs: 34 36 40 -ID: 36 Delay: 4.42 Error: 0.00023 Adjs: 35 37 -ID: 37 Delay: 5.92 Error: 0.00024 Adjs: 26 36 -ID: 38 Delay: 4.54 Error: 0.00023 Adjs: 27 41 -ID: 39 Delay: 5.82 Error: 0.00037 Adjs: 31 45 -ID: 40 Delay: 4.83 Error: 0.00035 Adjs: 35 49 -ID: 41 Delay: 5.63 Error: 0.0005 Adjs: 38 42 -ID: 42 Delay: 4.65 Error: 0.00035 Adjs: 41 43 -ID: 43 Delay: 5.16 Error: 0.00021 Adjs: 42 44 52 -ID: 44 Delay: 5.38 Error: 0.00028 Adjs: 43 45 -ID: 45 Delay: 4.18 Error: 0.00017 Adjs: 39 44 46 -ID: 46 Delay: 4.46 Error: 0.00027 Adjs: 45 47 -ID: 47 Delay: 5.78 Error: 0.00018 Adjs: 46 48 53 -ID: 48 Delay: 5.41 Error: 0.00047 Adjs: 47 49 -ID: 49 Delay: 4.97 Error: 0.00021 Adjs: 40 48 50 -ID: 50 Delay: 5.89 Error: 0.00146 Adjs: 49 51 -ID: 51 Delay: 5.96 Error: 0.00039 Adjs: 50 54 -ID: 52 Delay: 4.27 Error: 0.00038 Adjs: 43 56 -ID: 53 Delay: 4.85 Error: 0.00019 Adjs: 47 60 -ID: 54 Delay: 4.14 Error: 0.00023 Adjs: 51 64 -ID: 55 Delay: 5.41 Error: 0.00018 Adjs: 56 -ID: 56 Delay: 4.84 Error: 0.00032 Adjs: 52 55 57 -ID: 57 Delay: 4.37 Error: 0.00016 Adjs: 56 58 -ID: 58 Delay: 5.3 Error: 0.00051 Adjs: 57 59 -ID: 59 Delay: 5.12 Error: 0.00242 Adjs: 58 60 -ID: 60 Delay: 4.37 Error: 0.00022 Adjs: 53 59 61 -ID: 61 Delay: 5.41 Error: 0.00014 Adjs: 60 62 -ID: 62 Delay: 4.16 Error: 0.00077 Adjs: 61 63 -ID: 63 Delay: 4.83 Error: 0.00027 Adjs: 62 64 -ID: 64 Delay: 4.83 Error: 0.00018 Adjs: 54 63 -Total #Qubits: 65 - -qsyn> device print -q 15 - -ID: 15 Delay: 5.27 Error: 0.00023 Adjs: 14 16 24 - -qsyn> device print -e 15 - -( 15, 14) Delay: 561.778 Error: 0.01016 -( 15, 16) Delay: 512.000 Error: 0.00690 -( 15, 24) Delay: 561.778 Error: 1.00000 -Total #Edges: 3 - -qsyn> device --> #Device: 2 --> Now focused on: Device 0 (ibm_ithaca) - -qsyn> device list -★ 0 ibm_ithaca #Q: 65 - 1 example_topology #Q: 3 - -qsyn> device print -p 0 64 - -Path from 0 to 64: - 0 1 2 3 4 11 17 18 19 25 - 33 34 35 40 49 50 51 54 64 -qsyn> device print -p 12 56 - -Path from 12 to 56: - 12 21 20 19 25 33 32 31 39 45 - 44 43 52 56 -qsyn> device print -p 35 21 - -Path from 35 to 21: - 35 34 33 25 19 20 21 -qsyn> device print -p 33 33 - -Path from 33 to 33: - 33 -qsyn> quit -f - diff --git a/uv.lock b/uv.lock new file mode 100644 index 000000000..9ba54e3e6 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1021 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "certifi" +version = "2026.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, + { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, + { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, +] + +[[package]] +name = "cryptography" +version = "46.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/19/f748958276519adf6a0c1e79e7b8860b4830dda55ccdf29f2719b5fc499c/cryptography-46.0.4.tar.gz", hash = "sha256:bfd019f60f8abc2ed1b9be4ddc21cfef059c841d86d710bb69909a688cbb8f59", size = 749301, upload-time = "2026-01-28T00:24:37.379Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/99/157aae7949a5f30d51fcb1a9851e8ebd5c74bf99b5285d8bb4b8b9ee641e/cryptography-46.0.4-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:281526e865ed4166009e235afadf3a4c4cba6056f99336a99efba65336fd5485", size = 7173686, upload-time = "2026-01-28T00:23:07.515Z" }, + { url = "https://files.pythonhosted.org/packages/87/91/874b8910903159043b5c6a123b7e79c4559ddd1896e38967567942635778/cryptography-46.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f14fba5bf6f4390d7ff8f086c566454bff0411f6d8aa7af79c88b6f9267aecc", size = 4275871, upload-time = "2026-01-28T00:23:09.439Z" }, + { url = "https://files.pythonhosted.org/packages/c0/35/690e809be77896111f5b195ede56e4b4ed0435b428c2f2b6d35046fbb5e8/cryptography-46.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47bcd19517e6389132f76e2d5303ded6cf3f78903da2158a671be8de024f4cd0", size = 4423124, upload-time = "2026-01-28T00:23:11.529Z" }, + { url = "https://files.pythonhosted.org/packages/1a/5b/a26407d4f79d61ca4bebaa9213feafdd8806dc69d3d290ce24996d3cfe43/cryptography-46.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:01df4f50f314fbe7009f54046e908d1754f19d0c6d3070df1e6268c5a4af09fa", size = 4277090, upload-time = "2026-01-28T00:23:13.123Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d8/4bb7aec442a9049827aa34cee1aa83803e528fa55da9a9d45d01d1bb933e/cryptography-46.0.4-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5aa3e463596b0087b3da0dbe2b2487e9fc261d25da85754e30e3b40637d61f81", size = 4947652, upload-time = "2026-01-28T00:23:14.554Z" }, + { url = "https://files.pythonhosted.org/packages/2b/08/f83e2e0814248b844265802d081f2fac2f1cbe6cd258e72ba14ff006823a/cryptography-46.0.4-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0a9ad24359fee86f131836a9ac3bffc9329e956624a2d379b613f8f8abaf5255", size = 4455157, upload-time = "2026-01-28T00:23:16.443Z" }, + { url = "https://files.pythonhosted.org/packages/0a/05/19d849cf4096448779d2dcc9bb27d097457dac36f7273ffa875a93b5884c/cryptography-46.0.4-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:dc1272e25ef673efe72f2096e92ae39dea1a1a450dd44918b15351f72c5a168e", size = 3981078, upload-time = "2026-01-28T00:23:17.838Z" }, + { url = "https://files.pythonhosted.org/packages/e6/89/f7bac81d66ba7cde867a743ea5b37537b32b5c633c473002b26a226f703f/cryptography-46.0.4-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:de0f5f4ec8711ebc555f54735d4c673fc34b65c44283895f1a08c2b49d2fd99c", size = 4276213, upload-time = "2026-01-28T00:23:19.257Z" }, + { url = "https://files.pythonhosted.org/packages/da/9f/7133e41f24edd827020ad21b068736e792bc68eecf66d93c924ad4719fb3/cryptography-46.0.4-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:eeeb2e33d8dbcccc34d64651f00a98cb41b2dc69cef866771a5717e6734dfa32", size = 4912190, upload-time = "2026-01-28T00:23:21.244Z" }, + { url = "https://files.pythonhosted.org/packages/a6/f7/6d43cbaddf6f65b24816e4af187d211f0bc536a29961f69faedc48501d8e/cryptography-46.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3d425eacbc9aceafd2cb429e42f4e5d5633c6f873f5e567077043ef1b9bbf616", size = 4454641, upload-time = "2026-01-28T00:23:22.866Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4f/ebd0473ad656a0ac912a16bd07db0f5d85184924e14fc88feecae2492834/cryptography-46.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91627ebf691d1ea3976a031b61fb7bac1ccd745afa03602275dda443e11c8de0", size = 4405159, upload-time = "2026-01-28T00:23:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/d1/f7/7923886f32dc47e27adeff8246e976d77258fd2aa3efdd1754e4e323bf49/cryptography-46.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2d08bc22efd73e8854b0b7caff402d735b354862f1145d7be3b9c0f740fef6a0", size = 4666059, upload-time = "2026-01-28T00:23:26.766Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a7/0fca0fd3591dffc297278a61813d7f661a14243dd60f499a7a5b48acb52a/cryptography-46.0.4-cp311-abi3-win32.whl", hash = "sha256:82a62483daf20b8134f6e92898da70d04d0ef9a75829d732ea1018678185f4f5", size = 3026378, upload-time = "2026-01-28T00:23:28.317Z" }, + { url = "https://files.pythonhosted.org/packages/2d/12/652c84b6f9873f0909374864a57b003686c642ea48c84d6c7e2c515e6da5/cryptography-46.0.4-cp311-abi3-win_amd64.whl", hash = "sha256:6225d3ebe26a55dbc8ead5ad1265c0403552a63336499564675b29eb3184c09b", size = 3478614, upload-time = "2026-01-28T00:23:30.275Z" }, + { url = "https://files.pythonhosted.org/packages/b9/27/542b029f293a5cce59349d799d4d8484b3b1654a7b9a0585c266e974a488/cryptography-46.0.4-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:485e2b65d25ec0d901bca7bcae0f53b00133bf3173916d8e421f6fddde103908", size = 7116417, upload-time = "2026-01-28T00:23:31.958Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f5/559c25b77f40b6bf828eabaf988efb8b0e17b573545edb503368ca0a2a03/cryptography-46.0.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:078e5f06bd2fa5aea5a324f2a09f914b1484f1d0c2a4d6a8a28c74e72f65f2da", size = 4264508, upload-time = "2026-01-28T00:23:34.264Z" }, + { url = "https://files.pythonhosted.org/packages/49/a1/551fa162d33074b660dc35c9bc3616fefa21a0e8c1edd27b92559902e408/cryptography-46.0.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dce1e4f068f03008da7fa51cc7abc6ddc5e5de3e3d1550334eaf8393982a5829", size = 4409080, upload-time = "2026-01-28T00:23:35.793Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/4d8d129a755f5d6df1bbee69ea2f35ebfa954fa1847690d1db2e8bca46a5/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2067461c80271f422ee7bdbe79b9b4be54a5162e90345f86a23445a0cf3fd8a2", size = 4270039, upload-time = "2026-01-28T00:23:37.263Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f5/ed3fcddd0a5e39321e595e144615399e47e7c153a1fb8c4862aec3151ff9/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:c92010b58a51196a5f41c3795190203ac52edfd5dc3ff99149b4659eba9d2085", size = 4926748, upload-time = "2026-01-28T00:23:38.884Z" }, + { url = "https://files.pythonhosted.org/packages/43/ae/9f03d5f0c0c00e85ecb34f06d3b79599f20630e4db91b8a6e56e8f83d410/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:829c2b12bbc5428ab02d6b7f7e9bbfd53e33efd6672d21341f2177470171ad8b", size = 4442307, upload-time = "2026-01-28T00:23:40.56Z" }, + { url = "https://files.pythonhosted.org/packages/8b/22/e0f9f2dae8040695103369cf2283ef9ac8abe4d51f68710bec2afd232609/cryptography-46.0.4-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:62217ba44bf81b30abaeda1488686a04a702a261e26f87db51ff61d9d3510abd", size = 3959253, upload-time = "2026-01-28T00:23:42.827Z" }, + { url = "https://files.pythonhosted.org/packages/01/5b/6a43fcccc51dae4d101ac7d378a8724d1ba3de628a24e11bf2f4f43cba4d/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:9c2da296c8d3415b93e6053f5a728649a87a48ce084a9aaf51d6e46c87c7f2d2", size = 4269372, upload-time = "2026-01-28T00:23:44.655Z" }, + { url = "https://files.pythonhosted.org/packages/17/b7/0f6b8c1dd0779df2b526e78978ff00462355e31c0a6f6cff8a3e99889c90/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:9b34d8ba84454641a6bf4d6762d15847ecbd85c1316c0a7984e6e4e9f748ec2e", size = 4891908, upload-time = "2026-01-28T00:23:46.48Z" }, + { url = "https://files.pythonhosted.org/packages/83/17/259409b8349aa10535358807a472c6a695cf84f106022268d31cea2b6c97/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:df4a817fa7138dd0c96c8c8c20f04b8aaa1fac3bbf610913dcad8ea82e1bfd3f", size = 4441254, upload-time = "2026-01-28T00:23:48.403Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fe/e4a1b0c989b00cee5ffa0764401767e2d1cf59f45530963b894129fd5dce/cryptography-46.0.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b1de0ebf7587f28f9190b9cb526e901bf448c9e6a99655d2b07fff60e8212a82", size = 4396520, upload-time = "2026-01-28T00:23:50.26Z" }, + { url = "https://files.pythonhosted.org/packages/b3/81/ba8fd9657d27076eb40d6a2f941b23429a3c3d2f56f5a921d6b936a27bc9/cryptography-46.0.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9b4d17bc7bd7cdd98e3af40b441feaea4c68225e2eb2341026c84511ad246c0c", size = 4651479, upload-time = "2026-01-28T00:23:51.674Z" }, + { url = "https://files.pythonhosted.org/packages/00/03/0de4ed43c71c31e4fe954edd50b9d28d658fef56555eba7641696370a8e2/cryptography-46.0.4-cp314-cp314t-win32.whl", hash = "sha256:c411f16275b0dea722d76544a61d6421e2cc829ad76eec79280dbdc9ddf50061", size = 3001986, upload-time = "2026-01-28T00:23:53.485Z" }, + { url = "https://files.pythonhosted.org/packages/5c/70/81830b59df7682917d7a10f833c4dab2a5574cd664e86d18139f2b421329/cryptography-46.0.4-cp314-cp314t-win_amd64.whl", hash = "sha256:728fedc529efc1439eb6107b677f7f7558adab4553ef8669f0d02d42d7b959a7", size = 3468288, upload-time = "2026-01-28T00:23:55.09Z" }, + { url = "https://files.pythonhosted.org/packages/56/f7/f648fdbb61d0d45902d3f374217451385edc7e7768d1b03ff1d0e5ffc17b/cryptography-46.0.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a9556ba711f7c23f77b151d5798f3ac44a13455cc68db7697a1096e6d0563cab", size = 7169583, upload-time = "2026-01-28T00:23:56.558Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cc/8f3224cbb2a928de7298d6ed4790f5ebc48114e02bdc9559196bfb12435d/cryptography-46.0.4-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8bf75b0259e87fa70bddc0b8b4078b76e7fd512fd9afae6c1193bcf440a4dbef", size = 4275419, upload-time = "2026-01-28T00:23:58.364Z" }, + { url = "https://files.pythonhosted.org/packages/17/43/4a18faa7a872d00e4264855134ba82d23546c850a70ff209e04ee200e76f/cryptography-46.0.4-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3c268a3490df22270955966ba236d6bc4a8f9b6e4ffddb78aac535f1a5ea471d", size = 4419058, upload-time = "2026-01-28T00:23:59.867Z" }, + { url = "https://files.pythonhosted.org/packages/ee/64/6651969409821d791ba12346a124f55e1b76f66a819254ae840a965d4b9c/cryptography-46.0.4-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:812815182f6a0c1d49a37893a303b44eaac827d7f0d582cecfc81b6427f22973", size = 4278151, upload-time = "2026-01-28T00:24:01.731Z" }, + { url = "https://files.pythonhosted.org/packages/20/0b/a7fce65ee08c3c02f7a8310cc090a732344066b990ac63a9dfd0a655d321/cryptography-46.0.4-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:a90e43e3ef65e6dcf969dfe3bb40cbf5aef0d523dff95bfa24256be172a845f4", size = 4939441, upload-time = "2026-01-28T00:24:03.175Z" }, + { url = "https://files.pythonhosted.org/packages/db/a7/20c5701e2cd3e1dfd7a19d2290c522a5f435dd30957d431dcb531d0f1413/cryptography-46.0.4-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a05177ff6296644ef2876fce50518dffb5bcdf903c85250974fc8bc85d54c0af", size = 4451617, upload-time = "2026-01-28T00:24:05.403Z" }, + { url = "https://files.pythonhosted.org/packages/00/dc/3e16030ea9aa47b63af6524c354933b4fb0e352257c792c4deeb0edae367/cryptography-46.0.4-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:daa392191f626d50f1b136c9b4cf08af69ca8279d110ea24f5c2700054d2e263", size = 3977774, upload-time = "2026-01-28T00:24:06.851Z" }, + { url = "https://files.pythonhosted.org/packages/42/c8/ad93f14118252717b465880368721c963975ac4b941b7ef88f3c56bf2897/cryptography-46.0.4-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e07ea39c5b048e085f15923511d8121e4a9dc45cee4e3b970ca4f0d338f23095", size = 4277008, upload-time = "2026-01-28T00:24:08.926Z" }, + { url = "https://files.pythonhosted.org/packages/00/cf/89c99698151c00a4631fbfcfcf459d308213ac29e321b0ff44ceeeac82f1/cryptography-46.0.4-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d5a45ddc256f492ce42a4e35879c5e5528c09cd9ad12420828c972951d8e016b", size = 4903339, upload-time = "2026-01-28T00:24:12.009Z" }, + { url = "https://files.pythonhosted.org/packages/03/c3/c90a2cb358de4ac9309b26acf49b2a100957e1ff5cc1e98e6c4996576710/cryptography-46.0.4-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:6bb5157bf6a350e5b28aee23beb2d84ae6f5be390b2f8ee7ea179cda077e1019", size = 4451216, upload-time = "2026-01-28T00:24:13.975Z" }, + { url = "https://files.pythonhosted.org/packages/96/2c/8d7f4171388a10208671e181ca43cdc0e596d8259ebacbbcfbd16de593da/cryptography-46.0.4-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dd5aba870a2c40f87a3af043e0dee7d9eb02d4aff88a797b48f2b43eff8c3ab4", size = 4404299, upload-time = "2026-01-28T00:24:16.169Z" }, + { url = "https://files.pythonhosted.org/packages/e9/23/cbb2036e450980f65c6e0a173b73a56ff3bccd8998965dea5cc9ddd424a5/cryptography-46.0.4-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:93d8291da8d71024379ab2cb0b5c57915300155ad42e07f76bea6ad838d7e59b", size = 4664837, upload-time = "2026-01-28T00:24:17.629Z" }, + { url = "https://files.pythonhosted.org/packages/0a/21/f7433d18fe6d5845329cbdc597e30caf983229c7a245bcf54afecc555938/cryptography-46.0.4-cp38-abi3-win32.whl", hash = "sha256:0563655cb3c6d05fb2afe693340bc050c30f9f34e15763361cf08e94749401fc", size = 3009779, upload-time = "2026-01-28T00:24:20.198Z" }, + { url = "https://files.pythonhosted.org/packages/3a/6a/bd2e7caa2facffedf172a45c1a02e551e6d7d4828658c9a245516a598d94/cryptography-46.0.4-cp38-abi3-win_amd64.whl", hash = "sha256:fa0900b9ef9c49728887d1576fd8d9e7e3ea872fa9b25ef9b64888adc434e976", size = 3466633, upload-time = "2026-01-28T00:24:21.851Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "dill" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/e1/56027a71e31b02ddc53c7d65b01e68edf64dea2932122fe7746a516f75d5/dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa", size = 187315, upload-time = "2026-01-19T02:36:56.85Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", size = 120019, upload-time = "2026-01-19T02:36:55.663Z" }, +] + +[[package]] +name = "dotenv" +version = "0.9.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dotenv" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/b7/545d2c10c1fc15e48653c91efde329a790f2eecfbbf2bd16003b5db2bab0/dotenv-0.9.9-py2.py3-none-any.whl", hash = "sha256:29cf74a087b31dafdb5a446b6d7e11cbce8ed2741540e2339c69fbef92c94ce9", size = 1892, upload-time = "2025-02-19T22:15:01.647Z" }, +] + +[[package]] +name = "fonttools" +version = "4.61.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" }, + { url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" }, + { url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" }, + { url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" }, + { url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" }, + { url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" }, + { url = "https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c", size = 2846454, upload-time = "2025-12-12T17:30:24.938Z" }, + { url = "https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e", size = 2398191, upload-time = "2025-12-12T17:30:27.343Z" }, + { url = "https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5", size = 4928410, upload-time = "2025-12-12T17:30:29.771Z" }, + { url = "https://files.pythonhosted.org/packages/b0/8d/6fb3494dfe61a46258cd93d979cf4725ded4eb46c2a4ca35e4490d84daea/fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd", size = 4984460, upload-time = "2025-12-12T17:30:32.073Z" }, + { url = "https://files.pythonhosted.org/packages/f7/f1/a47f1d30b3dc00d75e7af762652d4cbc3dff5c2697a0dbd5203c81afd9c3/fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3", size = 4925800, upload-time = "2025-12-12T17:30:34.339Z" }, + { url = "https://files.pythonhosted.org/packages/a7/01/e6ae64a0981076e8a66906fab01539799546181e32a37a0257b77e4aa88b/fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d", size = 5067859, upload-time = "2025-12-12T17:30:36.593Z" }, + { url = "https://files.pythonhosted.org/packages/73/aa/28e40b8d6809a9b5075350a86779163f074d2b617c15d22343fce81918db/fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c", size = 2267821, upload-time = "2025-12-12T17:30:38.478Z" }, + { url = "https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b", size = 2318169, upload-time = "2025-12-12T17:30:40.951Z" }, + { url = "https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd", size = 2846094, upload-time = "2025-12-12T17:30:43.511Z" }, + { url = "https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e", size = 2396589, upload-time = "2025-12-12T17:30:45.681Z" }, + { url = "https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c", size = 4877892, upload-time = "2025-12-12T17:30:47.709Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ec/9e6b38c7ba1e09eb51db849d5450f4c05b7e78481f662c3b79dbde6f3d04/fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75", size = 4972884, upload-time = "2025-12-12T17:30:49.656Z" }, + { url = "https://files.pythonhosted.org/packages/5e/87/b5339da8e0256734ba0dbbf5b6cdebb1dd79b01dc8c270989b7bcd465541/fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063", size = 4924405, upload-time = "2025-12-12T17:30:51.735Z" }, + { url = "https://files.pythonhosted.org/packages/0b/47/e3409f1e1e69c073a3a6fd8cb886eb18c0bae0ee13db2c8d5e7f8495e8b7/fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2", size = 5035553, upload-time = "2025-12-12T17:30:54.823Z" }, + { url = "https://files.pythonhosted.org/packages/bf/b6/1f6600161b1073a984294c6c031e1a56ebf95b6164249eecf30012bb2e38/fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c", size = 2271915, upload-time = "2025-12-12T17:30:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c", size = 2323487, upload-time = "2025-12-12T17:30:59.804Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/908ad78e46c61c3e3ed70c3b58ff82ab48437faf84ec84f109592cabbd9f/fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa", size = 2929571, upload-time = "2025-12-12T17:31:02.574Z" }, + { url = "https://files.pythonhosted.org/packages/bd/41/975804132c6dea64cdbfbaa59f3518a21c137a10cccf962805b301ac6ab2/fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91", size = 2435317, upload-time = "2025-12-12T17:31:04.974Z" }, + { url = "https://files.pythonhosted.org/packages/b0/5a/aef2a0a8daf1ebaae4cfd83f84186d4a72ee08fd6a8451289fcd03ffa8a4/fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19", size = 4882124, upload-time = "2025-12-12T17:31:07.456Z" }, + { url = "https://files.pythonhosted.org/packages/80/33/d6db3485b645b81cea538c9d1c9219d5805f0877fda18777add4671c5240/fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba", size = 5100391, upload-time = "2025-12-12T17:31:09.732Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d6/675ba631454043c75fcf76f0ca5463eac8eb0666ea1d7badae5fea001155/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7", size = 4978800, upload-time = "2025-12-12T17:31:11.681Z" }, + { url = "https://files.pythonhosted.org/packages/7f/33/d3ec753d547a8d2bdaedd390d4a814e8d5b45a093d558f025c6b990b554c/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118", size = 5006426, upload-time = "2025-12-12T17:31:13.764Z" }, + { url = "https://files.pythonhosted.org/packages/b4/40/cc11f378b561a67bea850ab50063366a0d1dd3f6d0a30ce0f874b0ad5664/fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5", size = 2335377, upload-time = "2025-12-12T17:31:16.49Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ff/c9a2b66b39f8628531ea58b320d66d951267c98c6a38684daa8f50fb02f8/fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b", size = 2400613, upload-time = "2025-12-12T17:31:18.769Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" }, +] + +[[package]] +name = "ibm-cloud-sdk-core" +version = "3.24.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyjwt" }, + { name = "python-dateutil" }, + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4a/0c/965f4f4b34f1a9a2210bec224ac489c631153f18ef75c6e694750efda654/ibm_cloud_sdk_core-3.24.4.tar.gz", hash = "sha256:20498959ce0177a58938e1855ee09f08b9712e43cc3209e95010c046e8c6d2a6", size = 81778, upload-time = "2026-02-03T08:44:42.217Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/8d/90cf967468fd81f9fd22bd42dbf3b1fbb1234485d1f81b6f17c8de138fff/ibm_cloud_sdk_core-3.24.4-py3-none-any.whl", hash = "sha256:4c3487ed5eb5180770ea2d07d95cfed1e69002ed249bbbc7d155226985c0b785", size = 75786, upload-time = "2026-02-03T08:44:41.094Z" }, +] + +[[package]] +name = "ibm-platform-services" +version = "0.73.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ibm-cloud-sdk-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/3d/dc6a288298d424665647859f3d3627740a2166b3363dbba314bf946e9d9a/ibm_platform_services-0.73.2.tar.gz", hash = "sha256:0a80097705747421f557a36484b541e9664a0166bf87e389bc2dcb53df5263b2", size = 361421, upload-time = "2026-02-03T11:42:06.775Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/10/ae4495b41aace6e142aec29aa4c1ccd0d002f9f2ac2b0a7acfb0025b01e7/ibm_platform_services-0.73.2-py3-none-any.whl", hash = "sha256:e57f99bc83d9fc23199c1081ce718938f1e52d2b52abefc1a9b512b3c9ccd6d7", size = 378633, upload-time = "2026-02-03T11:42:05.257Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, + { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, + { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, + { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, + { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, + { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, + { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, + { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, + { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, + { url = "https://files.pythonhosted.org/packages/31/c1/c2686cda909742ab66c7388e9a1a8521a59eb89f8bcfbee28fc980d07e24/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", size = 123681, upload-time = "2025-08-10T21:26:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", size = 66464, upload-time = "2025-08-10T21:26:27.733Z" }, + { url = "https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", size = 64961, upload-time = "2025-08-10T21:26:28.729Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", size = 1474607, upload-time = "2025-08-10T21:26:29.798Z" }, + { url = "https://files.pythonhosted.org/packages/d9/28/aac26d4c882f14de59041636292bc838db8961373825df23b8eeb807e198/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", size = 1276546, upload-time = "2025-08-10T21:26:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ad/8bfc1c93d4cc565e5069162f610ba2f48ff39b7de4b5b8d93f69f30c4bed/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", size = 1294482, upload-time = "2025-08-10T21:26:32.721Z" }, + { url = "https://files.pythonhosted.org/packages/da/f1/6aca55ff798901d8ce403206d00e033191f63d82dd708a186e0ed2067e9c/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", size = 1343720, upload-time = "2025-08-10T21:26:34.032Z" }, + { url = "https://files.pythonhosted.org/packages/d1/91/eed031876c595c81d90d0f6fc681ece250e14bf6998c3d7c419466b523b7/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", size = 2224907, upload-time = "2025-08-10T21:26:35.824Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ec/4d1925f2e49617b9cca9c34bfa11adefad49d00db038e692a559454dfb2e/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", size = 2321334, upload-time = "2025-08-10T21:26:37.534Z" }, + { url = "https://files.pythonhosted.org/packages/43/cb/450cd4499356f68802750c6ddc18647b8ea01ffa28f50d20598e0befe6e9/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", size = 2488313, upload-time = "2025-08-10T21:26:39.191Z" }, + { url = "https://files.pythonhosted.org/packages/71/67/fc76242bd99f885651128a5d4fa6083e5524694b7c88b489b1b55fdc491d/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", size = 2291970, upload-time = "2025-08-10T21:26:40.828Z" }, + { url = "https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", size = 73894, upload-time = "2025-08-10T21:26:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/dce480814d25b99a391abbddadc78f7c117c6da34be68ca8b02d5848b424/kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", size = 64995, upload-time = "2025-08-10T21:26:43.889Z" }, + { url = "https://files.pythonhosted.org/packages/e2/37/7d218ce5d92dadc5ebdd9070d903e0c7cf7edfe03f179433ac4d13ce659c/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", size = 126510, upload-time = "2025-08-10T21:26:44.915Z" }, + { url = "https://files.pythonhosted.org/packages/23/b0/e85a2b48233daef4b648fb657ebbb6f8367696a2d9548a00b4ee0eb67803/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", size = 67903, upload-time = "2025-08-10T21:26:45.934Z" }, + { url = "https://files.pythonhosted.org/packages/44/98/f2425bc0113ad7de24da6bb4dae1343476e95e1d738be7c04d31a5d037fd/kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", size = 66402, upload-time = "2025-08-10T21:26:47.101Z" }, + { url = "https://files.pythonhosted.org/packages/98/d8/594657886df9f34c4177cc353cc28ca7e6e5eb562d37ccc233bff43bbe2a/kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", size = 1582135, upload-time = "2025-08-10T21:26:48.665Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c6/38a115b7170f8b306fc929e166340c24958347308ea3012c2b44e7e295db/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", size = 1389409, upload-time = "2025-08-10T21:26:50.335Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3b/e04883dace81f24a568bcee6eb3001da4ba05114afa622ec9b6fafdc1f5e/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", size = 1401763, upload-time = "2025-08-10T21:26:51.867Z" }, + { url = "https://files.pythonhosted.org/packages/9f/80/20ace48e33408947af49d7d15c341eaee69e4e0304aab4b7660e234d6288/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", size = 1453643, upload-time = "2025-08-10T21:26:53.592Z" }, + { url = "https://files.pythonhosted.org/packages/64/31/6ce4380a4cd1f515bdda976a1e90e547ccd47b67a1546d63884463c92ca9/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", size = 2330818, upload-time = "2025-08-10T21:26:55.051Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e9/3f3fcba3bcc7432c795b82646306e822f3fd74df0ee81f0fa067a1f95668/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", size = 2419963, upload-time = "2025-08-10T21:26:56.421Z" }, + { url = "https://files.pythonhosted.org/packages/99/43/7320c50e4133575c66e9f7dadead35ab22d7c012a3b09bb35647792b2a6d/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", size = 2594639, upload-time = "2025-08-10T21:26:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/65/d6/17ae4a270d4a987ef8a385b906d2bdfc9fce502d6dc0d3aea865b47f548c/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", size = 2391741, upload-time = "2025-08-10T21:26:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8f/8f6f491d595a9e5912971f3f863d81baddccc8a4d0c3749d6a0dd9ffc9df/kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", size = 68646, upload-time = "2025-08-10T21:27:00.52Z" }, + { url = "https://files.pythonhosted.org/packages/6b/32/6cc0fbc9c54d06c2969faa9c1d29f5751a2e51809dd55c69055e62d9b426/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", size = 123806, upload-time = "2025-08-10T21:27:01.537Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", size = 66605, upload-time = "2025-08-10T21:27:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", size = 64925, upload-time = "2025-08-10T21:27:04.339Z" }, + { url = "https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", size = 1472414, upload-time = "2025-08-10T21:27:05.437Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/93fa64a81db304ac8a246f834d5094fae4b13baf53c839d6bb6e81177129/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", size = 1281272, upload-time = "2025-08-10T21:27:07.063Z" }, + { url = "https://files.pythonhosted.org/packages/70/e6/6df102916960fb8d05069d4bd92d6d9a8202d5a3e2444494e7cd50f65b7a/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", size = 1298578, upload-time = "2025-08-10T21:27:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/7c/47/e142aaa612f5343736b087864dbaebc53ea8831453fb47e7521fa8658f30/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", size = 1345607, upload-time = "2025-08-10T21:27:10.125Z" }, + { url = "https://files.pythonhosted.org/packages/54/89/d641a746194a0f4d1a3670fb900d0dbaa786fb98341056814bc3f058fa52/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", size = 2230150, upload-time = "2025-08-10T21:27:11.484Z" }, + { url = "https://files.pythonhosted.org/packages/aa/6b/5ee1207198febdf16ac11f78c5ae40861b809cbe0e6d2a8d5b0b3044b199/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", size = 2325979, upload-time = "2025-08-10T21:27:12.917Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ff/b269eefd90f4ae14dcc74973d5a0f6d28d3b9bb1afd8c0340513afe6b39a/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", size = 2491456, upload-time = "2025-08-10T21:27:14.353Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d4/10303190bd4d30de547534601e259a4fbf014eed94aae3e5521129215086/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", size = 2294621, upload-time = "2025-08-10T21:27:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", size = 75417, upload-time = "2025-08-10T21:27:17.436Z" }, + { url = "https://files.pythonhosted.org/packages/1f/10/6949958215b7a9a264299a7db195564e87900f709db9245e4ebdd3c70779/kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", size = 66582, upload-time = "2025-08-10T21:27:18.436Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/60e53067903d3bc5469b369fe0dfc6b3482e2133e85dae9daa9527535991/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", size = 126514, upload-time = "2025-08-10T21:27:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/25/d1/4843d3e8d46b072c12a38c97c57fab4608d36e13fe47d47ee96b4d61ba6f/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", size = 67905, upload-time = "2025-08-10T21:27:20.51Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ae/29ffcbd239aea8b93108de1278271ae764dfc0d803a5693914975f200596/kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", size = 66399, upload-time = "2025-08-10T21:27:21.496Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ae/d7ba902aa604152c2ceba5d352d7b62106bedbccc8e95c3934d94472bfa3/kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", size = 1582197, upload-time = "2025-08-10T21:27:22.604Z" }, + { url = "https://files.pythonhosted.org/packages/f2/41/27c70d427eddb8bc7e4f16420a20fefc6f480312122a59a959fdfe0445ad/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", size = 1390125, upload-time = "2025-08-10T21:27:24.036Z" }, + { url = "https://files.pythonhosted.org/packages/41/42/b3799a12bafc76d962ad69083f8b43b12bf4fe78b097b12e105d75c9b8f1/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", size = 1402612, upload-time = "2025-08-10T21:27:25.773Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b5/a210ea073ea1cfaca1bb5c55a62307d8252f531beb364e18aa1e0888b5a0/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", size = 1453990, upload-time = "2025-08-10T21:27:27.089Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ce/a829eb8c033e977d7ea03ed32fb3c1781b4fa0433fbadfff29e39c676f32/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", size = 2331601, upload-time = "2025-08-10T21:27:29.343Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4b/b5e97eb142eb9cd0072dacfcdcd31b1c66dc7352b0f7c7255d339c0edf00/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", size = 2422041, upload-time = "2025-08-10T21:27:30.754Z" }, + { url = "https://files.pythonhosted.org/packages/40/be/8eb4cd53e1b85ba4edc3a9321666f12b83113a178845593307a3e7891f44/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", size = 2594897, upload-time = "2025-08-10T21:27:32.803Z" }, + { url = "https://files.pythonhosted.org/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", size = 2391835, upload-time = "2025-08-10T21:27:34.23Z" }, + { url = "https://files.pythonhosted.org/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", size = 79988, upload-time = "2025-08-10T21:27:35.587Z" }, + { url = "https://files.pythonhosted.org/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", size = 70260, upload-time = "2025-08-10T21:27:36.606Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" }, + { url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" }, + { url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" }, + { url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" }, + { url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6", size = 8261076, upload-time = "2025-12-10T22:55:44.648Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1", size = 8148794, upload-time = "2025-12-10T22:55:46.252Z" }, + { url = "https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486", size = 8718474, upload-time = "2025-12-10T22:55:47.864Z" }, + { url = "https://files.pythonhosted.org/packages/01/be/cd478f4b66f48256f42927d0acbcd63a26a893136456cd079c0cc24fbabf/matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce", size = 9549637, upload-time = "2025-12-10T22:55:50.048Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/8dc289776eae5109e268c4fb92baf870678dc048a25d4ac903683b86d5bf/matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6", size = 9613678, upload-time = "2025-12-10T22:55:52.21Z" }, + { url = "https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149", size = 8142686, upload-time = "2025-12-10T22:55:54.253Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/8d8a8730e968185514680c2a6625943f70269509c3dcfc0dcf7d75928cb8/matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645", size = 8012917, upload-time = "2025-12-10T22:55:56.268Z" }, + { url = "https://files.pythonhosted.org/packages/b5/27/51fe26e1062f298af5ef66343d8ef460e090a27fea73036c76c35821df04/matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077", size = 8305679, upload-time = "2025-12-10T22:55:57.856Z" }, + { url = "https://files.pythonhosted.org/packages/2c/1e/4de865bc591ac8e3062e835f42dd7fe7a93168d519557837f0e37513f629/matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22", size = 8198336, upload-time = "2025-12-10T22:55:59.371Z" }, + { url = "https://files.pythonhosted.org/packages/c6/cb/2f7b6e75fb4dce87ef91f60cac4f6e34f4c145ab036a22318ec837971300/matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39", size = 8731653, upload-time = "2025-12-10T22:56:01.032Z" }, + { url = "https://files.pythonhosted.org/packages/46/b3/bd9c57d6ba670a37ab31fb87ec3e8691b947134b201f881665b28cc039ff/matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565", size = 9561356, upload-time = "2025-12-10T22:56:02.95Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/8b94a481456dfc9dfe6e39e93b5ab376e50998cddfd23f4ae3b431708f16/matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a", size = 9614000, upload-time = "2025-12-10T22:56:05.411Z" }, + { url = "https://files.pythonhosted.org/packages/bd/cd/bc06149fe5585ba800b189a6a654a75f1f127e8aab02fd2be10df7fa500c/matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958", size = 8220043, upload-time = "2025-12-10T22:56:07.551Z" }, + { url = "https://files.pythonhosted.org/packages/e3/de/b22cf255abec916562cc04eef457c13e58a1990048de0c0c3604d082355e/matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5", size = 8062075, upload-time = "2025-12-10T22:56:09.178Z" }, + { url = "https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f", size = 8262481, upload-time = "2025-12-10T22:56:10.885Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b", size = 8151473, upload-time = "2025-12-10T22:56:12.377Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6f/009d129ae70b75e88cbe7e503a12a4c0670e08ed748a902c2568909e9eb5/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d", size = 9553896, upload-time = "2025-12-10T22:56:14.432Z" }, + { url = "https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008", size = 9824193, upload-time = "2025-12-10T22:56:16.29Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/3abf75f38605772cf48a9daf5821cd4f563472f38b4b828c6fba6fa6d06e/matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c", size = 9615444, upload-time = "2025-12-10T22:56:18.155Z" }, + { url = "https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11", size = 8272719, upload-time = "2025-12-10T22:56:20.366Z" }, + { url = "https://files.pythonhosted.org/packages/69/ce/b006495c19ccc0a137b48083168a37bd056392dee02f87dba0472f2797fe/matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8", size = 8144205, upload-time = "2025-12-10T22:56:22.239Z" }, + { url = "https://files.pythonhosted.org/packages/68/d9/b31116a3a855bd313c6fcdb7226926d59b041f26061c6c5b1be66a08c826/matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50", size = 8305785, upload-time = "2025-12-10T22:56:24.218Z" }, + { url = "https://files.pythonhosted.org/packages/1e/90/6effe8103f0272685767ba5f094f453784057072f49b393e3ea178fe70a5/matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908", size = 8198361, upload-time = "2025-12-10T22:56:26.787Z" }, + { url = "https://files.pythonhosted.org/packages/d7/65/a73188711bea603615fc0baecca1061429ac16940e2385433cc778a9d8e7/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a", size = 9561357, upload-time = "2025-12-10T22:56:28.953Z" }, + { url = "https://files.pythonhosted.org/packages/f4/3d/b5c5d5d5be8ce63292567f0e2c43dde9953d3ed86ac2de0a72e93c8f07a1/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1", size = 9823610, upload-time = "2025-12-10T22:56:31.455Z" }, + { url = "https://files.pythonhosted.org/packages/4d/4b/e7beb6bbd49f6bae727a12b270a2654d13c397576d25bd6786e47033300f/matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c", size = 9614011, upload-time = "2025-12-10T22:56:33.85Z" }, + { url = "https://files.pythonhosted.org/packages/7c/e6/76f2813d31f032e65f6f797e3f2f6e4aab95b65015924b1c51370395c28a/matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b", size = 8362801, upload-time = "2025-12-10T22:56:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/5d/49/d651878698a0b67f23aa28e17f45a6d6dd3d3f933fa29087fa4ce5947b5a/matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f", size = 8192560, upload-time = "2025-12-10T22:56:38.008Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651, upload-time = "2026-01-31T23:13:10.135Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a", size = 16667963, upload-time = "2026-01-31T23:10:52.147Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1", size = 14693571, upload-time = "2026-01-31T23:10:54.789Z" }, + { url = "https://files.pythonhosted.org/packages/2f/20/18026832b1845cdc82248208dd929ca14c9d8f2bac391f67440707fff27c/numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e", size = 5203469, upload-time = "2026-01-31T23:10:57.343Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/2eb97c8a77daaba34eaa3fa7241a14ac5f51c46a6bd5911361b644c4a1e2/numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27", size = 6550820, upload-time = "2026-01-31T23:10:59.429Z" }, + { url = "https://files.pythonhosted.org/packages/b1/91/b97fdfd12dc75b02c44e26c6638241cc004d4079a0321a69c62f51470c4c/numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548", size = 15663067, upload-time = "2026-01-31T23:11:01.291Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f", size = 16619782, upload-time = "2026-01-31T23:11:03.669Z" }, + { url = "https://files.pythonhosted.org/packages/b7/83/9751502164601a79e18847309f5ceec0b1446d7b6aa12305759b72cf98b2/numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460", size = 17013128, upload-time = "2026-01-31T23:11:05.913Z" }, + { url = "https://files.pythonhosted.org/packages/61/c4/c4066322256ec740acc1c8923a10047818691d2f8aec254798f3dd90f5f2/numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba", size = 18345324, upload-time = "2026-01-31T23:11:08.248Z" }, + { url = "https://files.pythonhosted.org/packages/ab/af/6157aa6da728fa4525a755bfad486ae7e3f76d4c1864138003eb84328497/numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f", size = 5960282, upload-time = "2026-01-31T23:11:10.497Z" }, + { url = "https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85", size = 12314210, upload-time = "2026-01-31T23:11:12.176Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a3/56c5c604fae6dd40fa2ed3040d005fca97e91bd320d232ac9931d77ba13c/numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa", size = 10220171, upload-time = "2026-01-31T23:11:14.684Z" }, + { url = "https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c", size = 16663696, upload-time = "2026-01-31T23:11:17.516Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979", size = 14688322, upload-time = "2026-01-31T23:11:19.883Z" }, + { url = "https://files.pythonhosted.org/packages/da/b4/f805ab79293c728b9a99438775ce51885fd4f31b76178767cfc718701a39/numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98", size = 5198157, upload-time = "2026-01-31T23:11:22.375Z" }, + { url = "https://files.pythonhosted.org/packages/74/09/826e4289844eccdcd64aac27d13b0fd3f32039915dd5b9ba01baae1f436c/numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef", size = 6546330, upload-time = "2026-01-31T23:11:23.958Z" }, + { url = "https://files.pythonhosted.org/packages/19/fb/cbfdbfa3057a10aea5422c558ac57538e6acc87ec1669e666d32ac198da7/numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7", size = 15660968, upload-time = "2026-01-31T23:11:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499", size = 16607311, upload-time = "2026-01-31T23:11:28.117Z" }, + { url = "https://files.pythonhosted.org/packages/14/d9/4b5adfc39a43fa6bf918c6d544bc60c05236cc2f6339847fc5b35e6cb5b0/numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb", size = 17012850, upload-time = "2026-01-31T23:11:30.888Z" }, + { url = "https://files.pythonhosted.org/packages/b7/20/adb6e6adde6d0130046e6fdfb7675cc62bc2f6b7b02239a09eb58435753d/numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7", size = 18334210, upload-time = "2026-01-31T23:11:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/78/0e/0a73b3dff26803a8c02baa76398015ea2a5434d9b8265a7898a6028c1591/numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110", size = 5958199, upload-time = "2026-01-31T23:11:35.385Z" }, + { url = "https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622", size = 12310848, upload-time = "2026-01-31T23:11:38.001Z" }, + { url = "https://files.pythonhosted.org/packages/6e/8d/6da186483e308da5da1cc6918ce913dcfe14ffde98e710bfeff2a6158d4e/numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71", size = 10221082, upload-time = "2026-01-31T23:11:40.392Z" }, + { url = "https://files.pythonhosted.org/packages/25/a1/9510aa43555b44781968935c7548a8926274f815de42ad3997e9e83680dd/numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262", size = 14815866, upload-time = "2026-01-31T23:11:42.495Z" }, + { url = "https://files.pythonhosted.org/packages/36/30/6bbb5e76631a5ae46e7923dd16ca9d3f1c93cfa8d4ed79a129814a9d8db3/numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913", size = 5325631, upload-time = "2026-01-31T23:11:44.7Z" }, + { url = "https://files.pythonhosted.org/packages/46/00/3a490938800c1923b567b3a15cd17896e68052e2145d8662aaf3e1ffc58f/numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab", size = 6646254, upload-time = "2026-01-31T23:11:46.341Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e9/fac0890149898a9b609caa5af7455a948b544746e4b8fe7c212c8edd71f8/numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82", size = 15720138, upload-time = "2026-01-31T23:11:48.082Z" }, + { url = "https://files.pythonhosted.org/packages/ea/5c/08887c54e68e1e28df53709f1893ce92932cc6f01f7c3d4dc952f61ffd4e/numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f", size = 16655398, upload-time = "2026-01-31T23:11:50.293Z" }, + { url = "https://files.pythonhosted.org/packages/4d/89/253db0fa0e66e9129c745e4ef25631dc37d5f1314dad2b53e907b8538e6d/numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554", size = 17079064, upload-time = "2026-01-31T23:11:52.927Z" }, + { url = "https://files.pythonhosted.org/packages/2a/d5/cbade46ce97c59c6c3da525e8d95b7abe8a42974a1dc5c1d489c10433e88/numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257", size = 18379680, upload-time = "2026-01-31T23:11:55.22Z" }, + { url = "https://files.pythonhosted.org/packages/40/62/48f99ae172a4b63d981babe683685030e8a3df4f246c893ea5c6ef99f018/numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657", size = 6082433, upload-time = "2026-01-31T23:11:58.096Z" }, + { url = "https://files.pythonhosted.org/packages/07/38/e054a61cfe48ad9f1ed0d188e78b7e26859d0b60ef21cd9de4897cdb5326/numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b", size = 12451181, upload-time = "2026-01-31T23:11:59.782Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a4/a05c3a6418575e185dd84d0b9680b6bb2e2dc3e4202f036b7b4e22d6e9dc/numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1", size = 10290756, upload-time = "2026-01-31T23:12:02.438Z" }, + { url = "https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b", size = 16663092, upload-time = "2026-01-31T23:12:04.521Z" }, + { url = "https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000", size = 14698770, upload-time = "2026-01-31T23:12:06.96Z" }, + { url = "https://files.pythonhosted.org/packages/fb/0b/f9e49ba6c923678ad5bc38181c08ac5e53b7a5754dbca8e581aa1a56b1ff/numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1", size = 5208562, upload-time = "2026-01-31T23:12:09.632Z" }, + { url = "https://files.pythonhosted.org/packages/7d/12/d7de8f6f53f9bb76997e5e4c069eda2051e3fe134e9181671c4391677bb2/numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74", size = 6543710, upload-time = "2026-01-31T23:12:11.969Z" }, + { url = "https://files.pythonhosted.org/packages/09/63/c66418c2e0268a31a4cf8a8b512685748200f8e8e8ec6c507ce14e773529/numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a", size = 15677205, upload-time = "2026-01-31T23:12:14.33Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325", size = 16611738, upload-time = "2026-01-31T23:12:16.525Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/39c4cdda9f019b609b5c473899d87abff092fc908cfe4d1ecb2fcff453b0/numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909", size = 17028888, upload-time = "2026-01-31T23:12:19.306Z" }, + { url = "https://files.pythonhosted.org/packages/da/b3/e84bb64bdfea967cc10950d71090ec2d84b49bc691df0025dddb7c26e8e3/numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a", size = 18339556, upload-time = "2026-01-31T23:12:21.816Z" }, + { url = "https://files.pythonhosted.org/packages/88/f5/954a291bc1192a27081706862ac62bb5920fbecfbaa302f64682aa90beed/numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a", size = 6006899, upload-time = "2026-01-31T23:12:24.14Z" }, + { url = "https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75", size = 12443072, upload-time = "2026-01-31T23:12:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/37/75/62726948db36a56428fce4ba80a115716dc4fad6a3a4352487f8bb950966/numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05", size = 10494886, upload-time = "2026-01-31T23:12:28.488Z" }, + { url = "https://files.pythonhosted.org/packages/36/2f/ee93744f1e0661dc267e4b21940870cabfae187c092e1433b77b09b50ac4/numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308", size = 14818567, upload-time = "2026-01-31T23:12:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/a7/24/6535212add7d76ff938d8bdc654f53f88d35cddedf807a599e180dcb8e66/numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef", size = 5328372, upload-time = "2026-01-31T23:12:32.962Z" }, + { url = "https://files.pythonhosted.org/packages/5e/9d/c48f0a035725f925634bf6b8994253b43f2047f6778a54147d7e213bc5a7/numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d", size = 6649306, upload-time = "2026-01-31T23:12:34.797Z" }, + { url = "https://files.pythonhosted.org/packages/81/05/7c73a9574cd4a53a25907bad38b59ac83919c0ddc8234ec157f344d57d9a/numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8", size = 15722394, upload-time = "2026-01-31T23:12:36.565Z" }, + { url = "https://files.pythonhosted.org/packages/35/fa/4de10089f21fc7d18442c4a767ab156b25c2a6eaf187c0db6d9ecdaeb43f/numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5", size = 16653343, upload-time = "2026-01-31T23:12:39.188Z" }, + { url = "https://files.pythonhosted.org/packages/b8/f9/d33e4ffc857f3763a57aa85650f2e82486832d7492280ac21ba9efda80da/numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e", size = 17078045, upload-time = "2026-01-31T23:12:42.041Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b8/54bdb43b6225badbea6389fa038c4ef868c44f5890f95dd530a218706da3/numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a", size = 18380024, upload-time = "2026-01-31T23:12:44.331Z" }, + { url = "https://files.pythonhosted.org/packages/a5/55/6e1a61ded7af8df04016d81b5b02daa59f2ea9252ee0397cb9f631efe9e5/numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443", size = 6153937, upload-time = "2026-01-31T23:12:47.229Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/fa6118d1ed6d776b0983f3ceac9b1a5558e80df9365b1c3aa6d42bf9eee4/numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236", size = 12631844, upload-time = "2026-01-31T23:12:48.997Z" }, + { url = "https://files.pythonhosted.org/packages/32/0a/2ec5deea6dcd158f254a7b372fb09cfba5719419c8d66343bab35237b3fb/numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181", size = 10565379, upload-time = "2026-01-31T23:12:51.345Z" }, +] + +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, +] + +[[package]] +name = "pillow" +version = "12.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/02/d52c733a2452ef1ffcc123b68e6606d07276b0e358db70eabad7e40042b7/pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9", size = 46977283, upload-time = "2026-01-02T09:13:29.892Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/31/dc53fe21a2f2996e1b7d92bf671cdb157079385183ef7c1ae08b485db510/pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b", size = 5262642, upload-time = "2026-01-02T09:11:10.138Z" }, + { url = "https://files.pythonhosted.org/packages/ab/c1/10e45ac9cc79419cedf5121b42dcca5a50ad2b601fa080f58c22fb27626e/pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551", size = 4657464, upload-time = "2026-01-02T09:11:12.319Z" }, + { url = "https://files.pythonhosted.org/packages/ad/26/7b82c0ab7ef40ebede7a97c72d473bda5950f609f8e0c77b04af574a0ddb/pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208", size = 6234878, upload-time = "2026-01-02T09:11:14.096Z" }, + { url = "https://files.pythonhosted.org/packages/76/25/27abc9792615b5e886ca9411ba6637b675f1b77af3104710ac7353fe5605/pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5", size = 8044868, upload-time = "2026-01-02T09:11:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ea/f200a4c36d836100e7bc738fc48cd963d3ba6372ebc8298a889e0cfc3359/pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661", size = 6349468, upload-time = "2026-01-02T09:11:17.631Z" }, + { url = "https://files.pythonhosted.org/packages/11/8f/48d0b77ab2200374c66d344459b8958c86693be99526450e7aee714e03e4/pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17", size = 7041518, upload-time = "2026-01-02T09:11:19.389Z" }, + { url = "https://files.pythonhosted.org/packages/1d/23/c281182eb986b5d31f0a76d2a2c8cd41722d6fb8ed07521e802f9bba52de/pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670", size = 6462829, upload-time = "2026-01-02T09:11:21.28Z" }, + { url = "https://files.pythonhosted.org/packages/25/ef/7018273e0faac099d7b00982abdcc39142ae6f3bd9ceb06de09779c4a9d6/pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616", size = 7166756, upload-time = "2026-01-02T09:11:23.559Z" }, + { url = "https://files.pythonhosted.org/packages/8f/c8/993d4b7ab2e341fe02ceef9576afcf5830cdec640be2ac5bee1820d693d4/pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7", size = 6328770, upload-time = "2026-01-02T09:11:25.661Z" }, + { url = "https://files.pythonhosted.org/packages/a7/87/90b358775a3f02765d87655237229ba64a997b87efa8ccaca7dd3e36e7a7/pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d", size = 7033406, upload-time = "2026-01-02T09:11:27.474Z" }, + { url = "https://files.pythonhosted.org/packages/5d/cf/881b457eccacac9e5b2ddd97d5071fb6d668307c57cbf4e3b5278e06e536/pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c", size = 2452612, upload-time = "2026-01-02T09:11:29.309Z" }, + { url = "https://files.pythonhosted.org/packages/dd/c7/2530a4aa28248623e9d7f27316b42e27c32ec410f695929696f2e0e4a778/pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7b5dd7cbae20285cdb597b10eb5a2c13aa9de6cde9bb64a3c1317427b1db1ae1", size = 4062543, upload-time = "2026-01-02T09:11:31.566Z" }, + { url = "https://files.pythonhosted.org/packages/8f/1f/40b8eae823dc1519b87d53c30ed9ef085506b05281d313031755c1705f73/pillow-12.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:29a4cef9cb672363926f0470afc516dbf7305a14d8c54f7abbb5c199cd8f8179", size = 4138373, upload-time = "2026-01-02T09:11:33.367Z" }, + { url = "https://files.pythonhosted.org/packages/d4/77/6fa60634cf06e52139fd0e89e5bbf055e8166c691c42fb162818b7fda31d/pillow-12.1.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:681088909d7e8fa9e31b9799aaa59ba5234c58e5e4f1951b4c4d1082a2e980e0", size = 3601241, upload-time = "2026-01-02T09:11:35.011Z" }, + { url = "https://files.pythonhosted.org/packages/4f/bf/28ab865de622e14b747f0cd7877510848252d950e43002e224fb1c9ababf/pillow-12.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:983976c2ab753166dc66d36af6e8ec15bb511e4a25856e2227e5f7e00a160587", size = 5262410, upload-time = "2026-01-02T09:11:36.682Z" }, + { url = "https://files.pythonhosted.org/packages/1c/34/583420a1b55e715937a85bd48c5c0991598247a1fd2eb5423188e765ea02/pillow-12.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:db44d5c160a90df2d24a24760bbd37607d53da0b34fb546c4c232af7192298ac", size = 4657312, upload-time = "2026-01-02T09:11:38.535Z" }, + { url = "https://files.pythonhosted.org/packages/1d/fd/f5a0896839762885b3376ff04878f86ab2b097c2f9a9cdccf4eda8ba8dc0/pillow-12.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6b7a9d1db5dad90e2991645874f708e87d9a3c370c243c2d7684d28f7e133e6b", size = 6232605, upload-time = "2026-01-02T09:11:40.602Z" }, + { url = "https://files.pythonhosted.org/packages/98/aa/938a09d127ac1e70e6ed467bd03834350b33ef646b31edb7452d5de43792/pillow-12.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6258f3260986990ba2fa8a874f8b6e808cf5abb51a94015ca3dc3c68aa4f30ea", size = 8041617, upload-time = "2026-01-02T09:11:42.721Z" }, + { url = "https://files.pythonhosted.org/packages/17/e8/538b24cb426ac0186e03f80f78bc8dc7246c667f58b540bdd57c71c9f79d/pillow-12.1.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e115c15e3bc727b1ca3e641a909f77f8ca72a64fff150f666fcc85e57701c26c", size = 6346509, upload-time = "2026-01-02T09:11:44.955Z" }, + { url = "https://files.pythonhosted.org/packages/01/9a/632e58ec89a32738cabfd9ec418f0e9898a2b4719afc581f07c04a05e3c9/pillow-12.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6741e6f3074a35e47c77b23a4e4f2d90db3ed905cb1c5e6e0d49bff2045632bc", size = 7038117, upload-time = "2026-01-02T09:11:46.736Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a2/d40308cf86eada842ca1f3ffa45d0ca0df7e4ab33c83f81e73f5eaed136d/pillow-12.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:935b9d1aed48fcfb3f838caac506f38e29621b44ccc4f8a64d575cb1b2a88644", size = 6460151, upload-time = "2026-01-02T09:11:48.625Z" }, + { url = "https://files.pythonhosted.org/packages/f1/88/f5b058ad6453a085c5266660a1417bdad590199da1b32fb4efcff9d33b05/pillow-12.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5fee4c04aad8932da9f8f710af2c1a15a83582cfb884152a9caa79d4efcdbf9c", size = 7164534, upload-time = "2026-01-02T09:11:50.445Z" }, + { url = "https://files.pythonhosted.org/packages/19/ce/c17334caea1db789163b5d855a5735e47995b0b5dc8745e9a3605d5f24c0/pillow-12.1.0-cp313-cp313-win32.whl", hash = "sha256:a786bf667724d84aa29b5db1c61b7bfdde380202aaca12c3461afd6b71743171", size = 6332551, upload-time = "2026-01-02T09:11:52.234Z" }, + { url = "https://files.pythonhosted.org/packages/e5/07/74a9d941fa45c90a0d9465098fe1ec85de3e2afbdc15cc4766622d516056/pillow-12.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:461f9dfdafa394c59cd6d818bdfdbab4028b83b02caadaff0ffd433faf4c9a7a", size = 7040087, upload-time = "2026-01-02T09:11:54.822Z" }, + { url = "https://files.pythonhosted.org/packages/88/09/c99950c075a0e9053d8e880595926302575bc742b1b47fe1bbcc8d388d50/pillow-12.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:9212d6b86917a2300669511ed094a9406888362e085f2431a7da985a6b124f45", size = 2452470, upload-time = "2026-01-02T09:11:56.522Z" }, + { url = "https://files.pythonhosted.org/packages/b5/ba/970b7d85ba01f348dee4d65412476321d40ee04dcb51cd3735b9dc94eb58/pillow-12.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:00162e9ca6d22b7c3ee8e61faa3c3253cd19b6a37f126cad04f2f88b306f557d", size = 5264816, upload-time = "2026-01-02T09:11:58.227Z" }, + { url = "https://files.pythonhosted.org/packages/10/60/650f2fb55fdba7a510d836202aa52f0baac633e50ab1cf18415d332188fb/pillow-12.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7d6daa89a00b58c37cb1747ec9fb7ac3bc5ffd5949f5888657dfddde6d1312e0", size = 4660472, upload-time = "2026-01-02T09:12:00.798Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/5273a99478956a099d533c4f46cbaa19fd69d606624f4334b85e50987a08/pillow-12.1.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2479c7f02f9d505682dc47df8c0ea1fc5e264c4d1629a5d63fe3e2334b89554", size = 6268974, upload-time = "2026-01-02T09:12:02.572Z" }, + { url = "https://files.pythonhosted.org/packages/b4/26/0bf714bc2e73d5267887d47931d53c4ceeceea6978148ed2ab2a4e6463c4/pillow-12.1.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f188d580bd870cda1e15183790d1cc2fa78f666e76077d103edf048eed9c356e", size = 8073070, upload-time = "2026-01-02T09:12:04.75Z" }, + { url = "https://files.pythonhosted.org/packages/43/cf/1ea826200de111a9d65724c54f927f3111dc5ae297f294b370a670c17786/pillow-12.1.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0fde7ec5538ab5095cc02df38ee99b0443ff0e1c847a045554cf5f9af1f4aa82", size = 6380176, upload-time = "2026-01-02T09:12:06.626Z" }, + { url = "https://files.pythonhosted.org/packages/03/e0/7938dd2b2013373fd85d96e0f38d62b7a5a262af21ac274250c7ca7847c9/pillow-12.1.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ed07dca4a8464bada6139ab38f5382f83e5f111698caf3191cb8dbf27d908b4", size = 7067061, upload-time = "2026-01-02T09:12:08.624Z" }, + { url = "https://files.pythonhosted.org/packages/86/ad/a2aa97d37272a929a98437a8c0ac37b3cf012f4f8721e1bd5154699b2518/pillow-12.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f45bd71d1fa5e5749587613037b172e0b3b23159d1c00ef2fc920da6f470e6f0", size = 6491824, upload-time = "2026-01-02T09:12:10.488Z" }, + { url = "https://files.pythonhosted.org/packages/a4/44/80e46611b288d51b115826f136fb3465653c28f491068a72d3da49b54cd4/pillow-12.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:277518bf4fe74aa91489e1b20577473b19ee70fb97c374aa50830b279f25841b", size = 7190911, upload-time = "2026-01-02T09:12:12.772Z" }, + { url = "https://files.pythonhosted.org/packages/86/77/eacc62356b4cf81abe99ff9dbc7402750044aed02cfd6a503f7c6fc11f3e/pillow-12.1.0-cp313-cp313t-win32.whl", hash = "sha256:7315f9137087c4e0ee73a761b163fc9aa3b19f5f606a7fc08d83fd3e4379af65", size = 6336445, upload-time = "2026-01-02T09:12:14.775Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3c/57d81d0b74d218706dafccb87a87ea44262c43eef98eb3b164fd000e0491/pillow-12.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:0ddedfaa8b5f0b4ffbc2fa87b556dc59f6bb4ecb14a53b33f9189713ae8053c0", size = 7045354, upload-time = "2026-01-02T09:12:16.599Z" }, + { url = "https://files.pythonhosted.org/packages/ac/82/8b9b97bba2e3576a340f93b044a3a3a09841170ab4c1eb0d5c93469fd32f/pillow-12.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:80941e6d573197a0c28f394753de529bb436b1ca990ed6e765cf42426abc39f8", size = 2454547, upload-time = "2026-01-02T09:12:18.704Z" }, + { url = "https://files.pythonhosted.org/packages/8c/87/bdf971d8bbcf80a348cc3bacfcb239f5882100fe80534b0ce67a784181d8/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:5cb7bc1966d031aec37ddb9dcf15c2da5b2e9f7cc3ca7c54473a20a927e1eb91", size = 4062533, upload-time = "2026-01-02T09:12:20.791Z" }, + { url = "https://files.pythonhosted.org/packages/ff/4f/5eb37a681c68d605eb7034c004875c81f86ec9ef51f5be4a63eadd58859a/pillow-12.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:97e9993d5ed946aba26baf9c1e8cf18adbab584b99f452ee72f7ee8acb882796", size = 4138546, upload-time = "2026-01-02T09:12:23.664Z" }, + { url = "https://files.pythonhosted.org/packages/11/6d/19a95acb2edbace40dcd582d077b991646b7083c41b98da4ed7555b59733/pillow-12.1.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:414b9a78e14ffeb98128863314e62c3f24b8a86081066625700b7985b3f529bd", size = 3601163, upload-time = "2026-01-02T09:12:26.338Z" }, + { url = "https://files.pythonhosted.org/packages/fc/36/2b8138e51cb42e4cc39c3297713455548be855a50558c3ac2beebdc251dd/pillow-12.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e6bdb408f7c9dd2a5ff2b14a3b0bb6d4deb29fb9961e6eb3ae2031ae9a5cec13", size = 5266086, upload-time = "2026-01-02T09:12:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/649056e4d22e1caa90816bf99cef0884aed607ed38075bd75f091a607a38/pillow-12.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3413c2ae377550f5487991d444428f1a8ae92784aac79caa8b1e3b89b175f77e", size = 4657344, upload-time = "2026-01-02T09:12:31.117Z" }, + { url = "https://files.pythonhosted.org/packages/6c/6b/c5742cea0f1ade0cd61485dc3d81f05261fc2276f537fbdc00802de56779/pillow-12.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e5dcbe95016e88437ecf33544ba5db21ef1b8dd6e1b434a2cb2a3d605299e643", size = 6232114, upload-time = "2026-01-02T09:12:32.936Z" }, + { url = "https://files.pythonhosted.org/packages/bf/8f/9f521268ce22d63991601aafd3d48d5ff7280a246a1ef62d626d67b44064/pillow-12.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d0a7735df32ccbcc98b98a1ac785cc4b19b580be1bdf0aeb5c03223220ea09d5", size = 8042708, upload-time = "2026-01-02T09:12:34.78Z" }, + { url = "https://files.pythonhosted.org/packages/1a/eb/257f38542893f021502a1bbe0c2e883c90b5cff26cc33b1584a841a06d30/pillow-12.1.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c27407a2d1b96774cbc4a7594129cc027339fd800cd081e44497722ea1179de", size = 6347762, upload-time = "2026-01-02T09:12:36.748Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5a/8ba375025701c09b309e8d5163c5a4ce0102fa86bbf8800eb0d7ac87bc51/pillow-12.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15c794d74303828eaa957ff8070846d0efe8c630901a1c753fdc63850e19ecd9", size = 7039265, upload-time = "2026-01-02T09:12:39.082Z" }, + { url = "https://files.pythonhosted.org/packages/cf/dc/cf5e4cdb3db533f539e88a7bbf9f190c64ab8a08a9bc7a4ccf55067872e4/pillow-12.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c990547452ee2800d8506c4150280757f88532f3de2a58e3022e9b179107862a", size = 6462341, upload-time = "2026-01-02T09:12:40.946Z" }, + { url = "https://files.pythonhosted.org/packages/d0/47/0291a25ac9550677e22eda48510cfc4fa4b2ef0396448b7fbdc0a6946309/pillow-12.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b63e13dd27da389ed9475b3d28510f0f954bca0041e8e551b2a4eb1eab56a39a", size = 7165395, upload-time = "2026-01-02T09:12:42.706Z" }, + { url = "https://files.pythonhosted.org/packages/4f/4c/e005a59393ec4d9416be06e6b45820403bb946a778e39ecec62f5b2b991e/pillow-12.1.0-cp314-cp314-win32.whl", hash = "sha256:1a949604f73eb07a8adab38c4fe50791f9919344398bdc8ac6b307f755fc7030", size = 6431413, upload-time = "2026-01-02T09:12:44.944Z" }, + { url = "https://files.pythonhosted.org/packages/1c/af/f23697f587ac5f9095d67e31b81c95c0249cd461a9798a061ed6709b09b5/pillow-12.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f9f6a650743f0ddee5593ac9e954ba1bdbc5e150bc066586d4f26127853ab94", size = 7176779, upload-time = "2026-01-02T09:12:46.727Z" }, + { url = "https://files.pythonhosted.org/packages/b3/36/6a51abf8599232f3e9afbd16d52829376a68909fe14efe29084445db4b73/pillow-12.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:808b99604f7873c800c4840f55ff389936ef1948e4e87645eaf3fccbc8477ac4", size = 2543105, upload-time = "2026-01-02T09:12:49.243Z" }, + { url = "https://files.pythonhosted.org/packages/82/54/2e1dd20c8749ff225080d6ba465a0cab4387f5db0d1c5fb1439e2d99923f/pillow-12.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc11908616c8a283cf7d664f77411a5ed2a02009b0097ff8abbba5e79128ccf2", size = 5268571, upload-time = "2026-01-02T09:12:51.11Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/571163a5ef86ec0cf30d265ac2a70ae6fc9e28413d1dc94fa37fae6bda89/pillow-12.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:896866d2d436563fa2a43a9d72f417874f16b5545955c54a64941e87c1376c61", size = 4660426, upload-time = "2026-01-02T09:12:52.865Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e1/53ee5163f794aef1bf84243f755ee6897a92c708505350dd1923f4afec48/pillow-12.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8e178e3e99d3c0ea8fc64b88447f7cac8ccf058af422a6cedc690d0eadd98c51", size = 6269908, upload-time = "2026-01-02T09:12:54.884Z" }, + { url = "https://files.pythonhosted.org/packages/bc/0b/b4b4106ff0ee1afa1dc599fde6ab230417f800279745124f6c50bcffed8e/pillow-12.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:079af2fb0c599c2ec144ba2c02766d1b55498e373b3ac64687e43849fbbef5bc", size = 8074733, upload-time = "2026-01-02T09:12:56.802Z" }, + { url = "https://files.pythonhosted.org/packages/19/9f/80b411cbac4a732439e629a26ad3ef11907a8c7fc5377b7602f04f6fe4e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdec5e43377761c5dbca620efb69a77f6855c5a379e32ac5b158f54c84212b14", size = 6381431, upload-time = "2026-01-02T09:12:58.823Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b7/d65c45db463b66ecb6abc17c6ba6917a911202a07662247e1355ce1789e7/pillow-12.1.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:565c986f4b45c020f5421a4cea13ef294dde9509a8577f29b2fc5edc7587fff8", size = 7068529, upload-time = "2026-01-02T09:13:00.885Z" }, + { url = "https://files.pythonhosted.org/packages/50/96/dfd4cd726b4a45ae6e3c669fc9e49deb2241312605d33aba50499e9d9bd1/pillow-12.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:43aca0a55ce1eefc0aefa6253661cb54571857b1a7b2964bd8a1e3ef4b729924", size = 6492981, upload-time = "2026-01-02T09:13:03.314Z" }, + { url = "https://files.pythonhosted.org/packages/4d/1c/b5dc52cf713ae46033359c5ca920444f18a6359ce1020dd3e9c553ea5bc6/pillow-12.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0deedf2ea233722476b3a81e8cdfbad786f7adbed5d848469fa59fe52396e4ef", size = 7191878, upload-time = "2026-01-02T09:13:05.276Z" }, + { url = "https://files.pythonhosted.org/packages/53/26/c4188248bd5edaf543864fe4834aebe9c9cb4968b6f573ce014cc42d0720/pillow-12.1.0-cp314-cp314t-win32.whl", hash = "sha256:b17fbdbe01c196e7e159aacb889e091f28e61020a8abeac07b68079b6e626988", size = 6438703, upload-time = "2026-01-02T09:13:07.491Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0e/69ed296de8ea05cb03ee139cee600f424ca166e632567b2d66727f08c7ed/pillow-12.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27b9baecb428899db6c0de572d6d305cfaf38ca1596b5c0542a5182e3e74e8c6", size = 7182927, upload-time = "2026-01-02T09:13:09.841Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/68334c015eed9b5cff77814258717dec591ded209ab5b6fb70e2ae873d1d/pillow-12.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f61333d817698bdcdd0f9d7793e365ac3d2a21c1f1eb02b32ad6aefb8d8ea831", size = 2545104, upload-time = "2026-01-02T09:13:12.068Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydantic" +version = "2.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, + { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, + { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, + { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, + { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, + { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, + { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, + { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, + { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, + { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, + { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, + { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, + { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, + { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, + { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, +] + +[[package]] +name = "pyjwt" +version = "2.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5a/b46fa56bf322901eee5b0454a34343cdbdae202cd421775a8ee4e42fd519/pyjwt-2.11.0.tar.gz", hash = "sha256:35f95c1f0fbe5d5ba6e43f00271c275f7a1a4db1dab27bf708073b75318ea623", size = 98019, upload-time = "2026-01-30T19:59:55.694Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/01/c26ce75ba460d5cd503da9e13b21a33804d38c2165dec7b716d06b13010c/pyjwt-2.11.0-py3-none-any.whl", hash = "sha256:94a6bde30eb5c8e04fee991062b534071fd1439ef58d2adc9ccb823e7bcd0469", size = 28224, upload-time = "2026-01-30T19:59:54.539Z" }, +] + +[[package]] +name = "pylatexenc" +version = "2.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/ab/34ec41718af73c00119d0351b7a2531d2ebddb51833a36448fc7b862be60/pylatexenc-2.10.tar.gz", hash = "sha256:3dd8fd84eb46dc30bee1e23eaab8d8fb5a7f507347b23e5f38ad9675c84f40d3", size = 162597, upload-time = "2021-04-06T07:56:07.854Z" } + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pyspnego" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "sspilib", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/e4/8b32a91aeba6fbc6943a630c44b2fe038615e5c7dec8814316fafdcf4bf4/pyspnego-0.12.0.tar.gz", hash = "sha256:e1d9cd3520a87a1d6db8d68783b17edc4e1464eae3d51ead411a51c82dbaae67", size = 225764, upload-time = "2025-09-02T18:51:06.858Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/e9/95430b8f3b747ebd3b86a66484a79ef387167655bcb15ab416f563045565/pyspnego-0.12.0-py3-none-any.whl", hash = "sha256:84cc8dae6ad21e04b37c50c1d3c743f05f193e39498f6010cc68ec1146afd007", size = 130180, upload-time = "2025-09-02T18:51:04.938Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, +] + +[[package]] +name = "qiskit" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, + { name = "numpy" }, + { name = "rustworkx" }, + { name = "scipy" }, + { name = "stevedore" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/8e/d5279454717d780f32eec4dfa6a7ef256ea7382b2f8fef2c715fc6f1180e/qiskit-2.3.0.tar.gz", hash = "sha256:e0a00c6681b8d04171c5cdb928837d992676f8aa4a07c390d446e54babaf6c1e", size = 3903621, upload-time = "2026-01-08T19:36:33.691Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/79/22a6c61a94fef8eac09f968355c15c0d3b0800110152bbcf9cbed5bfc807/qiskit-2.3.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bfeba21f216f64b051f9ac98653e9999d4c1bcb4f328aca06ad059aaef86586b", size = 8791989, upload-time = "2026-01-08T21:32:53.48Z" }, + { url = "https://files.pythonhosted.org/packages/d7/55/bb8efb2b6e46e5b8c7d147973646fa71677e63ecd2378af4db2829795be6/qiskit-2.3.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:5f29f3b6a2b5738463bc667ddb2bcc79a83fb434ab9a8033487b64a399f71bef", size = 7872461, upload-time = "2026-01-08T19:36:26.458Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c6/d928648d417c5c2e0c50481ef4f197f2ad8ca74d361e163e0c5d73253cbf/qiskit-2.3.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b437262a14ab961703153f79f38de5fde408601b0eda1f9c34b57498c912ef33", size = 8223957, upload-time = "2026-01-08T19:36:28.767Z" }, + { url = "https://files.pythonhosted.org/packages/54/76/33ee3519c3ff88b6154ccce13d24a33c0dc0fc9b22df8f216f1833cb0981/qiskit-2.3.0-cp310-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7c413dace7a9b1d30bbbfeb2f90c4564dfcf6ed3c0744e026d4aca84f8fbd2bb", size = 9042802, upload-time = "2026-01-08T21:32:55.692Z" }, + { url = "https://files.pythonhosted.org/packages/73/9f/478788b16f653cdf151c7f2f040ba41b97e355d3bf9348ee2f0f685a5ea6/qiskit-2.3.0-cp310-abi3-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ae0b1ec4c24ff8867599a5e8a46efaaf6d5477d1c4533427b7ae516054f52b2f", size = 8701281, upload-time = "2026-01-08T21:32:57.947Z" }, + { url = "https://files.pythonhosted.org/packages/de/22/fd8e7d4869641f60d9b7ce6d688b59520c8c8be8c8e4b51d76fb85b59f42/qiskit-2.3.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:24fd70ee3ac47fe029096e39b1c39abf3e7f145c723df90f9600468099c12aa4", size = 8888244, upload-time = "2026-01-08T19:36:30.259Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bb/0fbcf43f9daba43f1eb31ecf7d36afcbcf705457d9df6e8e6f38f07b4851/qiskit-2.3.0-cp310-abi3-win_amd64.whl", hash = "sha256:8679a426725785701629f0af905a7a5b6bc25b0dcd7fe4f4c9f8be63d89e832c", size = 8630467, upload-time = "2026-01-08T19:36:31.958Z" }, +] + +[[package]] +name = "qiskit-ibm-runtime" +version = "0.45.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ibm-platform-services" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "python-dateutil" }, + { name = "qiskit" }, + { name = "requests" }, + { name = "requests-ntlm" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/8d/26700ff17b4139637fa35d0022d2dbc38440ee130d94153d6a4c4a0153c9/qiskit_ibm_runtime-0.45.0.tar.gz", hash = "sha256:54b29d6e5201b038015f20e30ab90f846a3233a53e758f405a4c5a556fadb0bb", size = 1524924, upload-time = "2026-01-08T18:27:57.918Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/4b/3d41e18b0dd6a83055f2d8f9b2330f3530814c9d5e471083181927e36d26/qiskit_ibm_runtime-0.45.0-py3-none-any.whl", hash = "sha256:dff7905492deac5c66be48a457e561de41aac7033762559e06eb92ffd7f5e24e", size = 1453327, upload-time = "2026-01-08T18:27:56.145Z" }, +] + +[[package]] +name = "qsyn" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "dotenv" }, + { name = "matplotlib" }, + { name = "pillow" }, + { name = "pylatexenc" }, + { name = "qiskit" }, + { name = "qiskit-ibm-runtime" }, +] + +[package.metadata] +requires-dist = [ + { name = "dotenv", specifier = ">=0.9.9" }, + { name = "matplotlib", specifier = ">=3.8.0" }, + { name = "pillow", specifier = ">=12.1.0" }, + { name = "pylatexenc", specifier = ">=2.10" }, + { name = "qiskit", specifier = ">=2.3.0" }, + { name = "qiskit-ibm-runtime", specifier = ">=0.45.0" }, +] + +[package.metadata.requires-dev] +dev = [] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "requests-ntlm" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "pyspnego" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/15/74/5d4e1815107e9d78c44c3ad04740b00efd1189e5a9ec11e5275b60864e54/requests_ntlm-1.3.0.tar.gz", hash = "sha256:b29cc2462623dffdf9b88c43e180ccb735b4007228a542220e882c58ae56c668", size = 16112, upload-time = "2024-06-09T23:52:04.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/5d/836b97537a390cf811b0488490c389c5a614f0a93acb23f347bd37a2d914/requests_ntlm-1.3.0-py3-none-any.whl", hash = "sha256:4c7534a7d0e482bb0928531d621be4b2c74ace437e88c5a357ceb7452d25a510", size = 6577, upload-time = "2024-06-09T23:52:03.241Z" }, +] + +[[package]] +name = "rustworkx" +version = "0.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/b0/66d96f02120f79eeed86b5c5be04029b6821155f31ed4907a4e9f1460671/rustworkx-0.17.1.tar.gz", hash = "sha256:59ea01b4e603daffa4e8827316c1641eef18ae9032f0b1b14aa0181687e3108e", size = 399407, upload-time = "2025-09-15T16:29:46.429Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/24/8972ed631fa05fdec05a7bb7f1fc0f8e78ee761ab37e8a93d1ed396ba060/rustworkx-0.17.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c08fb8db041db052da404839b064ebfb47dcce04ba9a3e2eb79d0c65ab011da4", size = 2257491, upload-time = "2025-08-13T01:43:31.466Z" }, + { url = "https://files.pythonhosted.org/packages/23/ae/7b6bbae5e0487ee42072dc6a46edf5db9731a0701ed648db22121fb7490c/rustworkx-0.17.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:4ef8e327dadf6500edd76fedb83f6d888b9266c58bcdbffd5a40c33835c9dd26", size = 2040175, upload-time = "2025-08-13T01:43:33.762Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ea/c17fb9428c8f0dcc605596f9561627a5b9ef629d356204ee5088cfcf52c6/rustworkx-0.17.1-cp39-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b809e0aa2927c68574b196f993233e269980918101b0dd235289c4f3ddb2115", size = 2324771, upload-time = "2025-08-13T01:43:35.553Z" }, + { url = "https://files.pythonhosted.org/packages/d7/40/ec8b3b8b0f8c0b768690c454b8dcc2781b4f2c767f9f1215539c7909e35b/rustworkx-0.17.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e82c46a92fb0fd478b7372e15ca524c287485fdecaed37b8bb68f4df2720f2", size = 2068584, upload-time = "2025-08-13T01:43:37.261Z" }, + { url = "https://files.pythonhosted.org/packages/d9/22/713b900d320d06ce8677e71bba0ec5df0037f1d83270bff5db3b271c10d7/rustworkx-0.17.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:42170075d8a7319e89ff63062c2f1d1116ced37b6f044f3bf36d10b60a107aa4", size = 2380949, upload-time = "2025-08-13T01:52:17.435Z" }, + { url = "https://files.pythonhosted.org/packages/20/4b/54be84b3b41a19caf0718a2b6bb280dde98c8626c809c969f16aad17458f/rustworkx-0.17.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65cba97fa95470239e2d65eb4db1613f78e4396af9f790ff771b0e5476bfd887", size = 2562069, upload-time = "2025-08-13T02:09:27.222Z" }, + { url = "https://files.pythonhosted.org/packages/39/5b/281bb21d091ab4e36cf377088366d55d0875fa2347b3189c580ec62b44c7/rustworkx-0.17.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246cc252053f89e36209535b9c58755960197e6ae08d48d3973760141c62ac95", size = 2221186, upload-time = "2025-08-13T01:43:38.598Z" }, + { url = "https://files.pythonhosted.org/packages/cc/2d/30a941a21b81e9db50c4c3ef8a64c5ee1c8eea3a90506ca0326ce39d021f/rustworkx-0.17.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c10d25e9f0e87d6a273d1ea390b636b4fb3fede2094bf0cb3fe565d696a91b48", size = 2123510, upload-time = "2025-08-13T01:43:40.288Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ef/c9199e4b6336ee5a9f1979c11b5779c5cf9ab6f8386e0b9a96c8ffba7009/rustworkx-0.17.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:48784a673cf8d04f3cd246fa6b53fd1ccc4d83304503463bd561c153517bccc1", size = 2302783, upload-time = "2025-08-13T01:43:42.073Z" }, + { url = "https://files.pythonhosted.org/packages/30/3d/a49ab633e99fca4ccbb9c9f4bd41904186c175ebc25c530435529f71c480/rustworkx-0.17.1-cp39-abi3-win32.whl", hash = "sha256:5dbc567833ff0a8ad4580a4fe4bde92c186d36b4c45fca755fb1792e4fafe9b5", size = 1931541, upload-time = "2025-08-13T01:43:43.415Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ec/cee878c1879b91ab8dc7d564535d011307839a2fea79d2a650413edf53be/rustworkx-0.17.1-cp39-abi3-win_amd64.whl", hash = "sha256:d0a48fb62adabd549f9f02927c3a159b51bf654c7388a12fc16d45452d5703ea", size = 2055049, upload-time = "2025-08-13T01:43:44.926Z" }, +] + +[[package]] +name = "scipy" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/56/3e/9cca699f3486ce6bc12ff46dc2031f1ec8eb9ccc9a320fdaf925f1417426/scipy-1.17.0.tar.gz", hash = "sha256:2591060c8e648d8b96439e111ac41fd8342fdeff1876be2e19dea3fe8930454e", size = 30396830, upload-time = "2026-01-10T21:34:23.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/11/7241a63e73ba5a516f1930ac8d5b44cbbfabd35ac73a2d08ca206df007c4/scipy-1.17.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:0d5018a57c24cb1dd828bcf51d7b10e65986d549f52ef5adb6b4d1ded3e32a57", size = 31364580, upload-time = "2026-01-10T21:25:25.717Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1d/5057f812d4f6adc91a20a2d6f2ebcdb517fdbc87ae3acc5633c9b97c8ba5/scipy-1.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:88c22af9e5d5a4f9e027e26772cc7b5922fab8bcc839edb3ae33de404feebd9e", size = 27969012, upload-time = "2026-01-10T21:25:30.921Z" }, + { url = "https://files.pythonhosted.org/packages/e3/21/f6ec556c1e3b6ec4e088da667d9987bb77cc3ab3026511f427dc8451187d/scipy-1.17.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f3cd947f20fe17013d401b64e857c6b2da83cae567adbb75b9dcba865abc66d8", size = 20140691, upload-time = "2026-01-10T21:25:34.802Z" }, + { url = "https://files.pythonhosted.org/packages/7a/fe/5e5ad04784964ba964a96f16c8d4676aa1b51357199014dce58ab7ec5670/scipy-1.17.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e8c0b331c2c1f531eb51f1b4fc9ba709521a712cce58f1aa627bc007421a5306", size = 22463015, upload-time = "2026-01-10T21:25:39.277Z" }, + { url = "https://files.pythonhosted.org/packages/4a/69/7c347e857224fcaf32a34a05183b9d8a7aca25f8f2d10b8a698b8388561a/scipy-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5194c445d0a1c7a6c1a4a4681b6b7c71baad98ff66d96b949097e7513c9d6742", size = 32724197, upload-time = "2026-01-10T21:25:44.084Z" }, + { url = "https://files.pythonhosted.org/packages/d1/fe/66d73b76d378ba8cc2fe605920c0c75092e3a65ae746e1e767d9d020a75a/scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9eeb9b5f5997f75507814ed9d298ab23f62cf79f5a3ef90031b1ee2506abdb5b", size = 35009148, upload-time = "2026-01-10T21:25:50.591Z" }, + { url = "https://files.pythonhosted.org/packages/af/07/07dec27d9dc41c18d8c43c69e9e413431d20c53a0339c388bcf72f353c4b/scipy-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40052543f7bbe921df4408f46003d6f01c6af109b9e2c8a66dd1cf6cf57f7d5d", size = 34798766, upload-time = "2026-01-10T21:25:59.41Z" }, + { url = "https://files.pythonhosted.org/packages/81/61/0470810c8a093cdacd4ba7504b8a218fd49ca070d79eca23a615f5d9a0b0/scipy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0cf46c8013fec9d3694dc572f0b54100c28405d55d3e2cb15e2895b25057996e", size = 37405953, upload-time = "2026-01-10T21:26:07.75Z" }, + { url = "https://files.pythonhosted.org/packages/92/ce/672ed546f96d5d41ae78c4b9b02006cedd0b3d6f2bf5bb76ea455c320c28/scipy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:0937a0b0d8d593a198cededd4c439a0ea216a3f36653901ea1f3e4be949056f8", size = 36328121, upload-time = "2026-01-10T21:26:16.509Z" }, + { url = "https://files.pythonhosted.org/packages/9d/21/38165845392cae67b61843a52c6455d47d0cc2a40dd495c89f4362944654/scipy-1.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:f603d8a5518c7426414d1d8f82e253e454471de682ce5e39c29adb0df1efb86b", size = 24314368, upload-time = "2026-01-10T21:26:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/0c/51/3468fdfd49387ddefee1636f5cf6d03ce603b75205bf439bbf0e62069bfd/scipy-1.17.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:65ec32f3d32dfc48c72df4291345dae4f048749bc8d5203ee0a3f347f96c5ce6", size = 31344101, upload-time = "2026-01-10T21:26:30.25Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9a/9406aec58268d437636069419e6977af953d1e246df941d42d3720b7277b/scipy-1.17.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:1f9586a58039d7229ce77b52f8472c972448cded5736eaf102d5658bbac4c269", size = 27950385, upload-time = "2026-01-10T21:26:36.801Z" }, + { url = "https://files.pythonhosted.org/packages/4f/98/e7342709e17afdfd1b26b56ae499ef4939b45a23a00e471dfb5375eea205/scipy-1.17.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9fad7d3578c877d606b1150135c2639e9de9cecd3705caa37b66862977cc3e72", size = 20122115, upload-time = "2026-01-10T21:26:42.107Z" }, + { url = "https://files.pythonhosted.org/packages/fd/0e/9eeeb5357a64fd157cbe0302c213517c541cc16b8486d82de251f3c68ede/scipy-1.17.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:423ca1f6584fc03936972b5f7c06961670dbba9f234e71676a7c7ccf938a0d61", size = 22442402, upload-time = "2026-01-10T21:26:48.029Z" }, + { url = "https://files.pythonhosted.org/packages/c9/10/be13397a0e434f98e0c79552b2b584ae5bb1c8b2be95db421533bbca5369/scipy-1.17.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe508b5690e9eaaa9467fc047f833af58f1152ae51a0d0aed67aa5801f4dd7d6", size = 32696338, upload-time = "2026-01-10T21:26:55.521Z" }, + { url = "https://files.pythonhosted.org/packages/63/1e/12fbf2a3bb240161651c94bb5cdd0eae5d4e8cc6eaeceb74ab07b12a753d/scipy-1.17.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6680f2dfd4f6182e7d6db161344537da644d1cf85cf293f015c60a17ecf08752", size = 34977201, upload-time = "2026-01-10T21:27:03.501Z" }, + { url = "https://files.pythonhosted.org/packages/19/5b/1a63923e23ccd20bd32156d7dd708af5bbde410daa993aa2500c847ab2d2/scipy-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eec3842ec9ac9de5917899b277428886042a93db0b227ebbe3a333b64ec7643d", size = 34777384, upload-time = "2026-01-10T21:27:11.423Z" }, + { url = "https://files.pythonhosted.org/packages/39/22/b5da95d74edcf81e540e467202a988c50fef41bd2011f46e05f72ba07df6/scipy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d7425fcafbc09a03731e1bc05581f5fad988e48c6a861f441b7ab729a49a55ea", size = 37379586, upload-time = "2026-01-10T21:27:20.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/b6/8ac583d6da79e7b9e520579f03007cb006f063642afd6b2eeb16b890bf93/scipy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:87b411e42b425b84777718cc41516b8a7e0795abfa8e8e1d573bf0ef014f0812", size = 36287211, upload-time = "2026-01-10T21:28:43.122Z" }, + { url = "https://files.pythonhosted.org/packages/55/fb/7db19e0b3e52f882b420417644ec81dd57eeef1bd1705b6f689d8ff93541/scipy-1.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:357ca001c6e37601066092e7c89cca2f1ce74e2a520ca78d063a6d2201101df2", size = 24312646, upload-time = "2026-01-10T21:28:49.893Z" }, + { url = "https://files.pythonhosted.org/packages/20/b6/7feaa252c21cc7aff335c6c55e1b90ab3e3306da3f048109b8b639b94648/scipy-1.17.0-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:ec0827aa4d36cb79ff1b81de898e948a51ac0b9b1c43e4a372c0508c38c0f9a3", size = 31693194, upload-time = "2026-01-10T21:27:27.454Z" }, + { url = "https://files.pythonhosted.org/packages/76/bb/bbb392005abce039fb7e672cb78ac7d158700e826b0515cab6b5b60c26fb/scipy-1.17.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:819fc26862b4b3c73a60d486dbb919202f3d6d98c87cf20c223511429f2d1a97", size = 28365415, upload-time = "2026-01-10T21:27:34.26Z" }, + { url = "https://files.pythonhosted.org/packages/37/da/9d33196ecc99fba16a409c691ed464a3a283ac454a34a13a3a57c0d66f3a/scipy-1.17.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:363ad4ae2853d88ebcde3ae6ec46ccca903ea9835ee8ba543f12f575e7b07e4e", size = 20537232, upload-time = "2026-01-10T21:27:40.306Z" }, + { url = "https://files.pythonhosted.org/packages/56/9d/f4b184f6ddb28e9a5caea36a6f98e8ecd2a524f9127354087ce780885d83/scipy-1.17.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:979c3a0ff8e5ba254d45d59ebd38cde48fce4f10b5125c680c7a4bfe177aab07", size = 22791051, upload-time = "2026-01-10T21:27:46.539Z" }, + { url = "https://files.pythonhosted.org/packages/9b/9d/025cccdd738a72140efc582b1641d0dd4caf2e86c3fb127568dc80444e6e/scipy-1.17.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:130d12926ae34399d157de777472bf82e9061c60cc081372b3118edacafe1d00", size = 32815098, upload-time = "2026-01-10T21:27:54.389Z" }, + { url = "https://files.pythonhosted.org/packages/48/5f/09b879619f8bca15ce392bfc1894bd9c54377e01d1b3f2f3b595a1b4d945/scipy-1.17.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e886000eb4919eae3a44f035e63f0fd8b651234117e8f6f29bad1cd26e7bc45", size = 35031342, upload-time = "2026-01-10T21:28:03.012Z" }, + { url = "https://files.pythonhosted.org/packages/f2/9a/f0f0a9f0aa079d2f106555b984ff0fbb11a837df280f04f71f056ea9c6e4/scipy-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13c4096ac6bc31d706018f06a49abe0485f96499deb82066b94d19b02f664209", size = 34893199, upload-time = "2026-01-10T21:28:10.832Z" }, + { url = "https://files.pythonhosted.org/packages/90/b8/4f0f5cf0c5ea4d7548424e6533e6b17d164f34a6e2fb2e43ffebb6697b06/scipy-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cacbaddd91fcffde703934897c5cd2c7cb0371fac195d383f4e1f1c5d3f3bd04", size = 37438061, upload-time = "2026-01-10T21:28:19.684Z" }, + { url = "https://files.pythonhosted.org/packages/f9/cc/2bd59140ed3b2fa2882fb15da0a9cb1b5a6443d67cfd0d98d4cec83a57ec/scipy-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:edce1a1cf66298cccdc48a1bdf8fb10a3bf58e8b58d6c3883dd1530e103f87c0", size = 36328593, upload-time = "2026-01-10T21:28:28.007Z" }, + { url = "https://files.pythonhosted.org/packages/13/1b/c87cc44a0d2c7aaf0f003aef2904c3d097b422a96c7e7c07f5efd9073c1b/scipy-1.17.0-cp313-cp313t-win_arm64.whl", hash = "sha256:30509da9dbec1c2ed8f168b8d8aa853bc6723fede1dbc23c7d43a56f5ab72a67", size = 24625083, upload-time = "2026-01-10T21:28:35.188Z" }, + { url = "https://files.pythonhosted.org/packages/1a/2d/51006cd369b8e7879e1c630999a19d1fbf6f8b5ed3e33374f29dc87e53b3/scipy-1.17.0-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:c17514d11b78be8f7e6331b983a65a7f5ca1fd037b95e27b280921fe5606286a", size = 31346803, upload-time = "2026-01-10T21:28:57.24Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2e/2349458c3ce445f53a6c93d4386b1c4c5c0c540917304c01222ff95ff317/scipy-1.17.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:4e00562e519c09da34c31685f6acc3aa384d4d50604db0f245c14e1b4488bfa2", size = 27967182, upload-time = "2026-01-10T21:29:04.107Z" }, + { url = "https://files.pythonhosted.org/packages/5e/7c/df525fbfa77b878d1cfe625249529514dc02f4fd5f45f0f6295676a76528/scipy-1.17.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f7df7941d71314e60a481e02d5ebcb3f0185b8d799c70d03d8258f6c80f3d467", size = 20139125, upload-time = "2026-01-10T21:29:10.179Z" }, + { url = "https://files.pythonhosted.org/packages/33/11/fcf9d43a7ed1234d31765ec643b0515a85a30b58eddccc5d5a4d12b5f194/scipy-1.17.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:aabf057c632798832f071a8dde013c2e26284043934f53b00489f1773b33527e", size = 22443554, upload-time = "2026-01-10T21:29:15.888Z" }, + { url = "https://files.pythonhosted.org/packages/80/5c/ea5d239cda2dd3d31399424967a24d556cf409fbea7b5b21412b0fd0a44f/scipy-1.17.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a38c3337e00be6fd8a95b4ed66b5d988bac4ec888fd922c2ea9fe5fb1603dd67", size = 32757834, upload-time = "2026-01-10T21:29:23.406Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7e/8c917cc573310e5dc91cbeead76f1b600d3fb17cf0969db02c9cf92e3cfa/scipy-1.17.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00fb5f8ec8398ad90215008d8b6009c9db9fa924fd4c7d6be307c6f945f9cd73", size = 34995775, upload-time = "2026-01-10T21:29:31.915Z" }, + { url = "https://files.pythonhosted.org/packages/c5/43/176c0c3c07b3f7df324e7cdd933d3e2c4898ca202b090bd5ba122f9fe270/scipy-1.17.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f2a4942b0f5f7c23c7cd641a0ca1955e2ae83dedcff537e3a0259096635e186b", size = 34841240, upload-time = "2026-01-10T21:29:39.995Z" }, + { url = "https://files.pythonhosted.org/packages/44/8c/d1f5f4b491160592e7f084d997de53a8e896a3ac01cd07e59f43ca222744/scipy-1.17.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf133ced83889583156566d2bdf7a07ff89228fe0c0cb727f777de92092ec6b", size = 37394463, upload-time = "2026-01-10T21:29:48.723Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ec/42a6657f8d2d087e750e9a5dde0b481fd135657f09eaf1cf5688bb23c338/scipy-1.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:3625c631a7acd7cfd929e4e31d2582cf00f42fcf06011f59281271746d77e061", size = 37053015, upload-time = "2026-01-10T21:30:51.418Z" }, + { url = "https://files.pythonhosted.org/packages/27/58/6b89a6afd132787d89a362d443a7bddd511b8f41336a1ae47f9e4f000dc4/scipy-1.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:9244608d27eafe02b20558523ba57f15c689357c85bdcfe920b1828750aa26eb", size = 24951312, upload-time = "2026-01-10T21:30:56.771Z" }, + { url = "https://files.pythonhosted.org/packages/e9/01/f58916b9d9ae0112b86d7c3b10b9e685625ce6e8248df139d0fcb17f7397/scipy-1.17.0-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:2b531f57e09c946f56ad0b4a3b2abee778789097871fc541e267d2eca081cff1", size = 31706502, upload-time = "2026-01-10T21:29:56.326Z" }, + { url = "https://files.pythonhosted.org/packages/59/8e/2912a87f94a7d1f8b38aabc0faf74b82d3b6c9e22be991c49979f0eceed8/scipy-1.17.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:13e861634a2c480bd237deb69333ac79ea1941b94568d4b0efa5db5e263d4fd1", size = 28380854, upload-time = "2026-01-10T21:30:01.554Z" }, + { url = "https://files.pythonhosted.org/packages/bd/1c/874137a52dddab7d5d595c1887089a2125d27d0601fce8c0026a24a92a0b/scipy-1.17.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:eb2651271135154aa24f6481cbae5cc8af1f0dd46e6533fb7b56aa9727b6a232", size = 20552752, upload-time = "2026-01-10T21:30:05.93Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f0/7518d171cb735f6400f4576cf70f756d5b419a07fe1867da34e2c2c9c11b/scipy-1.17.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:c5e8647f60679790c2f5c76be17e2e9247dc6b98ad0d3b065861e082c56e078d", size = 22803972, upload-time = "2026-01-10T21:30:10.651Z" }, + { url = "https://files.pythonhosted.org/packages/7c/74/3498563a2c619e8a3ebb4d75457486c249b19b5b04a30600dfd9af06bea5/scipy-1.17.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fb10d17e649e1446410895639f3385fd2bf4c3c7dfc9bea937bddcbc3d7b9ba", size = 32829770, upload-time = "2026-01-10T21:30:16.359Z" }, + { url = "https://files.pythonhosted.org/packages/48/d1/7b50cedd8c6c9d6f706b4b36fa8544d829c712a75e370f763b318e9638c1/scipy-1.17.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8547e7c57f932e7354a2319fab613981cde910631979f74c9b542bb167a8b9db", size = 35051093, upload-time = "2026-01-10T21:30:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/e2/82/a2d684dfddb87ba1b3ea325df7c3293496ee9accb3a19abe9429bce94755/scipy-1.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33af70d040e8af9d5e7a38b5ed3b772adddd281e3062ff23fec49e49681c38cf", size = 34909905, upload-time = "2026-01-10T21:30:28.704Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5e/e565bd73991d42023eb82bb99e51c5b3d9e2c588ca9d4b3e2cc1d3ca62a6/scipy-1.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb55bb97d00f8b7ab95cb64f873eb0bf54d9446264d9f3609130381233483f", size = 37457743, upload-time = "2026-01-10T21:30:34.819Z" }, + { url = "https://files.pythonhosted.org/packages/58/a8/a66a75c3d8f1fb2b83f66007d6455a06a6f6cf5618c3dc35bc9b69dd096e/scipy-1.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1ff269abf702f6c7e67a4b7aad981d42871a11b9dd83c58d2d2ea624efbd1088", size = 37098574, upload-time = "2026-01-10T21:30:40.782Z" }, + { url = "https://files.pythonhosted.org/packages/56/a5/df8f46ef7da168f1bc52cd86e09a9de5c6f19cc1da04454d51b7d4f43408/scipy-1.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:031121914e295d9791319a1875444d55079885bbae5bdc9c5e0f2ee5f09d34ff", size = 25246266, upload-time = "2026-01-10T21:30:45.923Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sspilib" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/e6/d0d74b18bed8c16949fddc0401005c072947ae7bf1bab982ed28f9ebc2d8/sspilib-0.5.0.tar.gz", hash = "sha256:b62f7f2602aa1add0505eee2417e2df24421224cb411e53bf3ae42a71b62fe98", size = 59920, upload-time = "2025-12-03T00:31:05.564Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/1b/dd9066491168933b0f7ab6e396ac58cc024c8954e95264c38e3dc9363d7c/sspilib-0.5.0-cp311-abi3-win32.whl", hash = "sha256:fcb57b41b3200ef2e6e8846e2a13799d20b35b796267f2f75cc65e3883e8eeb6", size = 451246, upload-time = "2025-12-03T00:30:36.685Z" }, + { url = "https://files.pythonhosted.org/packages/17/6a/a11abf90172ff580ac2f9ade3496d868e05e851c4ecf487dd5baeb966b1d/sspilib-0.5.0-cp311-abi3-win_amd64.whl", hash = "sha256:ca2a21a4e90db563c2cec639c66b3a29ea53129a0c55ff1e4154a02937f6bd45", size = 540777, upload-time = "2025-12-03T00:30:38.44Z" }, + { url = "https://files.pythonhosted.org/packages/45/05/983876d281b9e7926f1c9126e72de8bd5928b1de45433163f54d4e217502/sspilib-0.5.0-cp311-abi3-win_arm64.whl", hash = "sha256:6893bad16f122fc3c4bd908461b9728694465c05ca97c22f7e2094791c4ee3cb", size = 470353, upload-time = "2025-12-03T00:30:39.63Z" }, + { url = "https://files.pythonhosted.org/packages/43/f8/34e8e86883054b961c2eb88a5b42b89b2bf975723b1acca090966c2d03ff/sspilib-0.5.0-cp314-cp314t-win32.whl", hash = "sha256:9dad272abf3f4cf0bf95d495075d2987f6ba1fb300f8d603661ccac07d11272f", size = 567408, upload-time = "2025-12-03T00:30:48.723Z" }, + { url = "https://files.pythonhosted.org/packages/c4/d8/8c4ba75f925fd9651cb855c47e0e67931a175d6fd41e569193a8d58133ac/sspilib-0.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:7d7724d5dbb31f68e62465863dfb862fe2793281ce40d0c8f2dc60c8f07998f2", size = 690291, upload-time = "2025-12-03T00:30:49.929Z" }, + { url = "https://files.pythonhosted.org/packages/74/c3/07af17b6fcc2b02af294a8817e30441a502880a04c8d60be2d71e0a1eacc/sspilib-0.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:8ce23ec740dee025136370ed4ae64b7d1535368321049ef960012a57c93ebe15", size = 534304, upload-time = "2025-12-03T00:30:51.348Z" }, +] + +[[package]] +name = "stevedore" +version = "5.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/5b/496f8abebd10c3301129abba7ddafd46c71d799a70c44ab080323987c4c9/stevedore-5.6.0.tar.gz", hash = "sha256:f22d15c6ead40c5bbfa9ca54aa7e7b4a07d59b36ae03ed12ced1a54cf0b51945", size = 516074, upload-time = "2025-11-20T10:06:07.264Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/40/8561ce06dc46fd17242c7724ab25b257a2ac1b35f4ebf551b40ce6105cfa/stevedore-5.6.0-py3-none-any.whl", hash = "sha256:4a36dccefd7aeea0c70135526cecb7766c4c84c473b1af68db23d541b6dc1820", size = 54428, upload-time = "2025-11-20T10:06:05.946Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] diff --git a/vendor/README.md b/vendor/README.md index 7eff6ab6d..0cd1ab6da 100644 --- a/vendor/README.md +++ b/vendor/README.md @@ -22,8 +22,6 @@ This document lists the third-party dependencies that `qsyn` uses as libraries, - MIT License - [`gabime/spdlog`](https://github.com/gabime/spdlog): Fast C++ logging library - MIT License -- [`seleznevae/libfort`](https://github.com/seleznevae/libfort): Pretty table printers - - MIT License - [`p-ranav/unicode_display_width`](https://github.com/p-ranav/unicode_display_width): Aid counting string display width - MIT License - [`aminnj/cpptqdm`](https://github.com/aminnj/cpptqdm/tree/04c733fd38cdc1763d7bc19f8ff3a8fb6e95e2e9): pretty progress bar printing diff --git a/vendor/date/chrono_io.h b/vendor/date/chrono_io.h new file mode 100644 index 000000000..21be40409 --- /dev/null +++ b/vendor/date/chrono_io.h @@ -0,0 +1,34 @@ +#ifndef CHRONO_IO_H +#define CHRONO_IO_H + +// The MIT License (MIT) +// +// Copyright (c) 2016, 2017 Howard Hinnant +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// Our apologies. When the previous paragraph was written, lowercase had not yet +// been invented (that would involve another several millennia of evolution). +// We did not mean to shout. + +// This functionality has moved to "date.h" + +#include "date.h" + +#endif // CHRONO_IO_H diff --git a/vendor/date/date.h b/vendor/date/date.h new file mode 100644 index 000000000..29cecdc16 --- /dev/null +++ b/vendor/date/date.h @@ -0,0 +1,8373 @@ +#ifndef DATE_H +#define DATE_H + +// The MIT License (MIT) +// +// Copyright (c) 2015, 2016, 2017 Howard Hinnant +// Copyright (c) 2016 Adrian Colomitchi +// Copyright (c) 2017 Florian Dang +// Copyright (c) 2017 Paul Thompson +// Copyright (c) 2018, 2019 Tomasz Kamiński +// Copyright (c) 2019 Jiangang Zhuang +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// Our apologies. When the previous paragraph was written, lowercase had not yet +// been invented (that would involve another several millennia of evolution). +// We did not mean to shout. + +#ifndef HAS_STRING_VIEW +# if __cplusplus >= 201703 || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) +# define HAS_STRING_VIEW 1 +# else +# define HAS_STRING_VIEW 0 +# endif +#endif // HAS_STRING_VIEW + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if HAS_STRING_VIEW +# include +#endif +#include +#include + +#ifdef __GNUC__ +# pragma GCC diagnostic push +# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 7) +# pragma GCC diagnostic ignored "-Wpedantic" +# endif +# if __GNUC__ < 5 + // GCC 4.9 Bug 61489 Wrong warning with -Wmissing-field-initializers +# pragma GCC diagnostic ignored "-Wmissing-field-initializers" +# endif +#endif + +#ifdef _MSC_VER +# pragma warning(push) +// warning C4127: conditional expression is constant +# pragma warning(disable : 4127) +#endif + +#if (defined(__GNUC__) && __GNUC__ < 5) && !defined(__clang__) && !defined(_MSC_VER) +# define OPERATOR_LITERAL(suffix) operator"" _##suffix +#else +# define OPERATOR_LITERAL(suffix) operator""_##suffix +#endif + +namespace date +{ + +//---------------+ +// Configuration | +//---------------+ + +#ifndef ONLY_C_LOCALE +# define ONLY_C_LOCALE 0 +#endif + +#if defined(_MSC_VER) && (!defined(__clang__) || (_MSC_VER < 1910)) +// MSVC +# ifndef _SILENCE_CXX17_UNCAUGHT_EXCEPTION_DEPRECATION_WARNING +# define _SILENCE_CXX17_UNCAUGHT_EXCEPTION_DEPRECATION_WARNING +# endif +# if _MSC_VER < 1910 +// before VS2017 +# define CONSTDATA const +# define CONSTCD11 +# define CONSTCD14 +# define NOEXCEPT _NOEXCEPT +# else +// VS2017 and later +# define CONSTDATA constexpr const +# define CONSTCD11 constexpr +# define CONSTCD14 constexpr +# define NOEXCEPT noexcept +# endif + +#elif defined(__SUNPRO_CC) && __SUNPRO_CC <= 0x5150 +// Oracle Developer Studio 12.6 and earlier +# define CONSTDATA constexpr const +# define CONSTCD11 constexpr +# define CONSTCD14 +# define NOEXCEPT noexcept + +#elif __cplusplus >= 201402 +// C++14 +# define CONSTDATA constexpr const +# define CONSTCD11 constexpr +# define CONSTCD14 constexpr +# define NOEXCEPT noexcept +#else +// C++11 +# define CONSTDATA constexpr const +# define CONSTCD11 constexpr +# define CONSTCD14 +# define NOEXCEPT noexcept +#endif + +#ifndef HAS_UNCAUGHT_EXCEPTIONS +# if __cplusplus >= 201703 || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) +# define HAS_UNCAUGHT_EXCEPTIONS 1 +# else +# define HAS_UNCAUGHT_EXCEPTIONS 0 +# endif +#endif // HAS_UNCAUGHT_EXCEPTIONS + +#ifndef HAS_VOID_T +# if __cplusplus >= 201703 || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) +# define HAS_VOID_T 1 +# else +# define HAS_VOID_T 0 +# endif +#endif // HAS_VOID_T + +// Protect from Oracle sun macro +#ifdef sun +# undef sun +#endif + +// Work around for a NVCC compiler bug which causes it to fail +// to compile std::ratio_{multiply,divide} when used directly +// in the std::chrono::duration template instantiations below +namespace detail { +template +using ratio_multiply = decltype(std::ratio_multiply{}); + +template +using ratio_divide = decltype(std::ratio_divide{}); +} // namespace detail + +//-----------+ +// Interface | +//-----------+ + +// durations + +using days = std::chrono::duration + , std::chrono::hours::period>>; + +using weeks = std::chrono::duration + , days::period>>; + +using years = std::chrono::duration + , days::period>>; + +using months = std::chrono::duration + >>; + +// time_point + +template + using sys_time = std::chrono::time_point; + +using sys_days = sys_time; +using sys_seconds = sys_time; + +struct local_t {}; + +template + using local_time = std::chrono::time_point; + +using local_seconds = local_time; +using local_days = local_time; + +// types + +struct last_spec +{ + explicit last_spec() = default; +}; + +class day; +class month; +class year; + +class weekday; +class weekday_indexed; +class weekday_last; + +class month_day; +class month_day_last; +class month_weekday; +class month_weekday_last; + +class year_month; + +class year_month_day; +class year_month_day_last; +class year_month_weekday; +class year_month_weekday_last; + +// date composition operators + +CONSTCD11 year_month operator/(const year& y, const month& m) NOEXCEPT; +CONSTCD11 year_month operator/(const year& y, int m) NOEXCEPT; + +CONSTCD11 month_day operator/(const day& d, const month& m) NOEXCEPT; +CONSTCD11 month_day operator/(const day& d, int m) NOEXCEPT; +CONSTCD11 month_day operator/(const month& m, const day& d) NOEXCEPT; +CONSTCD11 month_day operator/(const month& m, int d) NOEXCEPT; +CONSTCD11 month_day operator/(int m, const day& d) NOEXCEPT; + +CONSTCD11 month_day_last operator/(const month& m, last_spec) NOEXCEPT; +CONSTCD11 month_day_last operator/(int m, last_spec) NOEXCEPT; +CONSTCD11 month_day_last operator/(last_spec, const month& m) NOEXCEPT; +CONSTCD11 month_day_last operator/(last_spec, int m) NOEXCEPT; + +CONSTCD11 month_weekday operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT; +CONSTCD11 month_weekday operator/(int m, const weekday_indexed& wdi) NOEXCEPT; +CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT; +CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, int m) NOEXCEPT; + +CONSTCD11 month_weekday_last operator/(const month& m, const weekday_last& wdl) NOEXCEPT; +CONSTCD11 month_weekday_last operator/(int m, const weekday_last& wdl) NOEXCEPT; +CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, const month& m) NOEXCEPT; +CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, int m) NOEXCEPT; + +CONSTCD11 year_month_day operator/(const year_month& ym, const day& d) NOEXCEPT; +CONSTCD11 year_month_day operator/(const year_month& ym, int d) NOEXCEPT; +CONSTCD11 year_month_day operator/(const year& y, const month_day& md) NOEXCEPT; +CONSTCD11 year_month_day operator/(int y, const month_day& md) NOEXCEPT; +CONSTCD11 year_month_day operator/(const month_day& md, const year& y) NOEXCEPT; +CONSTCD11 year_month_day operator/(const month_day& md, int y) NOEXCEPT; + +CONSTCD11 + year_month_day_last operator/(const year_month& ym, last_spec) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(const year& y, const month_day_last& mdl) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(int y, const month_day_last& mdl) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(const month_day_last& mdl, const year& y) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(const month_day_last& mdl, int y) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const year& y, const month_weekday& mwd) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(int y, const month_weekday& mwd) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const month_weekday& mwd, const year& y) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const month_weekday& mwd, int y) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(int y, const month_weekday_last& mwdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const month_weekday_last& mwdl, int y) NOEXCEPT; + +// Detailed interface + +// day + +class day +{ + unsigned char d_; + +public: + day() = default; + explicit CONSTCD11 day(unsigned d) NOEXCEPT; + + CONSTCD14 day& operator++() NOEXCEPT; + CONSTCD14 day operator++(int) NOEXCEPT; + CONSTCD14 day& operator--() NOEXCEPT; + CONSTCD14 day operator--(int) NOEXCEPT; + + CONSTCD14 day& operator+=(const days& d) NOEXCEPT; + CONSTCD14 day& operator-=(const days& d) NOEXCEPT; + + CONSTCD11 explicit operator unsigned() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator!=(const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator< (const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator> (const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator<=(const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator>=(const day& x, const day& y) NOEXCEPT; + +CONSTCD11 day operator+(const day& x, const days& y) NOEXCEPT; +CONSTCD11 day operator+(const days& x, const day& y) NOEXCEPT; +CONSTCD11 day operator-(const day& x, const days& y) NOEXCEPT; +CONSTCD11 days operator-(const day& x, const day& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const day& d); + +// month + +class month +{ + unsigned char m_; + +public: + month() = default; + explicit CONSTCD11 month(unsigned m) NOEXCEPT; + + CONSTCD14 month& operator++() NOEXCEPT; + CONSTCD14 month operator++(int) NOEXCEPT; + CONSTCD14 month& operator--() NOEXCEPT; + CONSTCD14 month operator--(int) NOEXCEPT; + + CONSTCD14 month& operator+=(const months& m) NOEXCEPT; + CONSTCD14 month& operator-=(const months& m) NOEXCEPT; + + CONSTCD11 explicit operator unsigned() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator< (const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator> (const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator<=(const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator>=(const month& x, const month& y) NOEXCEPT; + +CONSTCD14 month operator+(const month& x, const months& y) NOEXCEPT; +CONSTCD14 month operator+(const months& x, const month& y) NOEXCEPT; +CONSTCD14 month operator-(const month& x, const months& y) NOEXCEPT; +CONSTCD14 months operator-(const month& x, const month& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month& m); + +// year + +class year +{ + short y_; + +public: + year() = default; + explicit CONSTCD11 year(int y) NOEXCEPT; + + CONSTCD14 year& operator++() NOEXCEPT; + CONSTCD14 year operator++(int) NOEXCEPT; + CONSTCD14 year& operator--() NOEXCEPT; + CONSTCD14 year operator--(int) NOEXCEPT; + + CONSTCD14 year& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 year operator-() const NOEXCEPT; + CONSTCD11 year operator+() const NOEXCEPT; + + CONSTCD11 bool is_leap() const NOEXCEPT; + + CONSTCD11 explicit operator int() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; + + static CONSTCD11 year min() NOEXCEPT { return year{-32767}; } + static CONSTCD11 year max() NOEXCEPT { return year{32767}; } +}; + +CONSTCD11 bool operator==(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator< (const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator> (const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year& x, const year& y) NOEXCEPT; + +CONSTCD11 year operator+(const year& x, const years& y) NOEXCEPT; +CONSTCD11 year operator+(const years& x, const year& y) NOEXCEPT; +CONSTCD11 year operator-(const year& x, const years& y) NOEXCEPT; +CONSTCD11 years operator-(const year& x, const year& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year& y); + +// weekday + +class weekday +{ + unsigned char wd_; +public: + weekday() = default; + explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT; + CONSTCD14 weekday(const sys_days& dp) NOEXCEPT; + CONSTCD14 explicit weekday(const local_days& dp) NOEXCEPT; + + CONSTCD14 weekday& operator++() NOEXCEPT; + CONSTCD14 weekday operator++(int) NOEXCEPT; + CONSTCD14 weekday& operator--() NOEXCEPT; + CONSTCD14 weekday operator--(int) NOEXCEPT; + + CONSTCD14 weekday& operator+=(const days& d) NOEXCEPT; + CONSTCD14 weekday& operator-=(const days& d) NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; + + CONSTCD11 unsigned c_encoding() const NOEXCEPT; + CONSTCD11 unsigned iso_encoding() const NOEXCEPT; + + CONSTCD11 weekday_indexed operator[](unsigned index) const NOEXCEPT; + CONSTCD11 weekday_last operator[](last_spec) const NOEXCEPT; + +private: + static CONSTCD14 unsigned char weekday_from_days(int z) NOEXCEPT; + + friend CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT; + friend CONSTCD14 days operator-(const weekday& x, const weekday& y) NOEXCEPT; + friend CONSTCD14 weekday operator+(const weekday& x, const days& y) NOEXCEPT; + template + friend std::basic_ostream& + operator<<(std::basic_ostream& os, const weekday& wd); + friend class weekday_indexed; +}; + +CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weekday& x, const weekday& y) NOEXCEPT; + +CONSTCD14 weekday operator+(const weekday& x, const days& y) NOEXCEPT; +CONSTCD14 weekday operator+(const days& x, const weekday& y) NOEXCEPT; +CONSTCD14 weekday operator-(const weekday& x, const days& y) NOEXCEPT; +CONSTCD14 days operator-(const weekday& x, const weekday& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday& wd); + +// weekday_indexed + +class weekday_indexed +{ + unsigned char wd_ : 4; + unsigned char index_ : 4; + +public: + weekday_indexed() = default; + CONSTCD11 weekday_indexed(const date::weekday& wd, unsigned index) NOEXCEPT; + + CONSTCD11 date::weekday weekday() const NOEXCEPT; + CONSTCD11 unsigned index() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_indexed& wdi); + +// weekday_last + +class weekday_last +{ + date::weekday wd_; + +public: + explicit CONSTCD11 weekday_last(const date::weekday& wd) NOEXCEPT; + + CONSTCD11 date::weekday weekday() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_last& wdl); + +namespace detail +{ + +struct unspecified_month_disambiguator {}; + +} // namespace detail + +// year_month + +class year_month +{ + date::year y_; + date::month m_; + +public: + year_month() = default; + CONSTCD11 year_month(const date::year& y, const date::month& m) NOEXCEPT; + + CONSTCD11 date::year year() const NOEXCEPT; + CONSTCD11 date::month month() const NOEXCEPT; + + template + CONSTCD14 year_month& operator+=(const months& dm) NOEXCEPT; + template + CONSTCD14 year_month& operator-=(const months& dm) NOEXCEPT; + CONSTCD14 year_month& operator+=(const years& dy) NOEXCEPT; + CONSTCD14 year_month& operator-=(const years& dy) NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator< (const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator> (const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year_month& x, const year_month& y) NOEXCEPT; + +template +CONSTCD14 year_month operator+(const year_month& ym, const months& dm) NOEXCEPT; +template +CONSTCD14 year_month operator+(const months& dm, const year_month& ym) NOEXCEPT; +template +CONSTCD14 year_month operator-(const year_month& ym, const months& dm) NOEXCEPT; + +CONSTCD11 months operator-(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 year_month operator+(const year_month& ym, const years& dy) NOEXCEPT; +CONSTCD11 year_month operator+(const years& dy, const year_month& ym) NOEXCEPT; +CONSTCD11 year_month operator-(const year_month& ym, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month& ym); + +// month_day + +class month_day +{ + date::month m_; + date::day d_; + +public: + month_day() = default; + CONSTCD11 month_day(const date::month& m, const date::day& d) NOEXCEPT; + + CONSTCD11 date::month month() const NOEXCEPT; + CONSTCD11 date::day day() const NOEXCEPT; + + CONSTCD14 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator< (const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator> (const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator<=(const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator>=(const month_day& x, const month_day& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day& md); + +// month_day_last + +class month_day_last +{ + date::month m_; + +public: + CONSTCD11 explicit month_day_last(const date::month& m) NOEXCEPT; + + CONSTCD11 date::month month() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator< (const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator> (const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day_last& mdl); + +// month_weekday + +class month_weekday +{ + date::month m_; + date::weekday_indexed wdi_; +public: + CONSTCD11 month_weekday(const date::month& m, + const date::weekday_indexed& wdi) NOEXCEPT; + + CONSTCD11 date::month month() const NOEXCEPT; + CONSTCD11 date::weekday_indexed weekday_indexed() const NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday& mwd); + +// month_weekday_last + +class month_weekday_last +{ + date::month m_; + date::weekday_last wdl_; + +public: + CONSTCD11 month_weekday_last(const date::month& m, + const date::weekday_last& wd) NOEXCEPT; + + CONSTCD11 date::month month() const NOEXCEPT; + CONSTCD11 date::weekday_last weekday_last() const NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 + bool operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT; +CONSTCD11 + bool operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday_last& mwdl); + +// class year_month_day + +class year_month_day +{ + date::year y_; + date::month m_; + date::day d_; + +public: + year_month_day() = default; + CONSTCD11 year_month_day(const date::year& y, const date::month& m, + const date::day& d) NOEXCEPT; + CONSTCD14 year_month_day(const year_month_day_last& ymdl) NOEXCEPT; + + CONSTCD14 year_month_day(sys_days dp) NOEXCEPT; + CONSTCD14 explicit year_month_day(local_days dp) NOEXCEPT; + + template + CONSTCD14 year_month_day& operator+=(const months& m) NOEXCEPT; + template + CONSTCD14 year_month_day& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_day& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_day& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 date::year year() const NOEXCEPT; + CONSTCD11 date::month month() const NOEXCEPT; + CONSTCD11 date::day day() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD14 bool ok() const NOEXCEPT; + +private: + static CONSTCD14 year_month_day from_days(days dp) NOEXCEPT; + CONSTCD14 days to_days() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator< (const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator> (const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT; + +template +CONSTCD14 year_month_day operator+(const year_month_day& ymd, const months& dm) NOEXCEPT; +template +CONSTCD14 year_month_day operator+(const months& dm, const year_month_day& ymd) NOEXCEPT; +template +CONSTCD14 year_month_day operator-(const year_month_day& ymd, const months& dm) NOEXCEPT; +CONSTCD11 year_month_day operator+(const year_month_day& ymd, const years& dy) NOEXCEPT; +CONSTCD11 year_month_day operator+(const years& dy, const year_month_day& ymd) NOEXCEPT; +CONSTCD11 year_month_day operator-(const year_month_day& ymd, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day& ymd); + +// year_month_day_last + +class year_month_day_last +{ + date::year y_; + date::month_day_last mdl_; + +public: + CONSTCD11 year_month_day_last(const date::year& y, + const date::month_day_last& mdl) NOEXCEPT; + + template + CONSTCD14 year_month_day_last& operator+=(const months& m) NOEXCEPT; + template + CONSTCD14 year_month_day_last& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_day_last& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_day_last& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 date::year year() const NOEXCEPT; + CONSTCD11 date::month month() const NOEXCEPT; + CONSTCD11 date::month_day_last month_day_last() const NOEXCEPT; + CONSTCD14 date::day day() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 + bool operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator< (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator> (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; + +template +CONSTCD14 +year_month_day_last +operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT; + +template +CONSTCD14 +year_month_day_last +operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT; + +CONSTCD11 +year_month_day_last +operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT; + +CONSTCD11 +year_month_day_last +operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT; + +template +CONSTCD14 +year_month_day_last +operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT; + +CONSTCD11 +year_month_day_last +operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day_last& ymdl); + +// year_month_weekday + +class year_month_weekday +{ + date::year y_; + date::month m_; + date::weekday_indexed wdi_; + +public: + year_month_weekday() = default; + CONSTCD11 year_month_weekday(const date::year& y, const date::month& m, + const date::weekday_indexed& wdi) NOEXCEPT; + CONSTCD14 year_month_weekday(const sys_days& dp) NOEXCEPT; + CONSTCD14 explicit year_month_weekday(const local_days& dp) NOEXCEPT; + + template + CONSTCD14 year_month_weekday& operator+=(const months& m) NOEXCEPT; + template + CONSTCD14 year_month_weekday& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_weekday& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_weekday& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 date::year year() const NOEXCEPT; + CONSTCD11 date::month month() const NOEXCEPT; + CONSTCD11 date::weekday weekday() const NOEXCEPT; + CONSTCD11 unsigned index() const NOEXCEPT; + CONSTCD11 date::weekday_indexed weekday_indexed() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD14 bool ok() const NOEXCEPT; + +private: + static CONSTCD14 year_month_weekday from_days(days dp) NOEXCEPT; + CONSTCD14 days to_days() const NOEXCEPT; +}; + +CONSTCD11 + bool operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT; +CONSTCD11 + bool operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT; + +template +CONSTCD14 +year_month_weekday +operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT; + +template +CONSTCD14 +year_month_weekday +operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT; + +template +CONSTCD14 +year_month_weekday +operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday& ymwdi); + +// year_month_weekday_last + +class year_month_weekday_last +{ + date::year y_; + date::month m_; + date::weekday_last wdl_; + +public: + CONSTCD11 year_month_weekday_last(const date::year& y, const date::month& m, + const date::weekday_last& wdl) NOEXCEPT; + + template + CONSTCD14 year_month_weekday_last& operator+=(const months& m) NOEXCEPT; + template + CONSTCD14 year_month_weekday_last& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_weekday_last& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_weekday_last& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 date::year year() const NOEXCEPT; + CONSTCD11 date::month month() const NOEXCEPT; + CONSTCD11 date::weekday weekday() const NOEXCEPT; + CONSTCD11 date::weekday_last weekday_last() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; + +private: + CONSTCD14 days to_days() const NOEXCEPT; +}; + +CONSTCD11 +bool +operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT; + +CONSTCD11 +bool +operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT; + +template +CONSTCD14 +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT; + +template +CONSTCD14 +year_month_weekday_last +operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT; + +template +CONSTCD14 +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday_last& ymwdl); + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +inline namespace literals +{ + +CONSTCD11 date::day OPERATOR_LITERAL(d)(unsigned long long d) NOEXCEPT; +CONSTCD11 date::year OPERATOR_LITERAL(y)(unsigned long long y) NOEXCEPT; + +} // inline namespace literals +#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900) + +// CONSTDATA date::month January{1}; +// CONSTDATA date::month February{2}; +// CONSTDATA date::month March{3}; +// CONSTDATA date::month April{4}; +// CONSTDATA date::month May{5}; +// CONSTDATA date::month June{6}; +// CONSTDATA date::month July{7}; +// CONSTDATA date::month August{8}; +// CONSTDATA date::month September{9}; +// CONSTDATA date::month October{10}; +// CONSTDATA date::month November{11}; +// CONSTDATA date::month December{12}; +// +// CONSTDATA date::weekday Sunday{0u}; +// CONSTDATA date::weekday Monday{1u}; +// CONSTDATA date::weekday Tuesday{2u}; +// CONSTDATA date::weekday Wednesday{3u}; +// CONSTDATA date::weekday Thursday{4u}; +// CONSTDATA date::weekday Friday{5u}; +// CONSTDATA date::weekday Saturday{6u}; + +#if HAS_VOID_T + +template > +struct is_clock + : std::false_type +{}; + +template +struct is_clock> + : std::true_type +{}; + +template inline constexpr bool is_clock_v = is_clock::value; + +#endif // HAS_VOID_T + +//----------------+ +// Implementation | +//----------------+ + +// utilities +namespace detail { + +template> +class save_istream +{ +protected: + std::basic_ios& is_; + CharT fill_; + std::ios::fmtflags flags_; + std::streamsize precision_; + std::streamsize width_; + std::basic_ostream* tie_; + std::locale loc_; + +public: + ~save_istream() + { + is_.fill(fill_); + is_.flags(flags_); + is_.precision(precision_); + is_.width(width_); + is_.imbue(loc_); + is_.tie(tie_); + } + + save_istream(const save_istream&) = delete; + save_istream& operator=(const save_istream&) = delete; + + explicit save_istream(std::basic_ios& is) + : is_(is) + , fill_(is.fill()) + , flags_(is.flags()) + , precision_(is.precision()) + , width_(is.width(0)) + , tie_(is.tie(nullptr)) + , loc_(is.getloc()) + { + if (tie_ != nullptr) + tie_->flush(); + } +}; + +template> +class save_ostream + : private save_istream +{ +public: + ~save_ostream() + { + if ((this->flags_ & std::ios::unitbuf) && +#if HAS_UNCAUGHT_EXCEPTIONS + std::uncaught_exceptions() == 0 && +#else + !std::uncaught_exception() && +#endif + this->is_.good()) + this->is_.rdbuf()->pubsync(); + } + + save_ostream(const save_ostream&) = delete; + save_ostream& operator=(const save_ostream&) = delete; + + explicit save_ostream(std::basic_ios& os) + : save_istream(os) + { + } +}; + +template +struct choose_trunc_type +{ + static const int digits = std::numeric_limits::digits; + using type = typename std::conditional + < + digits < 32, + std::int32_t, + typename std::conditional + < + digits < 64, + std::int64_t, +#ifdef __SIZEOF_INT128__ + __int128 +#else + std::int64_t +#endif + >::type + >::type; +}; + +template +CONSTCD11 +inline +typename std::enable_if +< + !std::chrono::treat_as_floating_point::value, + T +>::type +trunc(T t) NOEXCEPT +{ + return t; +} + +template +CONSTCD14 +inline +typename std::enable_if +< + std::chrono::treat_as_floating_point::value, + T +>::type +trunc(T t) NOEXCEPT +{ + using std::numeric_limits; + using I = typename choose_trunc_type::type; + CONSTDATA auto digits = numeric_limits::digits; + static_assert(digits < numeric_limits::digits, ""); + CONSTDATA auto max = I{1} << (digits-1); + CONSTDATA auto min = -max; + const auto negative = t < T{0}; + if (min <= t && t <= max && t != 0 && t == t) + { + t = static_cast(static_cast(t)); + if (t == 0 && negative) + t = -t; + } + return t; +} + +template +struct static_gcd +{ + static const std::intmax_t value = static_gcd::value; +}; + +template +struct static_gcd +{ + static const std::intmax_t value = Xp; +}; + +template <> +struct static_gcd<0, 0> +{ + static const std::intmax_t value = 1; +}; + +template +struct no_overflow +{ +private: + static const std::intmax_t gcd_n1_n2 = static_gcd::value; + static const std::intmax_t gcd_d1_d2 = static_gcd::value; + static const std::intmax_t n1 = R1::num / gcd_n1_n2; + static const std::intmax_t d1 = R1::den / gcd_d1_d2; + static const std::intmax_t n2 = R2::num / gcd_n1_n2; + static const std::intmax_t d2 = R2::den / gcd_d1_d2; +#ifdef __cpp_constexpr + static const std::intmax_t max = std::numeric_limits::max(); +#else + static const std::intmax_t max = LLONG_MAX; +#endif + + template + struct mul // overflow == false + { + static const std::intmax_t value = Xp * Yp; + }; + + template + struct mul + { + static const std::intmax_t value = 1; + }; + +public: + static const bool value = (n1 <= max / d2) && (n2 <= max / d1); + typedef std::ratio::value, + mul::value> type; +}; + +} // detail + +// trunc towards zero +template +CONSTCD11 +inline +typename std::enable_if +< + detail::no_overflow::value, + To +>::type +trunc(const std::chrono::duration& d) +{ + return To{detail::trunc(std::chrono::duration_cast(d).count())}; +} + +template +CONSTCD11 +inline +typename std::enable_if +< + !detail::no_overflow::value, + To +>::type +trunc(const std::chrono::duration& d) +{ + using std::chrono::duration_cast; + using std::chrono::duration; + using rep = typename std::common_type::type; + return To{detail::trunc(duration_cast(duration_cast>(d)).count())}; +} + +#ifndef HAS_CHRONO_ROUNDING +# if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190023918 || (_MSC_FULL_VER >= 190000000 && defined (__clang__))) +# define HAS_CHRONO_ROUNDING 1 +# elif defined(__cpp_lib_chrono) && __cplusplus > 201402 && __cpp_lib_chrono >= 201510 +# define HAS_CHRONO_ROUNDING 1 +# elif defined(_LIBCPP_VERSION) && __cplusplus > 201402 && _LIBCPP_VERSION >= 3800 +# define HAS_CHRONO_ROUNDING 1 +# else +# define HAS_CHRONO_ROUNDING 0 +# endif +#endif // HAS_CHRONO_ROUNDING + +#if HAS_CHRONO_ROUNDING == 0 + +// round down +template +CONSTCD14 +inline +typename std::enable_if +< + detail::no_overflow::value, + To +>::type +floor(const std::chrono::duration& d) +{ + auto t = trunc(d); + if (t > d) + return t - To{1}; + return t; +} + +template +CONSTCD14 +inline +typename std::enable_if +< + !detail::no_overflow::value, + To +>::type +floor(const std::chrono::duration& d) +{ + using rep = typename std::common_type::type; + return floor(floor>(d)); +} + +// round to nearest, to even on tie +template +CONSTCD14 +inline +To +round(const std::chrono::duration& d) +{ + auto t0 = floor(d); + auto t1 = t0 + To{1}; + if (t1 == To{0} && t0 < To{0}) + t1 = -t1; + auto diff0 = d - t0; + auto diff1 = t1 - d; + if (diff0 == diff1) + { + if (t0 - trunc(t0/2)*2 == To{0}) + return t0; + return t1; + } + if (diff0 < diff1) + return t0; + return t1; +} + +// round up +template +CONSTCD14 +inline +To +ceil(const std::chrono::duration& d) +{ + auto t = trunc(d); + if (t < d) + return t + To{1}; + return t; +} + +template ::is_signed + >::type> +CONSTCD11 +std::chrono::duration +abs(std::chrono::duration d) +{ + return d >= d.zero() ? d : static_cast(-d); +} + +// round down +template +CONSTCD11 +inline +std::chrono::time_point +floor(const std::chrono::time_point& tp) +{ + using std::chrono::time_point; + return time_point{date::floor(tp.time_since_epoch())}; +} + +// round to nearest, to even on tie +template +CONSTCD11 +inline +std::chrono::time_point +round(const std::chrono::time_point& tp) +{ + using std::chrono::time_point; + return time_point{round(tp.time_since_epoch())}; +} + +// round up +template +CONSTCD11 +inline +std::chrono::time_point +ceil(const std::chrono::time_point& tp) +{ + using std::chrono::time_point; + return time_point{ceil(tp.time_since_epoch())}; +} + +#else // HAS_CHRONO_ROUNDING == 1 + +using std::chrono::floor; +using std::chrono::ceil; +using std::chrono::round; +using std::chrono::abs; + +#endif // HAS_CHRONO_ROUNDING + +namespace detail +{ + +template +CONSTCD14 +inline +typename std::enable_if +< + !std::chrono::treat_as_floating_point::value, + To +>::type +round_i(const std::chrono::duration& d) +{ + return round(d); +} + +template +CONSTCD14 +inline +typename std::enable_if +< + std::chrono::treat_as_floating_point::value, + To +>::type +round_i(const std::chrono::duration& d) +{ + return d; +} + +template +CONSTCD11 +inline +std::chrono::time_point +round_i(const std::chrono::time_point& tp) +{ + using std::chrono::time_point; + return time_point{round_i(tp.time_since_epoch())}; +} + +} // detail + +// trunc towards zero +template +CONSTCD11 +inline +std::chrono::time_point +trunc(const std::chrono::time_point& tp) +{ + using std::chrono::time_point; + return time_point{trunc(tp.time_since_epoch())}; +} + +// day + +CONSTCD11 inline day::day(unsigned d) NOEXCEPT : d_(static_cast(d)) {} +CONSTCD14 inline day& day::operator++() NOEXCEPT {++d_; return *this;} +CONSTCD14 inline day day::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline day& day::operator--() NOEXCEPT {--d_; return *this;} +CONSTCD14 inline day day::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} +CONSTCD14 inline day& day::operator+=(const days& d) NOEXCEPT {*this = *this + d; return *this;} +CONSTCD14 inline day& day::operator-=(const days& d) NOEXCEPT {*this = *this - d; return *this;} +CONSTCD11 inline day::operator unsigned() const NOEXCEPT {return d_;} +CONSTCD11 inline bool day::ok() const NOEXCEPT {return 1 <= d_ && d_ <= 31;} + +CONSTCD11 +inline +bool +operator==(const day& x, const day& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const day& x, const day& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const day& x, const day& y) NOEXCEPT +{ + return static_cast(x) < static_cast(y); +} + +CONSTCD11 +inline +bool +operator>(const day& x, const day& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const day& x, const day& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const day& x, const day& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD11 +inline +days +operator-(const day& x, const day& y) NOEXCEPT +{ + return days{static_cast(static_cast(x) + - static_cast(y))}; +} + +CONSTCD11 +inline +day +operator+(const day& x, const days& y) NOEXCEPT +{ + return day{static_cast(x) + static_cast(y.count())}; +} + +CONSTCD11 +inline +day +operator+(const days& x, const day& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD11 +inline +day +operator-(const day& x, const days& y) NOEXCEPT +{ + return x + -y; +} + +namespace detail +{ + +template +std::basic_ostream& +low_level_fmt(std::basic_ostream& os, const day& d) +{ + detail::save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os.width(2); + os << static_cast(d); + return os; +} + +} // namespace detail + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const day& d) +{ + detail::low_level_fmt(os, d); + if (!d.ok()) + os << " is not a valid day"; + return os; +} + +// month + +CONSTCD11 inline month::month(unsigned m) NOEXCEPT : m_(static_cast(m)) {} +CONSTCD14 inline month& month::operator++() NOEXCEPT {*this += months{1}; return *this;} +CONSTCD14 inline month month::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline month& month::operator--() NOEXCEPT {*this -= months{1}; return *this;} +CONSTCD14 inline month month::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} + +CONSTCD14 +inline +month& +month::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +month& +month::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD11 inline month::operator unsigned() const NOEXCEPT {return m_;} +CONSTCD11 inline bool month::ok() const NOEXCEPT {return 1 <= m_ && m_ <= 12;} + +CONSTCD11 +inline +bool +operator==(const month& x, const month& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const month& x, const month& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const month& x, const month& y) NOEXCEPT +{ + return static_cast(x) < static_cast(y); +} + +CONSTCD11 +inline +bool +operator>(const month& x, const month& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const month& x, const month& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const month& x, const month& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD14 +inline +months +operator-(const month& x, const month& y) NOEXCEPT +{ + auto const d = static_cast(x) - static_cast(y); + return months(d <= 11 ? d : d + 12); +} + +CONSTCD14 +inline +month +operator+(const month& x, const months& y) NOEXCEPT +{ + auto const mu = static_cast(static_cast(x)) + y.count() - 1; + auto const yr = (mu >= 0 ? mu : mu-11) / 12; + return month{static_cast(mu - yr * 12 + 1)}; +} + +CONSTCD14 +inline +month +operator+(const months& x, const month& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD14 +inline +month +operator-(const month& x, const months& y) NOEXCEPT +{ + return x + -y; +} + +namespace detail +{ + +template +std::basic_ostream& +low_level_fmt(std::basic_ostream& os, const month& m) +{ + if (m.ok()) + { + CharT fmt[] = {'%', 'b', 0}; + os << format(os.getloc(), fmt, m); + } + else + os << static_cast(m); + return os; +} + +} // namespace detail + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month& m) +{ + detail::low_level_fmt(os, m); + if (!m.ok()) + os << " is not a valid month"; + return os; +} + +// year + +CONSTCD11 inline year::year(int y) NOEXCEPT : y_(static_cast(y)) {} +CONSTCD14 inline year& year::operator++() NOEXCEPT {++y_; return *this;} +CONSTCD14 inline year year::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline year& year::operator--() NOEXCEPT {--y_; return *this;} +CONSTCD14 inline year year::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} +CONSTCD14 inline year& year::operator+=(const years& y) NOEXCEPT {*this = *this + y; return *this;} +CONSTCD14 inline year& year::operator-=(const years& y) NOEXCEPT {*this = *this - y; return *this;} +CONSTCD11 inline year year::operator-() const NOEXCEPT {return year{-y_};} +CONSTCD11 inline year year::operator+() const NOEXCEPT {return *this;} + +CONSTCD11 +inline +bool +year::is_leap() const NOEXCEPT +{ + return y_ % 4 == 0 && (y_ % 100 != 0 || y_ % 400 == 0); +} + +CONSTCD11 inline year::operator int() const NOEXCEPT {return y_;} + +CONSTCD11 +inline +bool +year::ok() const NOEXCEPT +{ + return y_ != std::numeric_limits::min(); +} + +CONSTCD11 +inline +bool +operator==(const year& x, const year& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const year& x, const year& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year& x, const year& y) NOEXCEPT +{ + return static_cast(x) < static_cast(y); +} + +CONSTCD11 +inline +bool +operator>(const year& x, const year& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year& x, const year& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year& x, const year& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD11 +inline +years +operator-(const year& x, const year& y) NOEXCEPT +{ + return years{static_cast(x) - static_cast(y)}; +} + +CONSTCD11 +inline +year +operator+(const year& x, const years& y) NOEXCEPT +{ + return year{static_cast(x) + y.count()}; +} + +CONSTCD11 +inline +year +operator+(const years& x, const year& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD11 +inline +year +operator-(const year& x, const years& y) NOEXCEPT +{ + return year{static_cast(x) - y.count()}; +} + +namespace detail +{ + +template +std::basic_ostream& +low_level_fmt(std::basic_ostream& os, const year& y) +{ + detail::save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::internal); + os.width(4 + (y < year{0})); + os.imbue(std::locale::classic()); + os << static_cast(y); + return os; +} + +} // namespace detail + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year& y) +{ + detail::low_level_fmt(os, y); + if (!y.ok()) + os << " is not a valid year"; + return os; +} + +// weekday + +CONSTCD14 +inline +unsigned char +weekday::weekday_from_days(int z) NOEXCEPT +{ + auto u = static_cast(z); + return static_cast(z >= -4 ? (u+4) % 7 : u % 7); +} + +CONSTCD11 +inline +weekday::weekday(unsigned wd) NOEXCEPT + : wd_(static_cast(wd != 7 ? wd : 0)) + {} + +CONSTCD14 +inline +weekday::weekday(const sys_days& dp) NOEXCEPT + : wd_(weekday_from_days(dp.time_since_epoch().count())) + {} + +CONSTCD14 +inline +weekday::weekday(const local_days& dp) NOEXCEPT + : wd_(weekday_from_days(dp.time_since_epoch().count())) + {} + +CONSTCD14 inline weekday& weekday::operator++() NOEXCEPT {*this += days{1}; return *this;} +CONSTCD14 inline weekday weekday::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline weekday& weekday::operator--() NOEXCEPT {*this -= days{1}; return *this;} +CONSTCD14 inline weekday weekday::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} + +CONSTCD14 +inline +weekday& +weekday::operator+=(const days& d) NOEXCEPT +{ + *this = *this + d; + return *this; +} + +CONSTCD14 +inline +weekday& +weekday::operator-=(const days& d) NOEXCEPT +{ + *this = *this - d; + return *this; +} + +CONSTCD11 inline bool weekday::ok() const NOEXCEPT {return wd_ <= 6;} + +CONSTCD11 +inline +unsigned weekday::c_encoding() const NOEXCEPT +{ + return unsigned{wd_}; +} + +CONSTCD11 +inline +unsigned weekday::iso_encoding() const NOEXCEPT +{ + return unsigned{((wd_ == 0u) ? 7u : wd_)}; +} + +CONSTCD11 +inline +bool +operator==(const weekday& x, const weekday& y) NOEXCEPT +{ + return x.wd_ == y.wd_; +} + +CONSTCD11 +inline +bool +operator!=(const weekday& x, const weekday& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD14 +inline +days +operator-(const weekday& x, const weekday& y) NOEXCEPT +{ + auto const wdu = x.wd_ - y.wd_; + auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7; + return days{wdu - wk * 7}; +} + +CONSTCD14 +inline +weekday +operator+(const weekday& x, const days& y) NOEXCEPT +{ + auto const wdu = static_cast(static_cast(x.wd_)) + y.count(); + auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7; + return weekday{static_cast(wdu - wk * 7)}; +} + +CONSTCD14 +inline +weekday +operator+(const days& x, const weekday& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD14 +inline +weekday +operator-(const weekday& x, const days& y) NOEXCEPT +{ + return x + -y; +} + +namespace detail +{ + +template +std::basic_ostream& +low_level_fmt(std::basic_ostream& os, const weekday& wd) +{ + if (wd.ok()) + { + CharT fmt[] = {'%', 'a', 0}; + os << format(fmt, wd); + } + else + os << wd.c_encoding(); + return os; +} + +} // namespace detail + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday& wd) +{ + detail::low_level_fmt(os, wd); + if (!wd.ok()) + os << " is not a valid weekday"; + return os; +} + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +inline namespace literals +{ + +CONSTCD11 +inline +date::day +OPERATOR_LITERAL(d)(unsigned long long d) NOEXCEPT +{ + return date::day{static_cast(d)}; +} + +CONSTCD11 +inline +date::year +OPERATOR_LITERAL(y)(unsigned long long y) NOEXCEPT +{ + return date::year(static_cast(y)); +} +#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900) + +CONSTDATA date::last_spec last{}; + +CONSTDATA date::month jan{1}; +CONSTDATA date::month feb{2}; +CONSTDATA date::month mar{3}; +CONSTDATA date::month apr{4}; +CONSTDATA date::month may{5}; +CONSTDATA date::month jun{6}; +CONSTDATA date::month jul{7}; +CONSTDATA date::month aug{8}; +CONSTDATA date::month sep{9}; +CONSTDATA date::month oct{10}; +CONSTDATA date::month nov{11}; +CONSTDATA date::month dec{12}; + +CONSTDATA date::weekday sun{0u}; +CONSTDATA date::weekday mon{1u}; +CONSTDATA date::weekday tue{2u}; +CONSTDATA date::weekday wed{3u}; +CONSTDATA date::weekday thu{4u}; +CONSTDATA date::weekday fri{5u}; +CONSTDATA date::weekday sat{6u}; + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +} // inline namespace literals +#endif + +CONSTDATA date::month January{1}; +CONSTDATA date::month February{2}; +CONSTDATA date::month March{3}; +CONSTDATA date::month April{4}; +CONSTDATA date::month May{5}; +CONSTDATA date::month June{6}; +CONSTDATA date::month July{7}; +CONSTDATA date::month August{8}; +CONSTDATA date::month September{9}; +CONSTDATA date::month October{10}; +CONSTDATA date::month November{11}; +CONSTDATA date::month December{12}; + +CONSTDATA date::weekday Monday{1}; +CONSTDATA date::weekday Tuesday{2}; +CONSTDATA date::weekday Wednesday{3}; +CONSTDATA date::weekday Thursday{4}; +CONSTDATA date::weekday Friday{5}; +CONSTDATA date::weekday Saturday{6}; +CONSTDATA date::weekday Sunday{7}; + +// weekday_indexed + +CONSTCD11 +inline +weekday +weekday_indexed::weekday() const NOEXCEPT +{ + return date::weekday{static_cast(wd_)}; +} + +CONSTCD11 inline unsigned weekday_indexed::index() const NOEXCEPT {return index_;} + +CONSTCD11 +inline +bool +weekday_indexed::ok() const NOEXCEPT +{ + return weekday().ok() && 1 <= index_ && index_ <= 5; +} + +#ifdef __GNUC__ +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wconversion" +#endif // __GNUC__ + +CONSTCD11 +inline +weekday_indexed::weekday_indexed(const date::weekday& wd, unsigned index) NOEXCEPT + : wd_(static_cast(static_cast(wd.wd_))) + , index_(static_cast(index)) + {} + +#ifdef __GNUC__ +# pragma GCC diagnostic pop +#endif // __GNUC__ + +namespace detail +{ + +template +std::basic_ostream& +low_level_fmt(std::basic_ostream& os, const weekday_indexed& wdi) +{ + return low_level_fmt(os, wdi.weekday()) << '[' << wdi.index() << ']'; +} + +} // namespace detail + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_indexed& wdi) +{ + detail::low_level_fmt(os, wdi); + if (!wdi.ok()) + os << " is not a valid weekday_indexed"; + return os; +} + +CONSTCD11 +inline +weekday_indexed +weekday::operator[](unsigned index) const NOEXCEPT +{ + return {*this, index}; +} + +CONSTCD11 +inline +bool +operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT +{ + return x.weekday() == y.weekday() && x.index() == y.index(); +} + +CONSTCD11 +inline +bool +operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT +{ + return !(x == y); +} + +// weekday_last + +CONSTCD11 inline date::weekday weekday_last::weekday() const NOEXCEPT {return wd_;} +CONSTCD11 inline bool weekday_last::ok() const NOEXCEPT {return wd_.ok();} +CONSTCD11 inline weekday_last::weekday_last(const date::weekday& wd) NOEXCEPT : wd_(wd) {} + +CONSTCD11 +inline +bool +operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT +{ + return x.weekday() == y.weekday(); +} + +CONSTCD11 +inline +bool +operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT +{ + return !(x == y); +} + +namespace detail +{ + +template +std::basic_ostream& +low_level_fmt(std::basic_ostream& os, const weekday_last& wdl) +{ + return low_level_fmt(os, wdl.weekday()) << "[last]"; +} + +} // namespace detail + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_last& wdl) +{ + detail::low_level_fmt(os, wdl); + if (!wdl.ok()) + os << " is not a valid weekday_last"; + return os; +} + +CONSTCD11 +inline +weekday_last +weekday::operator[](last_spec) const NOEXCEPT +{ + return weekday_last{*this}; +} + +// year_month + +CONSTCD11 +inline +year_month::year_month(const date::year& y, const date::month& m) NOEXCEPT + : y_(y) + , m_(m) + {} + +CONSTCD11 inline year year_month::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month::month() const NOEXCEPT {return m_;} +CONSTCD11 inline bool year_month::ok() const NOEXCEPT {return y_.ok() && m_.ok();} + +template +CONSTCD14 +inline +year_month& +year_month::operator+=(const months& dm) NOEXCEPT +{ + *this = *this + dm; + return *this; +} + +template +CONSTCD14 +inline +year_month& +year_month::operator-=(const months& dm) NOEXCEPT +{ + *this = *this - dm; + return *this; +} + +CONSTCD14 +inline +year_month& +year_month::operator+=(const years& dy) NOEXCEPT +{ + *this = *this + dy; + return *this; +} + +CONSTCD14 +inline +year_month& +year_month::operator-=(const years& dy) NOEXCEPT +{ + *this = *this - dy; + return *this; +} + +CONSTCD11 +inline +bool +operator==(const year_month& x, const year_month& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month& x, const year_month& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_month& x, const year_month& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (x.month() < y.month())); +} + +CONSTCD11 +inline +bool +operator>(const year_month& x, const year_month& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_month& x, const year_month& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_month& x, const year_month& y) NOEXCEPT +{ + return !(x < y); +} + +template +CONSTCD14 +inline +year_month +operator+(const year_month& ym, const months& dm) NOEXCEPT +{ + auto dmi = static_cast(static_cast(ym.month())) - 1 + dm.count(); + auto dy = (dmi >= 0 ? dmi : dmi-11) / 12; + dmi = dmi - dy * 12 + 1; + return (ym.year() + years(dy)) / month(static_cast(dmi)); +} + +template +CONSTCD14 +inline +year_month +operator+(const months& dm, const year_month& ym) NOEXCEPT +{ + return ym + dm; +} + +template +CONSTCD14 +inline +year_month +operator-(const year_month& ym, const months& dm) NOEXCEPT +{ + return ym + -dm; +} + +CONSTCD11 +inline +months +operator-(const year_month& x, const year_month& y) NOEXCEPT +{ + return (x.year() - y.year()) + + months(static_cast(x.month()) - static_cast(y.month())); +} + +CONSTCD11 +inline +year_month +operator+(const year_month& ym, const years& dy) NOEXCEPT +{ + return (ym.year() + dy) / ym.month(); +} + +CONSTCD11 +inline +year_month +operator+(const years& dy, const year_month& ym) NOEXCEPT +{ + return ym + dy; +} + +CONSTCD11 +inline +year_month +operator-(const year_month& ym, const years& dy) NOEXCEPT +{ + return ym + -dy; +} + +namespace detail +{ + +template +std::basic_ostream& +low_level_fmt(std::basic_ostream& os, const year_month& ym) +{ + low_level_fmt(os, ym.year()) << '/'; + return low_level_fmt(os, ym.month()); +} + +} // namespace detail + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month& ym) +{ + detail::low_level_fmt(os, ym); + if (!ym.ok()) + os << " is not a valid year_month"; + return os; +} + +// month_day + +CONSTCD11 +inline +month_day::month_day(const date::month& m, const date::day& d) NOEXCEPT + : m_(m) + , d_(d) + {} + +CONSTCD11 inline date::month month_day::month() const NOEXCEPT {return m_;} +CONSTCD11 inline date::day month_day::day() const NOEXCEPT {return d_;} + +CONSTCD14 +inline +bool +month_day::ok() const NOEXCEPT +{ + CONSTDATA date::day d[] = + { + date::day(31), date::day(29), date::day(31), + date::day(30), date::day(31), date::day(30), + date::day(31), date::day(31), date::day(30), + date::day(31), date::day(30), date::day(31) + }; + return m_.ok() && date::day{1} <= d_ && d_ <= d[static_cast(m_)-1]; +} + +CONSTCD11 +inline +bool +operator==(const month_day& x, const month_day& y) NOEXCEPT +{ + return x.month() == y.month() && x.day() == y.day(); +} + +CONSTCD11 +inline +bool +operator!=(const month_day& x, const month_day& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const month_day& x, const month_day& y) NOEXCEPT +{ + return x.month() < y.month() ? true + : (x.month() > y.month() ? false + : (x.day() < y.day())); +} + +CONSTCD11 +inline +bool +operator>(const month_day& x, const month_day& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const month_day& x, const month_day& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const month_day& x, const month_day& y) NOEXCEPT +{ + return !(x < y); +} + +namespace detail +{ + +template +std::basic_ostream& +low_level_fmt(std::basic_ostream& os, const month_day& md) +{ + low_level_fmt(os, md.month()) << '/'; + return low_level_fmt(os, md.day()); +} + +} // namespace detail + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day& md) +{ + detail::low_level_fmt(os, md); + if (!md.ok()) + os << " is not a valid month_day"; + return os; +} + +// month_day_last + +CONSTCD11 inline month month_day_last::month() const NOEXCEPT {return m_;} +CONSTCD11 inline bool month_day_last::ok() const NOEXCEPT {return m_.ok();} +CONSTCD11 inline month_day_last::month_day_last(const date::month& m) NOEXCEPT : m_(m) {} + +CONSTCD11 +inline +bool +operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return x.month() == y.month(); +} + +CONSTCD11 +inline +bool +operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return x.month() < y.month(); +} + +CONSTCD11 +inline +bool +operator>(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return !(x < y); +} + +namespace detail +{ + +template +std::basic_ostream& +low_level_fmt(std::basic_ostream& os, const month_day_last& mdl) +{ + return low_level_fmt(os, mdl.month()) << "/last"; +} + +} // namespace detail + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day_last& mdl) +{ + detail::low_level_fmt(os, mdl); + if (!mdl.ok()) + os << " is not a valid month_day_last"; + return os; +} + +// month_weekday + +CONSTCD11 +inline +month_weekday::month_weekday(const date::month& m, + const date::weekday_indexed& wdi) NOEXCEPT + : m_(m) + , wdi_(wdi) + {} + +CONSTCD11 inline month month_weekday::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday_indexed +month_weekday::weekday_indexed() const NOEXCEPT +{ + return wdi_; +} + +CONSTCD11 +inline +bool +month_weekday::ok() const NOEXCEPT +{ + return m_.ok() && wdi_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT +{ + return x.month() == y.month() && x.weekday_indexed() == y.weekday_indexed(); +} + +CONSTCD11 +inline +bool +operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT +{ + return !(x == y); +} + +namespace detail +{ + +template +std::basic_ostream& +low_level_fmt(std::basic_ostream& os, const month_weekday& mwd) +{ + low_level_fmt(os, mwd.month()) << '/'; + return low_level_fmt(os, mwd.weekday_indexed()); +} + +} // namespace detail + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday& mwd) +{ + detail::low_level_fmt(os, mwd); + if (!mwd.ok()) + os << " is not a valid month_weekday"; + return os; +} + +// month_weekday_last + +CONSTCD11 +inline +month_weekday_last::month_weekday_last(const date::month& m, + const date::weekday_last& wdl) NOEXCEPT + : m_(m) + , wdl_(wdl) + {} + +CONSTCD11 inline month month_weekday_last::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday_last +month_weekday_last::weekday_last() const NOEXCEPT +{ + return wdl_; +} + +CONSTCD11 +inline +bool +month_weekday_last::ok() const NOEXCEPT +{ + return m_.ok() && wdl_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT +{ + return x.month() == y.month() && x.weekday_last() == y.weekday_last(); +} + +CONSTCD11 +inline +bool +operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT +{ + return !(x == y); +} + +namespace detail +{ + +template +std::basic_ostream& +low_level_fmt(std::basic_ostream& os, const month_weekday_last& mwdl) +{ + low_level_fmt(os, mwdl.month()) << '/'; + return low_level_fmt(os, mwdl.weekday_last()); +} + +} // namespace detail + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday_last& mwdl) +{ + detail::low_level_fmt(os, mwdl); + if (!mwdl.ok()) + os << " is not a valid month_weekday_last"; + return os; +} + +// year_month_day_last + +CONSTCD11 +inline +year_month_day_last::year_month_day_last(const date::year& y, + const date::month_day_last& mdl) NOEXCEPT + : y_(y) + , mdl_(mdl) + {} + +template +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +template +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline year year_month_day_last::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_day_last::month() const NOEXCEPT {return mdl_.month();} + +CONSTCD11 +inline +month_day_last +year_month_day_last::month_day_last() const NOEXCEPT +{ + return mdl_; +} + +CONSTCD14 +inline +day +year_month_day_last::day() const NOEXCEPT +{ + CONSTDATA date::day d[] = + { + date::day(31), date::day(28), date::day(31), + date::day(30), date::day(31), date::day(30), + date::day(31), date::day(31), date::day(30), + date::day(31), date::day(30), date::day(31) + }; + return (month() != February || !y_.is_leap()) && mdl_.ok() ? + d[static_cast(month()) - 1] : date::day{29}; +} + +CONSTCD14 +inline +year_month_day_last::operator sys_days() const NOEXCEPT +{ + return sys_days(year()/month()/day()); +} + +CONSTCD14 +inline +year_month_day_last::operator local_days() const NOEXCEPT +{ + return local_days(year()/month()/day()); +} + +CONSTCD11 +inline +bool +year_month_day_last::ok() const NOEXCEPT +{ + return y_.ok() && mdl_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return x.year() == y.year() && x.month_day_last() == y.month_day_last(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (x.month_day_last() < y.month_day_last())); +} + +CONSTCD11 +inline +bool +operator>(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return !(x < y); +} + +namespace detail +{ + +template +std::basic_ostream& +low_level_fmt(std::basic_ostream& os, const year_month_day_last& ymdl) +{ + low_level_fmt(os, ymdl.year()) << '/'; + return low_level_fmt(os, ymdl.month_day_last()); +} + +} // namespace detail + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day_last& ymdl) +{ + detail::low_level_fmt(os, ymdl); + if (!ymdl.ok()) + os << " is not a valid year_month_day_last"; + return os; +} + +template +CONSTCD14 +inline +year_month_day_last +operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT +{ + return (ymdl.year() / ymdl.month() + dm) / last; +} + +template +CONSTCD14 +inline +year_month_day_last +operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT +{ + return ymdl + dm; +} + +template +CONSTCD14 +inline +year_month_day_last +operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT +{ + return ymdl + (-dm); +} + +CONSTCD11 +inline +year_month_day_last +operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT +{ + return {ymdl.year()+dy, ymdl.month_day_last()}; +} + +CONSTCD11 +inline +year_month_day_last +operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT +{ + return ymdl + dy; +} + +CONSTCD11 +inline +year_month_day_last +operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT +{ + return ymdl + (-dy); +} + +// year_month_day + +CONSTCD11 +inline +year_month_day::year_month_day(const date::year& y, const date::month& m, + const date::day& d) NOEXCEPT + : y_(y) + , m_(m) + , d_(d) + {} + +CONSTCD14 +inline +year_month_day::year_month_day(const year_month_day_last& ymdl) NOEXCEPT + : y_(ymdl.year()) + , m_(ymdl.month()) + , d_(ymdl.day()) + {} + +CONSTCD14 +inline +year_month_day::year_month_day(sys_days dp) NOEXCEPT + : year_month_day(from_days(dp.time_since_epoch())) + {} + +CONSTCD14 +inline +year_month_day::year_month_day(local_days dp) NOEXCEPT + : year_month_day(from_days(dp.time_since_epoch())) + {} + +CONSTCD11 inline year year_month_day::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_day::month() const NOEXCEPT {return m_;} +CONSTCD11 inline day year_month_day::day() const NOEXCEPT {return d_;} + +template +CONSTCD14 +inline +year_month_day& +year_month_day::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +template +CONSTCD14 +inline +year_month_day& +year_month_day::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_day& +year_month_day::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_day& +year_month_day::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD14 +inline +days +year_month_day::to_days() const NOEXCEPT +{ + static_assert(std::numeric_limits::digits >= 18, + "This algorithm has not been ported to a 16 bit unsigned integer"); + static_assert(std::numeric_limits::digits >= 20, + "This algorithm has not been ported to a 16 bit signed integer"); + auto const y = static_cast(y_) - (m_ <= February); + auto const m = static_cast(m_); + auto const d = static_cast(d_); + auto const era = (y >= 0 ? y : y-399) / 400; + auto const yoe = static_cast(y - era * 400); // [0, 399] + auto const doy = (153*(m > 2 ? m-3 : m+9) + 2)/5 + d-1; // [0, 365] + auto const doe = yoe * 365 + yoe/4 - yoe/100 + doy; // [0, 146096] + return days{era * 146097 + static_cast(doe) - 719468}; +} + +CONSTCD14 +inline +year_month_day::operator sys_days() const NOEXCEPT +{ + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_day::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; +} + +CONSTCD14 +inline +bool +year_month_day::ok() const NOEXCEPT +{ + if (!(y_.ok() && m_.ok())) + return false; + return date::day{1} <= d_ && d_ <= (y_ / m_ / last).day(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month() && x.day() == y.day(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (x.month() < y.month() ? true + : (x.month() > y.month() ? false + : (x.day() < y.day())))); +} + +CONSTCD11 +inline +bool +operator>(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day& ymd) +{ + detail::save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os.imbue(std::locale::classic()); + os << static_cast(ymd.year()) << '-'; + os.width(2); + os << static_cast(ymd.month()) << '-'; + os.width(2); + os << static_cast(ymd.day()); + if (!ymd.ok()) + os << " is not a valid year_month_day"; + return os; +} + +CONSTCD14 +inline +year_month_day +year_month_day::from_days(days dp) NOEXCEPT +{ + static_assert(std::numeric_limits::digits >= 18, + "This algorithm has not been ported to a 16 bit unsigned integer"); + static_assert(std::numeric_limits::digits >= 20, + "This algorithm has not been ported to a 16 bit signed integer"); + auto const z = dp.count() + 719468; + auto const era = (z >= 0 ? z : z - 146096) / 146097; + auto const doe = static_cast(z - era * 146097); // [0, 146096] + auto const yoe = (doe - doe/1460 + doe/36524 - doe/146096) / 365; // [0, 399] + auto const y = static_cast(yoe) + era * 400; + auto const doy = doe - (365*yoe + yoe/4 - yoe/100); // [0, 365] + auto const mp = (5*doy + 2)/153; // [0, 11] + auto const d = doy - (153*mp+2)/5 + 1; // [1, 31] + auto const m = mp < 10 ? mp+3 : mp-9; // [1, 12] + return year_month_day{date::year{y + (m <= 2)}, date::month(m), date::day(d)}; +} + +template +CONSTCD14 +inline +year_month_day +operator+(const year_month_day& ymd, const months& dm) NOEXCEPT +{ + return (ymd.year() / ymd.month() + dm) / ymd.day(); +} + +template +CONSTCD14 +inline +year_month_day +operator+(const months& dm, const year_month_day& ymd) NOEXCEPT +{ + return ymd + dm; +} + +template +CONSTCD14 +inline +year_month_day +operator-(const year_month_day& ymd, const months& dm) NOEXCEPT +{ + return ymd + (-dm); +} + +CONSTCD11 +inline +year_month_day +operator+(const year_month_day& ymd, const years& dy) NOEXCEPT +{ + return (ymd.year() + dy) / ymd.month() / ymd.day(); +} + +CONSTCD11 +inline +year_month_day +operator+(const years& dy, const year_month_day& ymd) NOEXCEPT +{ + return ymd + dy; +} + +CONSTCD11 +inline +year_month_day +operator-(const year_month_day& ymd, const years& dy) NOEXCEPT +{ + return ymd + (-dy); +} + +// year_month_weekday + +CONSTCD11 +inline +year_month_weekday::year_month_weekday(const date::year& y, const date::month& m, + const date::weekday_indexed& wdi) + NOEXCEPT + : y_(y) + , m_(m) + , wdi_(wdi) + {} + +CONSTCD14 +inline +year_month_weekday::year_month_weekday(const sys_days& dp) NOEXCEPT + : year_month_weekday(from_days(dp.time_since_epoch())) + {} + +CONSTCD14 +inline +year_month_weekday::year_month_weekday(const local_days& dp) NOEXCEPT + : year_month_weekday(from_days(dp.time_since_epoch())) + {} + +template +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +template +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline year year_month_weekday::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_weekday::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday +year_month_weekday::weekday() const NOEXCEPT +{ + return wdi_.weekday(); +} + +CONSTCD11 +inline +unsigned +year_month_weekday::index() const NOEXCEPT +{ + return wdi_.index(); +} + +CONSTCD11 +inline +weekday_indexed +year_month_weekday::weekday_indexed() const NOEXCEPT +{ + return wdi_; +} + +CONSTCD14 +inline +year_month_weekday::operator sys_days() const NOEXCEPT +{ + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_weekday::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; +} + +CONSTCD14 +inline +bool +year_month_weekday::ok() const NOEXCEPT +{ + if (!y_.ok() || !m_.ok() || !wdi_.weekday().ok() || wdi_.index() < 1) + return false; + if (wdi_.index() <= 4) + return true; + auto d2 = wdi_.weekday() - date::weekday(static_cast(y_/m_/1)) + + days((wdi_.index()-1)*7 + 1); + return static_cast(d2.count()) <= static_cast((y_/m_/last).day()); +} + +CONSTCD14 +inline +year_month_weekday +year_month_weekday::from_days(days d) NOEXCEPT +{ + sys_days dp{d}; + auto const wd = date::weekday(dp); + auto const ymd = year_month_day(dp); + return {ymd.year(), ymd.month(), wd[(static_cast(ymd.day())-1)/7+1]}; +} + +CONSTCD14 +inline +days +year_month_weekday::to_days() const NOEXCEPT +{ + auto d = sys_days(y_/m_/1); + return (d + (wdi_.weekday() - date::weekday(d) + days{(wdi_.index()-1)*7}) + ).time_since_epoch(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month() && + x.weekday_indexed() == y.weekday_indexed(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday& ymwdi) +{ + detail::low_level_fmt(os, ymwdi.year()) << '/'; + detail::low_level_fmt(os, ymwdi.month()) << '/'; + detail::low_level_fmt(os, ymwdi.weekday_indexed()); + if (!ymwdi.ok()) + os << " is not a valid year_month_weekday"; + return os; +} + +template +CONSTCD14 +inline +year_month_weekday +operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT +{ + return (ymwd.year() / ymwd.month() + dm) / ymwd.weekday_indexed(); +} + +template +CONSTCD14 +inline +year_month_weekday +operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT +{ + return ymwd + dm; +} + +template +CONSTCD14 +inline +year_month_weekday +operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT +{ + return ymwd + (-dm); +} + +CONSTCD11 +inline +year_month_weekday +operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT +{ + return {ymwd.year()+dy, ymwd.month(), ymwd.weekday_indexed()}; +} + +CONSTCD11 +inline +year_month_weekday +operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT +{ + return ymwd + dy; +} + +CONSTCD11 +inline +year_month_weekday +operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT +{ + return ymwd + (-dy); +} + +// year_month_weekday_last + +CONSTCD11 +inline +year_month_weekday_last::year_month_weekday_last(const date::year& y, + const date::month& m, + const date::weekday_last& wdl) NOEXCEPT + : y_(y) + , m_(m) + , wdl_(wdl) + {} + +template +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +template +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline year year_month_weekday_last::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_weekday_last::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday +year_month_weekday_last::weekday() const NOEXCEPT +{ + return wdl_.weekday(); +} + +CONSTCD11 +inline +weekday_last +year_month_weekday_last::weekday_last() const NOEXCEPT +{ + return wdl_; +} + +CONSTCD14 +inline +year_month_weekday_last::operator sys_days() const NOEXCEPT +{ + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_weekday_last::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; +} + +CONSTCD11 +inline +bool +year_month_weekday_last::ok() const NOEXCEPT +{ + return y_.ok() && m_.ok() && wdl_.ok(); +} + +CONSTCD14 +inline +days +year_month_weekday_last::to_days() const NOEXCEPT +{ + auto const d = sys_days(y_/m_/last); + return (d - (date::weekday{d} - wdl_.weekday())).time_since_epoch(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month() && + x.weekday_last() == y.weekday_last(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday_last& ymwdl) +{ + detail::low_level_fmt(os, ymwdl.year()) << '/'; + detail::low_level_fmt(os, ymwdl.month()) << '/'; + detail::low_level_fmt(os, ymwdl.weekday_last()); + if (!ymwdl.ok()) + os << " is not a valid year_month_weekday_last"; + return os; +} + +template +CONSTCD14 +inline +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT +{ + return (ymwdl.year() / ymwdl.month() + dm) / ymwdl.weekday_last(); +} + +template +CONSTCD14 +inline +year_month_weekday_last +operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT +{ + return ymwdl + dm; +} + +template +CONSTCD14 +inline +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT +{ + return ymwdl + (-dm); +} + +CONSTCD11 +inline +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT +{ + return {ymwdl.year()+dy, ymwdl.month(), ymwdl.weekday_last()}; +} + +CONSTCD11 +inline +year_month_weekday_last +operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT +{ + return ymwdl + dy; +} + +CONSTCD11 +inline +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT +{ + return ymwdl + (-dy); +} + +// year_month from operator/() + +CONSTCD11 +inline +year_month +operator/(const year& y, const month& m) NOEXCEPT +{ + return {y, m}; +} + +CONSTCD11 +inline +year_month +operator/(const year& y, int m) NOEXCEPT +{ + return y / month(static_cast(m)); +} + +// month_day from operator/() + +CONSTCD11 +inline +month_day +operator/(const month& m, const day& d) NOEXCEPT +{ + return {m, d}; +} + +CONSTCD11 +inline +month_day +operator/(const day& d, const month& m) NOEXCEPT +{ + return m / d; +} + +CONSTCD11 +inline +month_day +operator/(const month& m, int d) NOEXCEPT +{ + return m / day(static_cast(d)); +} + +CONSTCD11 +inline +month_day +operator/(int m, const day& d) NOEXCEPT +{ + return month(static_cast(m)) / d; +} + +CONSTCD11 inline month_day operator/(const day& d, int m) NOEXCEPT {return m / d;} + +// month_day_last from operator/() + +CONSTCD11 +inline +month_day_last +operator/(const month& m, last_spec) NOEXCEPT +{ + return month_day_last{m}; +} + +CONSTCD11 +inline +month_day_last +operator/(last_spec, const month& m) NOEXCEPT +{ + return m/last; +} + +CONSTCD11 +inline +month_day_last +operator/(int m, last_spec) NOEXCEPT +{ + return month(static_cast(m))/last; +} + +CONSTCD11 +inline +month_day_last +operator/(last_spec, int m) NOEXCEPT +{ + return m/last; +} + +// month_weekday from operator/() + +CONSTCD11 +inline +month_weekday +operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT +{ + return {m, wdi}; +} + +CONSTCD11 +inline +month_weekday +operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT +{ + return m / wdi; +} + +CONSTCD11 +inline +month_weekday +operator/(int m, const weekday_indexed& wdi) NOEXCEPT +{ + return month(static_cast(m)) / wdi; +} + +CONSTCD11 +inline +month_weekday +operator/(const weekday_indexed& wdi, int m) NOEXCEPT +{ + return m / wdi; +} + +// month_weekday_last from operator/() + +CONSTCD11 +inline +month_weekday_last +operator/(const month& m, const weekday_last& wdl) NOEXCEPT +{ + return {m, wdl}; +} + +CONSTCD11 +inline +month_weekday_last +operator/(const weekday_last& wdl, const month& m) NOEXCEPT +{ + return m / wdl; +} + +CONSTCD11 +inline +month_weekday_last +operator/(int m, const weekday_last& wdl) NOEXCEPT +{ + return month(static_cast(m)) / wdl; +} + +CONSTCD11 +inline +month_weekday_last +operator/(const weekday_last& wdl, int m) NOEXCEPT +{ + return m / wdl; +} + +// year_month_day from operator/() + +CONSTCD11 +inline +year_month_day +operator/(const year_month& ym, const day& d) NOEXCEPT +{ + return {ym.year(), ym.month(), d}; +} + +CONSTCD11 +inline +year_month_day +operator/(const year_month& ym, int d) NOEXCEPT +{ + return ym / day(static_cast(d)); +} + +CONSTCD11 +inline +year_month_day +operator/(const year& y, const month_day& md) NOEXCEPT +{ + return y / md.month() / md.day(); +} + +CONSTCD11 +inline +year_month_day +operator/(int y, const month_day& md) NOEXCEPT +{ + return year(y) / md; +} + +CONSTCD11 +inline +year_month_day +operator/(const month_day& md, const year& y) NOEXCEPT +{ + return y / md; +} + +CONSTCD11 +inline +year_month_day +operator/(const month_day& md, int y) NOEXCEPT +{ + return year(y) / md; +} + +// year_month_day_last from operator/() + +CONSTCD11 +inline +year_month_day_last +operator/(const year_month& ym, last_spec) NOEXCEPT +{ + return {ym.year(), month_day_last{ym.month()}}; +} + +CONSTCD11 +inline +year_month_day_last +operator/(const year& y, const month_day_last& mdl) NOEXCEPT +{ + return {y, mdl}; +} + +CONSTCD11 +inline +year_month_day_last +operator/(int y, const month_day_last& mdl) NOEXCEPT +{ + return year(y) / mdl; +} + +CONSTCD11 +inline +year_month_day_last +operator/(const month_day_last& mdl, const year& y) NOEXCEPT +{ + return y / mdl; +} + +CONSTCD11 +inline +year_month_day_last +operator/(const month_day_last& mdl, int y) NOEXCEPT +{ + return year(y) / mdl; +} + +// year_month_weekday from operator/() + +CONSTCD11 +inline +year_month_weekday +operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT +{ + return {ym.year(), ym.month(), wdi}; +} + +CONSTCD11 +inline +year_month_weekday +operator/(const year& y, const month_weekday& mwd) NOEXCEPT +{ + return {y, mwd.month(), mwd.weekday_indexed()}; +} + +CONSTCD11 +inline +year_month_weekday +operator/(int y, const month_weekday& mwd) NOEXCEPT +{ + return year(y) / mwd; +} + +CONSTCD11 +inline +year_month_weekday +operator/(const month_weekday& mwd, const year& y) NOEXCEPT +{ + return y / mwd; +} + +CONSTCD11 +inline +year_month_weekday +operator/(const month_weekday& mwd, int y) NOEXCEPT +{ + return year(y) / mwd; +} + +// year_month_weekday_last from operator/() + +CONSTCD11 +inline +year_month_weekday_last +operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT +{ + return {ym.year(), ym.month(), wdl}; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT +{ + return {y, mwdl.month(), mwdl.weekday_last()}; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(int y, const month_weekday_last& mwdl) NOEXCEPT +{ + return year(y) / mwdl; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT +{ + return y / mwdl; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(const month_weekday_last& mwdl, int y) NOEXCEPT +{ + return year(y) / mwdl; +} + +template +struct fields; + +template +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, + const fields& fds, const std::string* abbrev = nullptr, + const std::chrono::seconds* offset_sec = nullptr); + +template +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, + fields& fds, std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr); + +// hh_mm_ss + +namespace detail +{ + +struct undocumented {explicit undocumented() = default;}; + +// width::value is the number of fractional decimal digits in 1/n +// width<0>::value and width<1>::value are defined to be 0 +// If 1/n takes more than 18 fractional decimal digits, +// the result is truncated to 19. +// Example: width<2>::value == 1 +// Example: width<3>::value == 19 +// Example: width<4>::value == 2 +// Example: width<10>::value == 1 +// Example: width<1000>::value == 3 +template +struct width +{ + static_assert(d > 0, "width called with zero denominator"); + static CONSTDATA unsigned value = 1 + width::value; +}; + +template +struct width +{ + static CONSTDATA unsigned value = 0; +}; + +template +struct static_pow10 +{ +private: + static CONSTDATA std::uint64_t h = static_pow10::value; +public: + static CONSTDATA std::uint64_t value = h * h * (exp % 2 ? 10 : 1); +}; + +template <> +struct static_pow10<0> +{ + static CONSTDATA std::uint64_t value = 1; +}; + +template +class decimal_format_seconds +{ + using CT = typename std::common_type::type; + using rep = typename CT::rep; + static unsigned CONSTDATA trial_width = + detail::width::value; +public: + static unsigned CONSTDATA width = trial_width < 19 ? trial_width : 6u; + using precision = std::chrono::duration::value>>; + +private: + std::chrono::seconds s_; + precision sub_s_; + +public: + CONSTCD11 decimal_format_seconds() + : s_() + , sub_s_() + {} + + CONSTCD11 explicit decimal_format_seconds(const Duration& d) NOEXCEPT + : s_(std::chrono::duration_cast(d)) + , sub_s_(std::chrono::duration_cast(d - s_)) + {} + + CONSTCD14 std::chrono::seconds& seconds() NOEXCEPT {return s_;} + CONSTCD11 std::chrono::seconds seconds() const NOEXCEPT {return s_;} + CONSTCD11 precision subseconds() const NOEXCEPT {return sub_s_;} + + CONSTCD14 precision to_duration() const NOEXCEPT + { + return s_ + sub_s_; + } + + CONSTCD11 bool in_conventional_range() const NOEXCEPT + { + return sub_s_ < std::chrono::seconds{1} && s_ < std::chrono::minutes{1}; + } + + template + friend + std::basic_ostream& + operator<<(std::basic_ostream& os, const decimal_format_seconds& x) + { + return x.print(os, std::chrono::treat_as_floating_point{}); + } + + template + std::basic_ostream& + print(std::basic_ostream& os, std::true_type) const + { + date::detail::save_ostream _(os); + std::chrono::duration d = s_ + sub_s_; + if (d < std::chrono::seconds{10}) + os << '0'; + os.precision(width+6); + os << std::fixed << d.count(); + return os; + } + + template + std::basic_ostream& + print(std::basic_ostream& os, std::false_type) const + { + date::detail::save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os.width(2); + os << s_.count(); + if (width > 0) + { +#if !ONLY_C_LOCALE + os << std::use_facet>(os.getloc()).decimal_point(); +#else + os << '.'; +#endif + date::detail::save_ostream _s(os); + os.imbue(std::locale::classic()); + os.width(width); + os << sub_s_.count(); + } + return os; + } +}; + +template +inline +CONSTCD11 +typename std::enable_if + < + std::numeric_limits::is_signed, + std::chrono::duration + >::type +abs(std::chrono::duration d) +{ + return d >= d.zero() ? +d : -d; +} + +template +inline +CONSTCD11 +typename std::enable_if + < + !std::numeric_limits::is_signed, + std::chrono::duration + >::type +abs(std::chrono::duration d) +{ + return d; +} + +} // namespace detail + +template +class hh_mm_ss +{ + using dfs = detail::decimal_format_seconds::type>; + + std::chrono::hours h_; + std::chrono::minutes m_; + dfs s_; + bool neg_; + +public: + static unsigned CONSTDATA fractional_width = dfs::width; + using precision = typename dfs::precision; + + CONSTCD11 hh_mm_ss() NOEXCEPT + : hh_mm_ss(Duration::zero()) + {} + + CONSTCD11 explicit hh_mm_ss(Duration d) NOEXCEPT + : h_(std::chrono::duration_cast(detail::abs(d))) + , m_(std::chrono::duration_cast(detail::abs(d)) - h_) + , s_(detail::abs(d) - h_ - m_) + , neg_(d < Duration::zero()) + {} + + CONSTCD11 std::chrono::hours hours() const NOEXCEPT {return h_;} + CONSTCD11 std::chrono::minutes minutes() const NOEXCEPT {return m_;} + CONSTCD11 std::chrono::seconds seconds() const NOEXCEPT {return s_.seconds();} + CONSTCD14 std::chrono::seconds& + seconds(detail::undocumented) NOEXCEPT {return s_.seconds();} + CONSTCD11 precision subseconds() const NOEXCEPT {return s_.subseconds();} + CONSTCD11 bool is_negative() const NOEXCEPT {return neg_;} + + CONSTCD11 explicit operator precision() const NOEXCEPT {return to_duration();} + CONSTCD11 precision to_duration() const NOEXCEPT + {return (s_.to_duration() + m_ + h_) * (1-2*neg_);} + + CONSTCD11 bool in_conventional_range() const NOEXCEPT + { + return !neg_ && h_ < days{1} && m_ < std::chrono::hours{1} && + s_.in_conventional_range(); + } + +private: + + template + friend + std::basic_ostream& + operator<<(std::basic_ostream& os, hh_mm_ss const& tod) + { + if (tod.is_negative()) + os << '-'; + if (tod.h_ < std::chrono::hours{10}) + os << '0'; + os << tod.h_.count() << ':'; + if (tod.m_ < std::chrono::minutes{10}) + os << '0'; + os << tod.m_.count() << ':' << tod.s_; + return os; + } + + template + friend + std::basic_ostream& + date::to_stream(std::basic_ostream& os, const CharT* fmt, + const fields& fds, const std::string* abbrev, + const std::chrono::seconds* offset_sec); + + template + friend + std::basic_istream& + date::from_stream(std::basic_istream& is, const CharT* fmt, + fields& fds, + std::basic_string* abbrev, std::chrono::minutes* offset); +}; + +inline +CONSTCD14 +bool +is_am(std::chrono::hours const& h) NOEXCEPT +{ + using std::chrono::hours; + return hours{0} <= h && h < hours{12}; +} + +inline +CONSTCD14 +bool +is_pm(std::chrono::hours const& h) NOEXCEPT +{ + using std::chrono::hours; + return hours{12} <= h && h < hours{24}; +} + +inline +CONSTCD14 +std::chrono::hours +make12(std::chrono::hours h) NOEXCEPT +{ + using std::chrono::hours; + if (h < hours{12}) + { + if (h == hours{0}) + h = hours{12}; + } + else + { + if (h != hours{12}) + h = h - hours{12}; + } + return h; +} + +inline +CONSTCD14 +std::chrono::hours +make24(std::chrono::hours h, bool is_pm) NOEXCEPT +{ + using std::chrono::hours; + if (is_pm) + { + if (h != hours{12}) + h = h + hours{12}; + } + else if (h == hours{12}) + h = hours{0}; + return h; +} + +template +using time_of_day = hh_mm_ss; + +template +CONSTCD11 +inline +hh_mm_ss> +make_time(const std::chrono::duration& d) +{ + return hh_mm_ss>(d); +} + +template +inline +typename std::enable_if +< + !std::is_convertible::value, + std::basic_ostream& +>::type +operator<<(std::basic_ostream& os, const sys_time& tp) +{ + auto const dp = date::floor(tp); + return os << year_month_day(dp) << ' ' << make_time(tp-dp); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const sys_days& dp) +{ + return os << year_month_day(dp); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const local_time& ut) +{ + return (date::operator<<(os, sys_time{ut.time_since_epoch()})); +} + +namespace detail +{ + +template +class string_literal; + +template +inline +CONSTCD14 +string_literal::type, + N1 + N2 - 1> +operator+(const string_literal& x, const string_literal& y) NOEXCEPT; + +template +class string_literal +{ + CharT p_[N]; + + CONSTCD11 string_literal() NOEXCEPT + : p_{} + {} + +public: + using const_iterator = const CharT*; + + string_literal(string_literal const&) = default; + string_literal& operator=(string_literal const&) = delete; + + template ::type> + CONSTCD11 string_literal(CharT c) NOEXCEPT + : p_{c} + { + } + + template ::type> + CONSTCD11 string_literal(CharT c1, CharT c2) NOEXCEPT + : p_{c1, c2} + { + } + + template ::type> + CONSTCD11 string_literal(CharT c1, CharT c2, CharT c3) NOEXCEPT + : p_{c1, c2, c3} + { + } + + CONSTCD14 string_literal(const CharT(&a)[N]) NOEXCEPT + : p_{} + { + for (std::size_t i = 0; i < N; ++i) + p_[i] = a[i]; + } + + template ::type> + CONSTCD14 string_literal(const char(&a)[N]) NOEXCEPT + : p_{} + { + for (std::size_t i = 0; i < N; ++i) + p_[i] = a[i]; + } + + template ::value>::type> + CONSTCD14 string_literal(string_literal const& a) NOEXCEPT + : p_{} + { + for (std::size_t i = 0; i < N; ++i) + p_[i] = a[i]; + } + + CONSTCD11 const CharT* data() const NOEXCEPT {return p_;} + CONSTCD11 std::size_t size() const NOEXCEPT {return N-1;} + + CONSTCD11 const_iterator begin() const NOEXCEPT {return p_;} + CONSTCD11 const_iterator end() const NOEXCEPT {return p_ + N-1;} + + CONSTCD11 CharT const& operator[](std::size_t n) const NOEXCEPT + { + return p_[n]; + } + + template + friend + std::basic_ostream& + operator<<(std::basic_ostream& os, const string_literal& s) + { + return os << s.p_; + } + + template + friend + CONSTCD14 + string_literal::type, + N1 + N2 - 1> + operator+(const string_literal& x, const string_literal& y) NOEXCEPT; +}; + +template +CONSTCD11 +inline +string_literal +operator+(const string_literal& x, const string_literal& y) NOEXCEPT +{ + return string_literal(x[0], y[0]); +} + +template +CONSTCD11 +inline +string_literal +operator+(const string_literal& x, const string_literal& y) NOEXCEPT +{ + return string_literal(x[0], x[1], y[0]); +} + +template +CONSTCD14 +inline +string_literal::type, + N1 + N2 - 1> +operator+(const string_literal& x, const string_literal& y) NOEXCEPT +{ + using CT = typename std::conditional::type; + + string_literal r; + std::size_t i = 0; + for (; i < N1-1; ++i) + r.p_[i] = CT(x.p_[i]); + for (std::size_t j = 0; j < N2; ++j, ++i) + r.p_[i] = CT(y.p_[j]); + + return r; +} + + +template +inline +std::basic_string +operator+(std::basic_string x, const string_literal& y) +{ + x.append(y.data(), y.size()); + return x; +} + +#if __cplusplus >= 201402 && (!defined(__EDG_VERSION__) || __EDG_VERSION__ > 411) \ + && (!defined(__SUNPRO_CC) || __SUNPRO_CC > 0x5150) + +template ::value || + std::is_same::value || + std::is_same::value || + std::is_same::value>> +CONSTCD14 +inline +string_literal +msl(CharT c) NOEXCEPT +{ + return string_literal{c}; +} + +CONSTCD14 +inline +std::size_t +to_string_len(std::intmax_t i) +{ + std::size_t r = 0; + do + { + i /= 10; + ++r; + } while (i > 0); + return r; +} + +template +CONSTCD14 +inline +std::enable_if_t +< + N < 10, + string_literal +> +msl() NOEXCEPT +{ + return msl(char(N % 10 + '0')); +} + +template +CONSTCD14 +inline +std::enable_if_t +< + 10 <= N, + string_literal +> +msl() NOEXCEPT +{ + return msl() + msl(char(N % 10 + '0')); +} + +template +CONSTCD14 +inline +std::enable_if_t +< + std::ratio::type::den != 1, + string_literal::type::num) + + to_string_len(std::ratio::type::den) + 4> +> +msl(std::ratio) NOEXCEPT +{ + using R = typename std::ratio::type; + return msl(CharT{'['}) + msl() + msl(CharT{'/'}) + + msl() + msl(CharT{']'}); +} + +template +CONSTCD14 +inline +std::enable_if_t +< + std::ratio::type::den == 1, + string_literal::type::num) + 3> +> +msl(std::ratio) NOEXCEPT +{ + using R = typename std::ratio::type; + return msl(CharT{'['}) + msl() + msl(CharT{']'}); +} + + +#else // __cplusplus < 201402 || (defined(__EDG_VERSION__) && __EDG_VERSION__ <= 411) + +inline +std::string +to_string(std::uint64_t x) +{ + return std::to_string(x); +} + +template +inline +std::basic_string +to_string(std::uint64_t x) +{ + auto y = std::to_string(x); + return std::basic_string(y.begin(), y.end()); +} + +template +inline +typename std::enable_if +< + std::ratio::type::den != 1, + std::basic_string +>::type +msl(std::ratio) +{ + using R = typename std::ratio::type; + return std::basic_string(1, '[') + to_string(R::num) + CharT{'/'} + + to_string(R::den) + CharT{']'}; +} + +template +inline +typename std::enable_if +< + std::ratio::type::den == 1, + std::basic_string +>::type +msl(std::ratio) +{ + using R = typename std::ratio::type; + return std::basic_string(1, '[') + to_string(R::num) + CharT{']'}; +} + +#endif // __cplusplus < 201402 || (defined(__EDG_VERSION__) && __EDG_VERSION__ <= 411) + +template +CONSTCD11 +inline +string_literal +msl(std::atto) NOEXCEPT +{ + return string_literal{'a'}; +} + +template +CONSTCD11 +inline +string_literal +msl(std::femto) NOEXCEPT +{ + return string_literal{'f'}; +} + +template +CONSTCD11 +inline +string_literal +msl(std::pico) NOEXCEPT +{ + return string_literal{'p'}; +} + +template +CONSTCD11 +inline +string_literal +msl(std::nano) NOEXCEPT +{ + return string_literal{'n'}; +} + +template +CONSTCD11 +inline +typename std::enable_if +< + std::is_same::value, + string_literal +>::type +msl(std::micro) NOEXCEPT +{ + return string_literal{'\xC2', '\xB5'}; +} + +template +CONSTCD11 +inline +typename std::enable_if +< + !std::is_same::value, + string_literal +>::type +msl(std::micro) NOEXCEPT +{ + return string_literal{CharT{static_cast('\xB5')}}; +} + +template +CONSTCD11 +inline +string_literal +msl(std::milli) NOEXCEPT +{ + return string_literal{'m'}; +} + +template +CONSTCD11 +inline +string_literal +msl(std::centi) NOEXCEPT +{ + return string_literal{'c'}; +} + +template +CONSTCD11 +inline +string_literal +msl(std::deca) NOEXCEPT +{ + return string_literal{'d', 'a'}; +} + +template +CONSTCD11 +inline +string_literal +msl(std::deci) NOEXCEPT +{ + return string_literal{'d'}; +} + +template +CONSTCD11 +inline +string_literal +msl(std::hecto) NOEXCEPT +{ + return string_literal{'h'}; +} + +template +CONSTCD11 +inline +string_literal +msl(std::kilo) NOEXCEPT +{ + return string_literal{'k'}; +} + +template +CONSTCD11 +inline +string_literal +msl(std::mega) NOEXCEPT +{ + return string_literal{'M'}; +} + +template +CONSTCD11 +inline +string_literal +msl(std::giga) NOEXCEPT +{ + return string_literal{'G'}; +} + +template +CONSTCD11 +inline +string_literal +msl(std::tera) NOEXCEPT +{ + return string_literal{'T'}; +} + +template +CONSTCD11 +inline +string_literal +msl(std::peta) NOEXCEPT +{ + return string_literal{'P'}; +} + +template +CONSTCD11 +inline +string_literal +msl(std::exa) NOEXCEPT +{ + return string_literal{'E'}; +} + +template +CONSTCD11 +inline +auto +get_units(Period p) + -> decltype(msl(p) + string_literal{'s'}) +{ + return msl(p) + string_literal{'s'}; +} + +template +CONSTCD11 +inline +string_literal +get_units(std::ratio<1>) +{ + return string_literal{'s'}; +} + +template +CONSTCD11 +inline +string_literal +get_units(std::ratio<3600>) +{ + return string_literal{'h'}; +} + +template +CONSTCD11 +inline +string_literal +get_units(std::ratio<60>) +{ + return string_literal{'m', 'i', 'n'}; +} + +template +CONSTCD11 +inline +string_literal +get_units(std::ratio<86400>) +{ + return string_literal{'d'}; +} + +template > +struct make_string; + +template <> +struct make_string +{ + template + static + std::string + from(Rep n) + { + return std::to_string(n); + } +}; + +template +struct make_string +{ + template + static + std::basic_string + from(Rep n) + { + auto s = std::to_string(n); + return std::basic_string(s.begin(), s.end()); + } +}; + +template <> +struct make_string +{ + template + static + std::wstring + from(Rep n) + { + return std::to_wstring(n); + } +}; + +template +struct make_string +{ + template + static + std::basic_string + from(Rep n) + { + auto s = std::to_wstring(n); + return std::basic_string(s.begin(), s.end()); + } +}; + +} // namespace detail + +// to_stream + +CONSTDATA year nanyear{-32768}; + +template +struct fields +{ + year_month_day ymd{nanyear/0/0}; + weekday wd{8u}; + hh_mm_ss tod{}; + bool has_tod = false; + +#if !defined(__clang__) && defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ <= 409) + fields() : ymd{nanyear/0/0}, wd{8u}, tod{}, has_tod{false} {} +#else + fields() = default; +#endif + + fields(year_month_day ymd_) : ymd(ymd_) {} + fields(weekday wd_) : wd(wd_) {} + fields(hh_mm_ss tod_) : tod(tod_), has_tod(true) {} + + fields(year_month_day ymd_, weekday wd_) : ymd(ymd_), wd(wd_) {} + fields(year_month_day ymd_, hh_mm_ss tod_) : ymd(ymd_), tod(tod_), + has_tod(true) {} + + fields(weekday wd_, hh_mm_ss tod_) : wd(wd_), tod(tod_), has_tod(true) {} + + fields(year_month_day ymd_, weekday wd_, hh_mm_ss tod_) + : ymd(ymd_) + , wd(wd_) + , tod(tod_) + , has_tod(true) + {} +}; + +namespace detail +{ + +template +unsigned +extract_weekday(std::basic_ostream& os, const fields& fds) +{ + if (!fds.ymd.ok() && !fds.wd.ok()) + { + // fds does not contain a valid weekday + os.setstate(std::ios::failbit); + return 8; + } + weekday wd; + if (fds.ymd.ok()) + { + wd = weekday{sys_days(fds.ymd)}; + if (fds.wd.ok() && wd != fds.wd) + { + // fds.ymd and fds.wd are inconsistent + os.setstate(std::ios::failbit); + return 8; + } + } + else + wd = fds.wd; + return static_cast((wd - Sunday).count()); +} + +template +unsigned +extract_month(std::basic_ostream& os, const fields& fds) +{ + if (!fds.ymd.month().ok()) + { + // fds does not contain a valid month + os.setstate(std::ios::failbit); + return 0; + } + return static_cast(fds.ymd.month()); +} + +} // namespace detail + +#if ONLY_C_LOCALE + +namespace detail +{ + +inline +std::pair +weekday_names() +{ + static const std::string nm[] = + { + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat" + }; + return std::make_pair(nm, nm+sizeof(nm)/sizeof(nm[0])); +} + +inline +std::pair +month_names() +{ + static const std::string nm[] = + { + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + }; + return std::make_pair(nm, nm+sizeof(nm)/sizeof(nm[0])); +} + +inline +std::pair +ampm_names() +{ + static const std::string nm[] = + { + "AM", + "PM" + }; + return std::make_pair(nm, nm+sizeof(nm)/sizeof(nm[0])); +} + +template +FwdIter +scan_keyword(std::basic_istream& is, FwdIter kb, FwdIter ke) +{ + size_t nkw = static_cast(std::distance(kb, ke)); + const unsigned char doesnt_match = '\0'; + const unsigned char might_match = '\1'; + const unsigned char does_match = '\2'; + unsigned char statbuf[100]; + unsigned char* status = statbuf; + std::unique_ptr stat_hold(0, free); + if (nkw > sizeof(statbuf)) + { + status = (unsigned char*)std::malloc(nkw); + if (status == nullptr) + throw std::bad_alloc(); + stat_hold.reset(status); + } + size_t n_might_match = nkw; // At this point, any keyword might match + size_t n_does_match = 0; // but none of them definitely do + // Initialize all statuses to might_match, except for "" keywords are does_match + unsigned char* st = status; + for (auto ky = kb; ky != ke; ++ky, ++st) + { + if (!ky->empty()) + *st = might_match; + else + { + *st = does_match; + --n_might_match; + ++n_does_match; + } + } + // While there might be a match, test keywords against the next CharT + for (size_t indx = 0; is && n_might_match > 0; ++indx) + { + // Peek at the next CharT but don't consume it + auto ic = is.peek(); + if (ic == EOF) + { + is.setstate(std::ios::eofbit); + break; + } + auto c = static_cast(toupper(static_cast(ic))); + bool consume = false; + // For each keyword which might match, see if the indx character is c + // If a match if found, consume c + // If a match is found, and that is the last character in the keyword, + // then that keyword matches. + // If the keyword doesn't match this character, then change the keyword + // to doesn't match + st = status; + for (auto ky = kb; ky != ke; ++ky, ++st) + { + if (*st == might_match) + { + if (c == static_cast(toupper(static_cast((*ky)[indx])))) + { + consume = true; + if (ky->size() == indx+1) + { + *st = does_match; + --n_might_match; + ++n_does_match; + } + } + else + { + *st = doesnt_match; + --n_might_match; + } + } + } + // consume if we matched a character + if (consume) + { + (void)is.get(); + // If we consumed a character and there might be a matched keyword that + // was marked matched on a previous iteration, then such keywords + // are now marked as not matching. + if (n_might_match + n_does_match > 1) + { + st = status; + for (auto ky = kb; ky != ke; ++ky, ++st) + { + if (*st == does_match && ky->size() != indx+1) + { + *st = doesnt_match; + --n_does_match; + } + } + } + } + } + // We've exited the loop because we hit eof and/or we have no more "might matches". + // Return the first matching result + for (st = status; kb != ke; ++kb, ++st) + if (*st == does_match) + break; + if (kb == ke) + is.setstate(std::ios::failbit); + return kb; +} + +} // namespace detail + +#endif // ONLY_C_LOCALE + +template +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, + const fields& fds, const std::string* abbrev, + const std::chrono::seconds* offset_sec) +{ +#if ONLY_C_LOCALE + using detail::weekday_names; + using detail::month_names; + using detail::ampm_names; +#endif + using detail::save_ostream; + using detail::get_units; + using detail::extract_weekday; + using detail::extract_month; + using std::ios; + using std::chrono::duration_cast; + using std::chrono::seconds; + using std::chrono::minutes; + using std::chrono::hours; + date::detail::save_ostream ss(os); + os.fill(' '); + os.flags(std::ios::skipws | std::ios::dec); + os.width(0); + tm tm{}; + bool insert_negative = fds.has_tod && fds.tod.to_duration() < Duration::zero(); +#if !ONLY_C_LOCALE + auto& facet = std::use_facet>(os.getloc()); +#endif + const CharT* command = nullptr; + CharT modified = CharT{}; + for (; *fmt; ++fmt) + { + switch (*fmt) + { + case 'a': + case 'A': + if (command) + { + if (modified == CharT{}) + { + tm.tm_wday = static_cast(extract_weekday(os, fds)); + if (os.fail()) + return os; +#if !ONLY_C_LOCALE + const CharT f[] = {'%', *fmt}; + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); +#else // ONLY_C_LOCALE + os << weekday_names().first[tm.tm_wday+7*(*fmt == 'a')]; +#endif // ONLY_C_LOCALE + } + else + { + os << CharT{'%'} << modified << *fmt; + modified = CharT{}; + } + command = nullptr; + } + else + os << *fmt; + break; + case 'b': + case 'B': + case 'h': + if (command) + { + if (modified == CharT{}) + { + tm.tm_mon = static_cast(extract_month(os, fds)) - 1; +#if !ONLY_C_LOCALE + const CharT f[] = {'%', *fmt}; + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); +#else // ONLY_C_LOCALE + os << month_names().first[tm.tm_mon+12*(*fmt != 'B')]; +#endif // ONLY_C_LOCALE + } + else + { + os << CharT{'%'} << modified << *fmt; + modified = CharT{}; + } + command = nullptr; + } + else + os << *fmt; + break; + case 'c': + case 'x': + if (command) + { + if (modified == CharT{'O'}) + os << CharT{'%'} << modified << *fmt; + else + { + if (!fds.ymd.ok()) + os.setstate(std::ios::failbit); + if (*fmt == 'c' && !fds.has_tod) + os.setstate(std::ios::failbit); +#if !ONLY_C_LOCALE + tm = std::tm{}; + auto const& ymd = fds.ymd; + auto ld = local_days(ymd); + if (*fmt == 'c') + { + tm.tm_sec = static_cast(fds.tod.seconds().count()); + tm.tm_min = static_cast(fds.tod.minutes().count()); + tm.tm_hour = static_cast(fds.tod.hours().count()); + } + tm.tm_mday = static_cast(static_cast(ymd.day())); + tm.tm_mon = static_cast(extract_month(os, fds) - 1); + tm.tm_year = static_cast(ymd.year()) - 1900; + tm.tm_wday = static_cast(extract_weekday(os, fds)); + if (os.fail()) + return os; + tm.tm_yday = static_cast((ld - local_days(ymd.year()/1/1)).count()); + CharT f[3] = {'%'}; + auto fe = std::begin(f) + 1; + if (modified == CharT{'E'}) + *fe++ = modified; + *fe++ = *fmt; + facet.put(os, os, os.fill(), &tm, std::begin(f), fe); +#else // ONLY_C_LOCALE + if (*fmt == 'c') + { + auto wd = static_cast(extract_weekday(os, fds)); + os << weekday_names().first[static_cast(wd)+7] + << ' '; + os << month_names().first[extract_month(os, fds)-1+12] << ' '; + auto d = static_cast(static_cast(fds.ymd.day())); + if (d < 10) + os << ' '; + os << d << ' ' + << make_time(duration_cast(fds.tod.to_duration())) + << ' ' << fds.ymd.year(); + + } + else // *fmt == 'x' + { + auto const& ymd = fds.ymd; + save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os.width(2); + os << static_cast(ymd.month()) << CharT{'/'}; + os.width(2); + os << static_cast(ymd.day()) << CharT{'/'}; + os.width(2); + os << static_cast(ymd.year()) % 100; + } +#endif // ONLY_C_LOCALE + } + command = nullptr; + modified = CharT{}; + } + else + os << *fmt; + break; + case 'C': + if (command) + { + if (modified == CharT{'O'}) + os << CharT{'%'} << modified << *fmt; + else + { + if (!fds.ymd.year().ok()) + os.setstate(std::ios::failbit); + auto y = static_cast(fds.ymd.year()); +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#endif + { + save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + if (y >= 0) + { + os.width(2); + os << y/100; + } + else + { + os << CharT{'-'}; + os.width(2); + os << -(y-99)/100; + } + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'E'}) + { + tm.tm_year = y - 1900; + CharT f[3] = {'%', 'E', 'C'}; + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); + } +#endif + } + command = nullptr; + modified = CharT{}; + } + else + os << *fmt; + break; + case 'd': + case 'e': + if (command) + { + if (modified == CharT{'E'}) + os << CharT{'%'} << modified << *fmt; + else + { + if (!fds.ymd.day().ok()) + os.setstate(std::ios::failbit); + auto d = static_cast(static_cast(fds.ymd.day())); +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#endif + { + save_ostream _(os); + if (*fmt == CharT{'d'}) + os.fill('0'); + else + os.fill(' '); + os.flags(std::ios::dec | std::ios::right); + os.width(2); + os << d; + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + tm.tm_mday = d; + CharT f[3] = {'%', 'O', *fmt}; + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); + } +#endif + } + command = nullptr; + modified = CharT{}; + } + else + os << *fmt; + break; + case 'D': + if (command) + { + if (modified == CharT{}) + { + if (!fds.ymd.ok()) + os.setstate(std::ios::failbit); + auto const& ymd = fds.ymd; + save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os.width(2); + os << static_cast(ymd.month()) << CharT{'/'}; + os.width(2); + os << static_cast(ymd.day()) << CharT{'/'}; + os.width(2); + os << static_cast(ymd.year()) % 100; + } + else + { + os << CharT{'%'} << modified << *fmt; + modified = CharT{}; + } + command = nullptr; + } + else + os << *fmt; + break; + case 'F': + if (command) + { + if (modified == CharT{}) + { + if (!fds.ymd.ok()) + os.setstate(std::ios::failbit); + auto const& ymd = fds.ymd; + save_ostream _(os); + os.imbue(std::locale::classic()); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os.width(4); + os << static_cast(ymd.year()) << CharT{'-'}; + os.width(2); + os << static_cast(ymd.month()) << CharT{'-'}; + os.width(2); + os << static_cast(ymd.day()); + } + else + { + os << CharT{'%'} << modified << *fmt; + modified = CharT{}; + } + command = nullptr; + } + else + os << *fmt; + break; + case 'g': + case 'G': + if (command) + { + if (modified == CharT{}) + { + if (!fds.ymd.ok()) + os.setstate(std::ios::failbit); + auto ld = local_days(fds.ymd); + auto y = year_month_day{ld + days{3}}.year(); + auto start = local_days((y-years{1})/December/Thursday[last]) + + (Monday-Thursday); + if (ld < start) + --y; + if (*fmt == CharT{'G'}) + os << y; + else + { + save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os.width(2); + os << std::abs(static_cast(y)) % 100; + } + } + else + { + os << CharT{'%'} << modified << *fmt; + modified = CharT{}; + } + command = nullptr; + } + else + os << *fmt; + break; + case 'H': + case 'I': + if (command) + { + if (modified == CharT{'E'}) + os << CharT{'%'} << modified << *fmt; + else + { + if (!fds.has_tod) + os.setstate(std::ios::failbit); + if (insert_negative) + { + os << '-'; + insert_negative = false; + } + auto hms = fds.tod; +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#endif + { + auto h = *fmt == CharT{'I'} ? date::make12(hms.hours()) : hms.hours(); + if (h < hours{10}) + os << CharT{'0'}; + os << h.count(); + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + const CharT f[] = {'%', modified, *fmt}; + tm.tm_hour = static_cast(hms.hours().count()); + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); + } +#endif + } + modified = CharT{}; + command = nullptr; + } + else + os << *fmt; + break; + case 'j': + if (command) + { + if (modified == CharT{}) + { + if (fds.ymd.ok() || fds.has_tod) + { + days doy; + if (fds.ymd.ok()) + { + auto ld = local_days(fds.ymd); + auto y = fds.ymd.year(); + doy = ld - local_days(y/January/1) + days{1}; + } + else + { + doy = duration_cast(fds.tod.to_duration()); + } + save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os.width(3); + os << doy.count(); + } + else + { + os.setstate(std::ios::failbit); + } + } + else + { + os << CharT{'%'} << modified << *fmt; + modified = CharT{}; + } + command = nullptr; + } + else + os << *fmt; + break; + case 'm': + if (command) + { + if (modified == CharT{'E'}) + os << CharT{'%'} << modified << *fmt; + else + { + if (!fds.ymd.month().ok()) + os.setstate(std::ios::failbit); + auto m = static_cast(fds.ymd.month()); +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#endif + { + if (m < 10) + os << CharT{'0'}; + os << m; + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + const CharT f[] = {'%', modified, *fmt}; + tm.tm_mon = static_cast(m-1); + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); + } +#endif + } + modified = CharT{}; + command = nullptr; + } + else + os << *fmt; + break; + case 'M': + if (command) + { + if (modified == CharT{'E'}) + os << CharT{'%'} << modified << *fmt; + else + { + if (!fds.has_tod) + os.setstate(std::ios::failbit); + if (insert_negative) + { + os << '-'; + insert_negative = false; + } +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#endif + { + if (fds.tod.minutes() < minutes{10}) + os << CharT{'0'}; + os << fds.tod.minutes().count(); + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + const CharT f[] = {'%', modified, *fmt}; + tm.tm_min = static_cast(fds.tod.minutes().count()); + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); + } +#endif + } + modified = CharT{}; + command = nullptr; + } + else + os << *fmt; + break; + case 'n': + if (command) + { + if (modified == CharT{}) + os << CharT{'\n'}; + else + { + os << CharT{'%'} << modified << *fmt; + modified = CharT{}; + } + command = nullptr; + } + else + os << *fmt; + break; + case 'p': + if (command) + { + if (modified == CharT{}) + { + if (!fds.has_tod) + os.setstate(std::ios::failbit); +#if !ONLY_C_LOCALE + const CharT f[] = {'%', *fmt}; + tm.tm_hour = static_cast(fds.tod.hours().count()); + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); +#else + if (date::is_am(fds.tod.hours())) + os << ampm_names().first[0]; + else + os << ampm_names().first[1]; +#endif + } + else + { + os << CharT{'%'} << modified << *fmt; + } + modified = CharT{}; + command = nullptr; + } + else + os << *fmt; + break; + case 'Q': + case 'q': + if (command) + { + if (modified == CharT{}) + { + if (!fds.has_tod) + os.setstate(std::ios::failbit); + auto d = fds.tod.to_duration(); + if (*fmt == 'q') + os << get_units(typename decltype(d)::period::type{}); + else + os << d.count(); + } + else + { + os << CharT{'%'} << modified << *fmt; + } + modified = CharT{}; + command = nullptr; + } + else + os << *fmt; + break; + case 'r': + if (command) + { + if (modified == CharT{}) + { + if (!fds.has_tod) + os.setstate(std::ios::failbit); +#if !ONLY_C_LOCALE + const CharT f[] = {'%', *fmt}; + tm.tm_hour = static_cast(fds.tod.hours().count()); + tm.tm_min = static_cast(fds.tod.minutes().count()); + tm.tm_sec = static_cast(fds.tod.seconds().count()); + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); +#else + hh_mm_ss tod(duration_cast(fds.tod.to_duration())); + save_ostream _(os); + os.fill('0'); + os.width(2); + os << date::make12(tod.hours()).count() << CharT{':'}; + os.width(2); + os << tod.minutes().count() << CharT{':'}; + os.width(2); + os << tod.seconds().count() << CharT{' '}; + if (date::is_am(tod.hours())) + os << ampm_names().first[0]; + else + os << ampm_names().first[1]; +#endif + } + else + { + os << CharT{'%'} << modified << *fmt; + } + modified = CharT{}; + command = nullptr; + } + else + os << *fmt; + break; + case 'R': + if (command) + { + if (modified == CharT{}) + { + if (!fds.has_tod) + os.setstate(std::ios::failbit); + if (fds.tod.hours() < hours{10}) + os << CharT{'0'}; + os << fds.tod.hours().count() << CharT{':'}; + if (fds.tod.minutes() < minutes{10}) + os << CharT{'0'}; + os << fds.tod.minutes().count(); + } + else + { + os << CharT{'%'} << modified << *fmt; + modified = CharT{}; + } + command = nullptr; + } + else + os << *fmt; + break; + case 'S': + if (command) + { + if (modified == CharT{'E'}) + os << CharT{'%'} << modified << *fmt; + else + { + if (!fds.has_tod) + os.setstate(std::ios::failbit); + if (insert_negative) + { + os << '-'; + insert_negative = false; + } +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#endif + { + os << fds.tod.s_; + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + const CharT f[] = {'%', modified, *fmt}; + tm.tm_sec = static_cast(fds.tod.s_.seconds().count()); + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); + } +#endif + } + modified = CharT{}; + command = nullptr; + } + else + os << *fmt; + break; + case 't': + if (command) + { + if (modified == CharT{}) + os << CharT{'\t'}; + else + { + os << CharT{'%'} << modified << *fmt; + modified = CharT{}; + } + command = nullptr; + } + else + os << *fmt; + break; + case 'T': + if (command) + { + if (modified == CharT{}) + { + if (!fds.has_tod) + os.setstate(std::ios::failbit); + os << fds.tod; + } + else + { + os << CharT{'%'} << modified << *fmt; + modified = CharT{}; + } + command = nullptr; + } + else + os << *fmt; + break; + case 'u': + if (command) + { + if (modified == CharT{'E'}) + os << CharT{'%'} << modified << *fmt; + else + { + auto wd = extract_weekday(os, fds); +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#endif + { + os << (wd != 0 ? wd : 7u); + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + const CharT f[] = {'%', modified, *fmt}; + tm.tm_wday = static_cast(wd); + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); + } +#endif + } + modified = CharT{}; + command = nullptr; + } + else + os << *fmt; + break; + case 'U': + if (command) + { + if (modified == CharT{'E'}) + os << CharT{'%'} << modified << *fmt; + else + { + auto const& ymd = fds.ymd; + if (!ymd.ok()) + os.setstate(std::ios::failbit); + auto ld = local_days(ymd); +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#endif + { + auto st = local_days(Sunday[1]/January/ymd.year()); + if (ld < st) + os << CharT{'0'} << CharT{'0'}; + else + { + auto wn = duration_cast(ld - st).count() + 1; + if (wn < 10) + os << CharT{'0'}; + os << wn; + } + } + #if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + const CharT f[] = {'%', modified, *fmt}; + tm.tm_year = static_cast(ymd.year()) - 1900; + tm.tm_wday = static_cast(extract_weekday(os, fds)); + if (os.fail()) + return os; + tm.tm_yday = static_cast((ld - local_days(ymd.year()/1/1)).count()); + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); + } +#endif + } + modified = CharT{}; + command = nullptr; + } + else + os << *fmt; + break; + case 'V': + if (command) + { + if (modified == CharT{'E'}) + os << CharT{'%'} << modified << *fmt; + else + { + if (!fds.ymd.ok()) + os.setstate(std::ios::failbit); + auto ld = local_days(fds.ymd); +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#endif + { + auto y = year_month_day{ld + days{3}}.year(); + auto st = local_days((y-years{1})/12/Thursday[last]) + + (Monday-Thursday); + if (ld < st) + { + --y; + st = local_days((y - years{1})/12/Thursday[last]) + + (Monday-Thursday); + } + auto wn = duration_cast(ld - st).count() + 1; + if (wn < 10) + os << CharT{'0'}; + os << wn; + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + const CharT f[] = {'%', modified, *fmt}; + auto const& ymd = fds.ymd; + tm.tm_year = static_cast(ymd.year()) - 1900; + tm.tm_wday = static_cast(extract_weekday(os, fds)); + if (os.fail()) + return os; + tm.tm_yday = static_cast((ld - local_days(ymd.year()/1/1)).count()); + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); + } +#endif + } + modified = CharT{}; + command = nullptr; + } + else + os << *fmt; + break; + case 'w': + if (command) + { + auto wd = extract_weekday(os, fds); + if (os.fail()) + return os; +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#else + if (modified != CharT{'E'}) +#endif + { + os << wd; + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + const CharT f[] = {'%', modified, *fmt}; + tm.tm_wday = static_cast(wd); + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); + } +#endif + else + { + os << CharT{'%'} << modified << *fmt; + } + modified = CharT{}; + command = nullptr; + } + else + os << *fmt; + break; + case 'W': + if (command) + { + if (modified == CharT{'E'}) + os << CharT{'%'} << modified << *fmt; + else + { + auto const& ymd = fds.ymd; + if (!ymd.ok()) + os.setstate(std::ios::failbit); + auto ld = local_days(ymd); +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#endif + { + auto st = local_days(Monday[1]/January/ymd.year()); + if (ld < st) + os << CharT{'0'} << CharT{'0'}; + else + { + auto wn = duration_cast(ld - st).count() + 1; + if (wn < 10) + os << CharT{'0'}; + os << wn; + } + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + const CharT f[] = {'%', modified, *fmt}; + tm.tm_year = static_cast(ymd.year()) - 1900; + tm.tm_wday = static_cast(extract_weekday(os, fds)); + if (os.fail()) + return os; + tm.tm_yday = static_cast((ld - local_days(ymd.year()/1/1)).count()); + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); + } +#endif + } + modified = CharT{}; + command = nullptr; + } + else + os << *fmt; + break; + case 'X': + if (command) + { + if (modified == CharT{'O'}) + os << CharT{'%'} << modified << *fmt; + else + { + if (!fds.has_tod) + os.setstate(std::ios::failbit); +#if !ONLY_C_LOCALE + tm = std::tm{}; + tm.tm_sec = static_cast(fds.tod.seconds().count()); + tm.tm_min = static_cast(fds.tod.minutes().count()); + tm.tm_hour = static_cast(fds.tod.hours().count()); + CharT f[3] = {'%'}; + auto fe = std::begin(f) + 1; + if (modified == CharT{'E'}) + *fe++ = modified; + *fe++ = *fmt; + facet.put(os, os, os.fill(), &tm, std::begin(f), fe); +#else + os << fds.tod; +#endif + } + command = nullptr; + modified = CharT{}; + } + else + os << *fmt; + break; + case 'y': + if (command) + { + if (!fds.ymd.year().ok()) + os.setstate(std::ios::failbit); + auto y = static_cast(fds.ymd.year()); +#if !ONLY_C_LOCALE + if (modified == CharT{}) + { +#endif + y = std::abs(y) % 100; + if (y < 10) + os << CharT{'0'}; + os << y; +#if !ONLY_C_LOCALE + } + else + { + const CharT f[] = {'%', modified, *fmt}; + tm.tm_year = y - 1900; + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); + } +#endif + modified = CharT{}; + command = nullptr; + } + else + os << *fmt; + break; + case 'Y': + if (command) + { + if (modified == CharT{'O'}) + os << CharT{'%'} << modified << *fmt; + else + { + if (!fds.ymd.year().ok()) + os.setstate(std::ios::failbit); + auto y = fds.ymd.year(); +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#endif + { + save_ostream _(os); + os.imbue(std::locale::classic()); + os << y; + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'E'}) + { + const CharT f[] = {'%', modified, *fmt}; + tm.tm_year = static_cast(y) - 1900; + facet.put(os, os, os.fill(), &tm, std::begin(f), std::end(f)); + } +#endif + } + modified = CharT{}; + command = nullptr; + } + else + os << *fmt; + break; + case 'z': + if (command) + { + if (offset_sec == nullptr) + { + // Can not format %z with unknown offset + os.setstate(ios::failbit); + return os; + } + auto m = duration_cast(*offset_sec); + auto neg = m < minutes{0}; + m = date::abs(m); + auto h = duration_cast(m); + m -= h; + if (neg) + os << CharT{'-'}; + else + os << CharT{'+'}; + if (h < hours{10}) + os << CharT{'0'}; + os << h.count(); + if (modified != CharT{}) + os << CharT{':'}; + if (m < minutes{10}) + os << CharT{'0'}; + os << m.count(); + command = nullptr; + modified = CharT{}; + } + else + os << *fmt; + break; + case 'Z': + if (command) + { + if (modified == CharT{}) + { + if (abbrev == nullptr) + { + // Can not format %Z with unknown time_zone + os.setstate(ios::failbit); + return os; + } + for (auto c : *abbrev) + os << CharT(c); + } + else + { + os << CharT{'%'} << modified << *fmt; + modified = CharT{}; + } + command = nullptr; + } + else + os << *fmt; + break; + case 'E': + case 'O': + if (command) + { + if (modified == CharT{}) + { + modified = *fmt; + } + else + { + os << CharT{'%'} << modified << *fmt; + command = nullptr; + modified = CharT{}; + } + } + else + os << *fmt; + break; + case '%': + if (command) + { + if (modified == CharT{}) + { + os << CharT{'%'}; + command = nullptr; + } + else + { + os << CharT{'%'} << modified << CharT{'%'}; + command = nullptr; + modified = CharT{}; + } + } + else + command = fmt; + break; + default: + if (command) + { + os << CharT{'%'}; + command = nullptr; + } + if (modified != CharT{}) + { + os << modified; + modified = CharT{}; + } + os << *fmt; + break; + } + } + if (command) + os << CharT{'%'}; + if (modified != CharT{}) + os << modified; + return os; +} + +template +inline +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, const year& y) +{ + using CT = std::chrono::seconds; + fields fds{y/0/0}; + return to_stream(os, fmt, fds); +} + +template +inline +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, const month& m) +{ + using CT = std::chrono::seconds; + fields fds{m/0/nanyear}; + return to_stream(os, fmt, fds); +} + +template +inline +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, const day& d) +{ + using CT = std::chrono::seconds; + fields fds{d/0/nanyear}; + return to_stream(os, fmt, fds); +} + +template +inline +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, const weekday& wd) +{ + using CT = std::chrono::seconds; + fields fds{wd}; + return to_stream(os, fmt, fds); +} + +template +inline +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, const year_month& ym) +{ + using CT = std::chrono::seconds; + fields fds{ym/0}; + return to_stream(os, fmt, fds); +} + +template +inline +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, const month_day& md) +{ + using CT = std::chrono::seconds; + fields fds{md/nanyear}; + return to_stream(os, fmt, fds); +} + +template +inline +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, + const year_month_day& ymd) +{ + using CT = std::chrono::seconds; + fields fds{ymd}; + return to_stream(os, fmt, fds); +} + +template +inline +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, + const std::chrono::duration& d) +{ + using Duration = std::chrono::duration; + using CT = typename std::common_type::type; + fields fds{hh_mm_ss{d}}; + return to_stream(os, fmt, fds); +} + +template +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, + const local_time& tp, const std::string* abbrev = nullptr, + const std::chrono::seconds* offset_sec = nullptr) +{ + using CT = typename std::common_type::type; + auto ld = std::chrono::time_point_cast(tp); + fields fds; + if (ld <= tp) + fds = fields{year_month_day{ld}, hh_mm_ss{tp-local_seconds{ld}}}; + else + fds = fields{year_month_day{ld - days{1}}, + hh_mm_ss{days{1} - (local_seconds{ld} - tp)}}; + return to_stream(os, fmt, fds, abbrev, offset_sec); +} + +template +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, + const sys_time& tp) +{ + using std::chrono::seconds; + using CT = typename std::common_type::type; + const std::string abbrev("UTC"); + CONSTDATA seconds offset{0}; + auto sd = std::chrono::time_point_cast(tp); + fields fds; + if (sd <= tp) + fds = fields{year_month_day{sd}, hh_mm_ss{tp-sys_seconds{sd}}}; + else + fds = fields{year_month_day{sd - days{1}}, + hh_mm_ss{days{1} - (sys_seconds{sd} - tp)}}; + return to_stream(os, fmt, fds, &abbrev, &offset); +} + +// format + +template +auto +format(const std::locale& loc, const CharT* fmt, const Streamable& tp) + -> decltype(to_stream(std::declval&>(), fmt, tp), + std::basic_string{}) +{ + std::basic_ostringstream os; + os.exceptions(std::ios::failbit | std::ios::badbit); + os.imbue(loc); + to_stream(os, fmt, tp); + return os.str(); +} + +template +auto +format(const CharT* fmt, const Streamable& tp) + -> decltype(to_stream(std::declval&>(), fmt, tp), + std::basic_string{}) +{ + std::basic_ostringstream os; + os.exceptions(std::ios::failbit | std::ios::badbit); + to_stream(os, fmt, tp); + return os.str(); +} + +template +auto +format(const std::locale& loc, const std::basic_string& fmt, + const Streamable& tp) + -> decltype(to_stream(std::declval&>(), fmt.c_str(), tp), + std::basic_string{}) +{ + std::basic_ostringstream os; + os.exceptions(std::ios::failbit | std::ios::badbit); + os.imbue(loc); + to_stream(os, fmt.c_str(), tp); + return os.str(); +} + +template +auto +format(const std::basic_string& fmt, const Streamable& tp) + -> decltype(to_stream(std::declval&>(), fmt.c_str(), tp), + std::basic_string{}) +{ + std::basic_ostringstream os; + os.exceptions(std::ios::failbit | std::ios::badbit); + to_stream(os, fmt.c_str(), tp); + return os.str(); +} + +// parse + +namespace detail +{ + +template +bool +read_char(std::basic_istream& is, CharT fmt, std::ios::iostate& err) +{ + auto ic = is.get(); + if (Traits::eq_int_type(ic, Traits::eof()) || + !Traits::eq(Traits::to_char_type(ic), fmt)) + { + err |= std::ios::failbit; + is.setstate(std::ios::failbit); + return false; + } + return true; +} + +template +unsigned +read_unsigned(std::basic_istream& is, unsigned m = 1, unsigned M = 10) +{ + unsigned x = 0; + unsigned count = 0; + while (true) + { + auto ic = is.peek(); + if (Traits::eq_int_type(ic, Traits::eof())) + break; + auto c = static_cast(Traits::to_char_type(ic)); + if (!('0' <= c && c <= '9')) + break; + (void)is.get(); + ++count; + x = 10*x + static_cast(c - '0'); + if (count == M) + break; + } + if (count < m) + is.setstate(std::ios::failbit); + return x; +} + +template +int +read_signed(std::basic_istream& is, unsigned m = 1, unsigned M = 10) +{ + auto ic = is.peek(); + if (!Traits::eq_int_type(ic, Traits::eof())) + { + auto c = static_cast(Traits::to_char_type(ic)); + if (('0' <= c && c <= '9') || c == '-' || c == '+') + { + if (c == '-' || c == '+') + { + (void)is.get(); + --M; + } + auto x = static_cast(read_unsigned(is, std::max(m, 1u), M)); + if (!is.fail()) + { + if (c == '-') + x = -x; + return x; + } + } + } + if (m > 0) + is.setstate(std::ios::failbit); + return 0; +} + +template +long double +read_long_double(std::basic_istream& is, unsigned m = 1, unsigned M = 10) +{ + unsigned count = 0; + unsigned fcount = 0; + unsigned long long i = 0; + unsigned long long f = 0; + bool parsing_fraction = false; +#if ONLY_C_LOCALE + typename Traits::int_type decimal_point = '.'; +#else + auto decimal_point = Traits::to_int_type( + std::use_facet>(is.getloc()).decimal_point()); +#endif + while (true) + { + auto ic = is.peek(); + if (Traits::eq_int_type(ic, Traits::eof())) + break; + if (Traits::eq_int_type(ic, decimal_point)) + { + decimal_point = Traits::eof(); + parsing_fraction = true; + } + else + { + auto c = static_cast(Traits::to_char_type(ic)); + if (!('0' <= c && c <= '9')) + break; + if (!parsing_fraction) + { + i = 10*i + static_cast(c - '0'); + } + else + { + f = 10*f + static_cast(c - '0'); + ++fcount; + } + } + (void)is.get(); + if (++count == M) + break; + } + if (count < m) + { + is.setstate(std::ios::failbit); + return 0; + } + return static_cast(i) + static_cast(f)/std::pow(10.L, fcount); +} + +struct rs +{ + int& i; + unsigned m; + unsigned M; +}; + +struct ru +{ + int& i; + unsigned m; + unsigned M; +}; + +struct rld +{ + long double& i; + unsigned m; + unsigned M; +}; + +template +void +read(std::basic_istream&) +{ +} + +template +void +read(std::basic_istream& is, CharT a0, Args&& ...args); + +template +void +read(std::basic_istream& is, rs a0, Args&& ...args); + +template +void +read(std::basic_istream& is, ru a0, Args&& ...args); + +template +void +read(std::basic_istream& is, int a0, Args&& ...args); + +template +void +read(std::basic_istream& is, rld a0, Args&& ...args); + +template +void +read(std::basic_istream& is, CharT a0, Args&& ...args) +{ + // No-op if a0 == CharT{} + if (a0 != CharT{}) + { + auto ic = is.peek(); + if (Traits::eq_int_type(ic, Traits::eof())) + { + is.setstate(std::ios::failbit | std::ios::eofbit); + return; + } + if (!Traits::eq(Traits::to_char_type(ic), a0)) + { + is.setstate(std::ios::failbit); + return; + } + (void)is.get(); + } + read(is, std::forward(args)...); +} + +template +void +read(std::basic_istream& is, rs a0, Args&& ...args) +{ + auto x = read_signed(is, a0.m, a0.M); + if (is.fail()) + return; + a0.i = x; + read(is, std::forward(args)...); +} + +template +void +read(std::basic_istream& is, ru a0, Args&& ...args) +{ + auto x = read_unsigned(is, a0.m, a0.M); + if (is.fail()) + return; + a0.i = static_cast(x); + read(is, std::forward(args)...); +} + +template +void +read(std::basic_istream& is, int a0, Args&& ...args) +{ + if (a0 != -1) + { + auto u = static_cast(a0); + CharT buf[std::numeric_limits::digits10+2u] = {}; + auto e = buf; + do + { + *e++ = static_cast(CharT(u % 10) + CharT{'0'}); + u /= 10; + } while (u > 0); +#if defined(__GNUC__) && __GNUC__ >= 11 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow" +#endif + std::reverse(buf, e); +#if defined(__GNUC__) && __GNUC__ >= 11 +#pragma GCC diagnostic pop +#endif + for (auto p = buf; p != e && is.rdstate() == std::ios::goodbit; ++p) + read(is, *p); + } + if (is.rdstate() == std::ios::goodbit) + read(is, std::forward(args)...); +} + +template +void +read(std::basic_istream& is, rld a0, Args&& ...args) +{ + auto x = read_long_double(is, a0.m, a0.M); + if (is.fail()) + return; + a0.i = x; + read(is, std::forward(args)...); +} + +template +inline +void +checked_set(T& value, T from, T not_a_value, std::basic_ios& is) +{ + if (!is.fail()) + { + if (value == not_a_value) + value = std::move(from); + else if (value != from) + is.setstate(std::ios::failbit); + } +} + +} // namespace detail; + +template > +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, + fields& fds, std::basic_string* abbrev, + std::chrono::minutes* offset) +{ + using std::numeric_limits; + using std::ios; + using std::chrono::duration; + using std::chrono::duration_cast; + using std::chrono::seconds; + using std::chrono::minutes; + using std::chrono::hours; + using detail::round_i; + typename std::basic_istream::sentry ok{is, true}; + if (ok) + { + date::detail::save_istream ss(is); + is.fill(' '); + is.flags(std::ios::skipws | std::ios::dec); + is.width(0); +#if !ONLY_C_LOCALE + auto& f = std::use_facet>(is.getloc()); + std::tm tm{}; +#endif + const CharT* command = nullptr; + auto modified = CharT{}; + auto width = -1; + + CONSTDATA int not_a_year = numeric_limits::min(); + CONSTDATA int not_a_2digit_year = 100; + CONSTDATA int not_a_century = numeric_limits::min(); + CONSTDATA int not_a_month = 0; + CONSTDATA int not_a_day = 0; + CONSTDATA int not_a_hour = numeric_limits::min(); + CONSTDATA int not_a_hour_12_value = 0; + CONSTDATA int not_a_minute = not_a_hour; + CONSTDATA Duration not_a_second = Duration::min(); + CONSTDATA int not_a_doy = -1; + CONSTDATA int not_a_weekday = 8; + CONSTDATA int not_a_week_num = 100; + CONSTDATA int not_a_ampm = -1; + CONSTDATA minutes not_a_offset = minutes::min(); + + int Y = not_a_year; // c, F, Y * + int y = not_a_2digit_year; // D, x, y * + int g = not_a_2digit_year; // g * + int G = not_a_year; // G * + int C = not_a_century; // C * + int m = not_a_month; // b, B, h, m, c, D, F, x * + int d = not_a_day; // c, d, D, e, F, x * + int j = not_a_doy; // j * + int wd = not_a_weekday; // a, A, u, w * + int H = not_a_hour; // c, H, R, T, X * + int I = not_a_hour_12_value; // I, r * + int p = not_a_ampm; // p, r * + int M = not_a_minute; // c, M, r, R, T, X * + Duration s = not_a_second; // c, r, S, T, X * + int U = not_a_week_num; // U * + int V = not_a_week_num; // V * + int W = not_a_week_num; // W * + std::basic_string temp_abbrev; // Z * + minutes temp_offset = not_a_offset; // z * + + using detail::read; + using detail::rs; + using detail::ru; + using detail::rld; + using detail::checked_set; + for (; *fmt != CharT{} && !is.fail(); ++fmt) + { + switch (*fmt) + { + case 'a': + case 'A': + case 'u': + case 'w': // wd: a, A, u, w + if (command) + { + int trial_wd = not_a_weekday; + if (*fmt == 'a' || *fmt == 'A') + { + if (modified == CharT{}) + { +#if !ONLY_C_LOCALE + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + is.setstate(err); + if (!is.fail()) + trial_wd = tm.tm_wday; +#else + auto nm = detail::weekday_names(); + auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first; + if (!is.fail()) + trial_wd = i % 7; +#endif + } + else + read(is, CharT{'%'}, width, modified, *fmt); + } + else // *fmt == 'u' || *fmt == 'w' + { +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#else + if (modified != CharT{'E'}) +#endif + { + read(is, ru{trial_wd, 1, width == -1 ? + 1u : static_cast(width)}); + if (!is.fail()) + { + if (*fmt == 'u') + { + if (!(1 <= trial_wd && trial_wd <= 7)) + { + trial_wd = not_a_weekday; + is.setstate(ios::failbit); + } + else if (trial_wd == 7) + trial_wd = 0; + } + else // *fmt == 'w' + { + if (!(0 <= trial_wd && trial_wd <= 6)) + { + trial_wd = not_a_weekday; + is.setstate(ios::failbit); + } + } + } + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + is.setstate(err); + if (!is.fail()) + trial_wd = tm.tm_wday; + } +#endif + else + read(is, CharT{'%'}, width, modified, *fmt); + } + if (trial_wd != not_a_weekday) + checked_set(wd, trial_wd, not_a_weekday, is); + } + else // !command + read(is, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + break; + case 'b': + case 'B': + case 'h': + if (command) + { + if (modified == CharT{}) + { + int ttm = not_a_month; +#if !ONLY_C_LOCALE + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + if ((err & ios::failbit) == 0) + ttm = tm.tm_mon + 1; + is.setstate(err); +#else + auto nm = detail::month_names(); + auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first; + if (!is.fail()) + ttm = i % 12 + 1; +#endif + checked_set(m, ttm, not_a_month, is); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'c': + if (command) + { + if (modified != CharT{'O'}) + { +#if !ONLY_C_LOCALE + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + if ((err & ios::failbit) == 0) + { + checked_set(Y, tm.tm_year + 1900, not_a_year, is); + checked_set(m, tm.tm_mon + 1, not_a_month, is); + checked_set(d, tm.tm_mday, not_a_day, is); + checked_set(H, tm.tm_hour, not_a_hour, is); + checked_set(M, tm.tm_min, not_a_minute, is); + checked_set(s, duration_cast(seconds{tm.tm_sec}), + not_a_second, is); + } + is.setstate(err); +#else + // "%a %b %e %T %Y" + auto nm = detail::weekday_names(); + auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first; + checked_set(wd, static_cast(i % 7), not_a_weekday, is); + ws(is); + nm = detail::month_names(); + i = detail::scan_keyword(is, nm.first, nm.second) - nm.first; + checked_set(m, static_cast(i % 12 + 1), not_a_month, is); + ws(is); + int td = not_a_day; + read(is, ru{td, 1, 2}); + checked_set(d, td, not_a_day, is); + ws(is); + using dfs = detail::decimal_format_seconds; + CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width; + int tH; + int tM; + long double S{}; + read(is, ru{tH, 1, 2}, CharT{':'}, ru{tM, 1, 2}, + CharT{':'}, rld{S, 1, w}); + checked_set(H, tH, not_a_hour, is); + checked_set(M, tM, not_a_minute, is); + checked_set(s, round_i(duration{S}), + not_a_second, is); + ws(is); + int tY = not_a_year; + // No need for `rs` here, negative years can't parse + // with "%c" since `width` is hardcoded to 4 + read(is, ru{tY, 1, 4u}); + checked_set(Y, tY, not_a_year, is); +#endif + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'x': + if (command) + { + if (modified != CharT{'O'}) + { +#if !ONLY_C_LOCALE + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + if ((err & ios::failbit) == 0) + { + checked_set(Y, tm.tm_year + 1900, not_a_year, is); + checked_set(m, tm.tm_mon + 1, not_a_month, is); + checked_set(d, tm.tm_mday, not_a_day, is); + } + is.setstate(err); +#else + // "%m/%d/%y" + int ty = not_a_2digit_year; + int tm = not_a_month; + int td = not_a_day; + read(is, ru{tm, 1, 2}, CharT{'/'}, ru{td, 1, 2}, CharT{'/'}, + ru{ty, 1, 2}); + checked_set(y, ty, not_a_2digit_year, is); + checked_set(m, tm, not_a_month, is); + checked_set(d, td, not_a_day, is); +#endif + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'X': + if (command) + { + if (modified != CharT{'O'}) + { +#if !ONLY_C_LOCALE + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + if ((err & ios::failbit) == 0) + { + checked_set(H, tm.tm_hour, not_a_hour, is); + checked_set(M, tm.tm_min, not_a_minute, is); + checked_set(s, duration_cast(seconds{tm.tm_sec}), + not_a_second, is); + } + is.setstate(err); +#else + // "%T" + using dfs = detail::decimal_format_seconds; + CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width; + int tH = not_a_hour; + int tM = not_a_minute; + long double S{}; + read(is, ru{tH, 1, 2}, CharT{':'}, ru{tM, 1, 2}, + CharT{':'}, rld{S, 1, w}); + checked_set(H, tH, not_a_hour, is); + checked_set(M, tM, not_a_minute, is); + checked_set(s, round_i(duration{S}), + not_a_second, is); +#endif + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'C': + if (command) + { + int tC = not_a_century; +#if !ONLY_C_LOCALE + if (modified == CharT{}) + { +#endif + read(is, rs{tC, 1, width == -1 ? 2u : static_cast(width)}); +#if !ONLY_C_LOCALE + } + else + { + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + if ((err & ios::failbit) == 0) + { + auto tY = tm.tm_year + 1900; + tC = (tY >= 0 ? tY : tY-99) / 100; + } + is.setstate(err); + } +#endif + checked_set(C, tC, not_a_century, is); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'D': + if (command) + { + if (modified == CharT{}) + { + int tn = not_a_month; + int td = not_a_day; + int ty = not_a_2digit_year; + read(is, ru{tn, 1, 2}, CharT{'\0'}, CharT{'/'}, CharT{'\0'}, + ru{td, 1, 2}, CharT{'\0'}, CharT{'/'}, CharT{'\0'}, + ru{ty, 1, 2}); + checked_set(y, ty, not_a_2digit_year, is); + checked_set(m, tn, not_a_month, is); + checked_set(d, td, not_a_day, is); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'F': + if (command) + { + if (modified == CharT{}) + { + int tY = not_a_year; + int tn = not_a_month; + int td = not_a_day; + read(is, rs{tY, 1, width == -1 ? 4u : static_cast(width)}, + CharT{'-'}, ru{tn, 1, 2}, CharT{'-'}, ru{td, 1, 2}); + checked_set(Y, tY, not_a_year, is); + checked_set(m, tn, not_a_month, is); + checked_set(d, td, not_a_day, is); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'd': + case 'e': + if (command) + { +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#else + if (modified != CharT{'E'}) +#endif + { + int td = not_a_day; + read(is, ru{td, 1, width == -1 ? 2u : static_cast(width)}); + checked_set(d, td, not_a_day, is); + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + command = nullptr; + width = -1; + modified = CharT{}; + if ((err & ios::failbit) == 0) + checked_set(d, tm.tm_mday, not_a_day, is); + is.setstate(err); + } +#endif + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'H': + if (command) + { +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#else + if (modified != CharT{'E'}) +#endif + { + int tH = not_a_hour; + read(is, ru{tH, 1, width == -1 ? 2u : static_cast(width)}); + checked_set(H, tH, not_a_hour, is); + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + if ((err & ios::failbit) == 0) + checked_set(H, tm.tm_hour, not_a_hour, is); + is.setstate(err); + } +#endif + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'I': + if (command) + { + if (modified == CharT{}) + { + int tI = not_a_hour_12_value; + // reads in an hour into I, but most be in [1, 12] + read(is, ru{tI, 1, width == -1 ? 2u : static_cast(width)}); + if (!(1 <= tI && tI <= 12)) + is.setstate(ios::failbit); + checked_set(I, tI, not_a_hour_12_value, is); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'j': + if (command) + { + if (modified == CharT{}) + { + int tj = not_a_doy; + read(is, ru{tj, 1, width == -1 ? 3u : static_cast(width)}); + checked_set(j, tj, not_a_doy, is); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'M': + if (command) + { +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#else + if (modified != CharT{'E'}) +#endif + { + int tM = not_a_minute; + read(is, ru{tM, 1, width == -1 ? 2u : static_cast(width)}); + checked_set(M, tM, not_a_minute, is); + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + if ((err & ios::failbit) == 0) + checked_set(M, tm.tm_min, not_a_minute, is); + is.setstate(err); + } +#endif + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'm': + if (command) + { +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#else + if (modified != CharT{'E'}) +#endif + { + int tn = not_a_month; + read(is, ru{tn, 1, width == -1 ? 2u : static_cast(width)}); + checked_set(m, tn, not_a_month, is); + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + if ((err & ios::failbit) == 0) + checked_set(m, tm.tm_mon + 1, not_a_month, is); + is.setstate(err); + } +#endif + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'n': + case 't': + if (command) + { + if (modified == CharT{}) + { + // %n matches a single white space character + // %t matches 0 or 1 white space characters + auto ic = is.peek(); + if (Traits::eq_int_type(ic, Traits::eof())) + { + ios::iostate err = ios::eofbit; + if (*fmt == 'n') + err |= ios::failbit; + is.setstate(err); + break; + } + if (isspace(ic)) + { + (void)is.get(); + } + else if (*fmt == 'n') + is.setstate(ios::failbit); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'p': + if (command) + { + if (modified == CharT{}) + { + int tp = not_a_ampm; +#if !ONLY_C_LOCALE + tm = std::tm{}; + tm.tm_isdst = -1; + tm.tm_hour = 1; + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + is.setstate(err); + if (tm.tm_hour == 1) + tp = 0; + else if (tm.tm_hour == 13) + tp = 1; + else + is.setstate(err); +#else + auto nm = detail::ampm_names(); + auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first; + tp = static_cast(i); +#endif + checked_set(p, tp, not_a_ampm, is); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + + break; + case 'r': + if (command) + { + if (modified == CharT{}) + { +#if !ONLY_C_LOCALE + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + if ((err & ios::failbit) == 0) + { + checked_set(H, tm.tm_hour, not_a_hour, is); + checked_set(M, tm.tm_min, not_a_hour, is); + checked_set(s, duration_cast(seconds{tm.tm_sec}), + not_a_second, is); + } + is.setstate(err); +#else + // "%I:%M:%S %p" + using dfs = detail::decimal_format_seconds; + CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width; + long double S{}; + int tI = not_a_hour_12_value; + int tM = not_a_minute; + read(is, ru{tI, 1, 2}, CharT{':'}, ru{tM, 1, 2}, + CharT{':'}, rld{S, 1, w}); + checked_set(I, tI, not_a_hour_12_value, is); + checked_set(M, tM, not_a_minute, is); + checked_set(s, round_i(duration{S}), + not_a_second, is); + ws(is); + auto nm = detail::ampm_names(); + auto i = detail::scan_keyword(is, nm.first, nm.second) - nm.first; + checked_set(p, static_cast(i), not_a_ampm, is); +#endif + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'R': + if (command) + { + if (modified == CharT{}) + { + int tH = not_a_hour; + int tM = not_a_minute; + read(is, ru{tH, 1, 2}, CharT{'\0'}, CharT{':'}, CharT{'\0'}, + ru{tM, 1, 2}, CharT{'\0'}); + checked_set(H, tH, not_a_hour, is); + checked_set(M, tM, not_a_minute, is); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'S': + if (command) + { + #if !ONLY_C_LOCALE + if (modified == CharT{}) +#else + if (modified != CharT{'E'}) +#endif + { + using dfs = detail::decimal_format_seconds; + CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width; + long double S{}; + read(is, rld{S, 1, width == -1 ? w : static_cast(width)}); + checked_set(s, round_i(duration{S}), + not_a_second, is); + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'O'}) + { + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + if ((err & ios::failbit) == 0) + checked_set(s, duration_cast(seconds{tm.tm_sec}), + not_a_second, is); + is.setstate(err); + } +#endif + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'T': + if (command) + { + if (modified == CharT{}) + { + using dfs = detail::decimal_format_seconds; + CONSTDATA auto w = Duration::period::den == 1 ? 2 : 3 + dfs::width; + int tH = not_a_hour; + int tM = not_a_minute; + long double S{}; + read(is, ru{tH, 1, 2}, CharT{':'}, ru{tM, 1, 2}, + CharT{':'}, rld{S, 1, w}); + checked_set(H, tH, not_a_hour, is); + checked_set(M, tM, not_a_minute, is); + checked_set(s, round_i(duration{S}), + not_a_second, is); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'Y': + if (command) + { +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#else + if (modified != CharT{'O'}) +#endif + { + int tY = not_a_year; + read(is, rs{tY, 1, width == -1 ? 4u : static_cast(width)}); + checked_set(Y, tY, not_a_year, is); + } +#if !ONLY_C_LOCALE + else if (modified == CharT{'E'}) + { + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + if ((err & ios::failbit) == 0) + checked_set(Y, tm.tm_year + 1900, not_a_year, is); + is.setstate(err); + } +#endif + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'y': + if (command) + { +#if !ONLY_C_LOCALE + if (modified == CharT{}) +#endif + { + int ty = not_a_2digit_year; + read(is, ru{ty, 1, width == -1 ? 2u : static_cast(width)}); + checked_set(y, ty, not_a_2digit_year, is); + } +#if !ONLY_C_LOCALE + else + { + ios::iostate err = ios::goodbit; + f.get(is, nullptr, is, err, &tm, command, fmt+1); + if ((err & ios::failbit) == 0) + checked_set(Y, tm.tm_year + 1900, not_a_year, is); + is.setstate(err); + } +#endif + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'g': + if (command) + { + if (modified == CharT{}) + { + int tg = not_a_2digit_year; + read(is, ru{tg, 1, width == -1 ? 2u : static_cast(width)}); + checked_set(g, tg, not_a_2digit_year, is); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'G': + if (command) + { + if (modified == CharT{}) + { + int tG = not_a_year; + read(is, rs{tG, 1, width == -1 ? 4u : static_cast(width)}); + checked_set(G, tG, not_a_year, is); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'U': + if (command) + { + if (modified == CharT{}) + { + int tU = not_a_week_num; + read(is, ru{tU, 1, width == -1 ? 2u : static_cast(width)}); + checked_set(U, tU, not_a_week_num, is); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'V': + if (command) + { + if (modified == CharT{}) + { + int tV = not_a_week_num; + read(is, ru{tV, 1, width == -1 ? 2u : static_cast(width)}); + checked_set(V, tV, not_a_week_num, is); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'W': + if (command) + { + if (modified == CharT{}) + { + int tW = not_a_week_num; + read(is, ru{tW, 1, width == -1 ? 2u : static_cast(width)}); + checked_set(W, tW, not_a_week_num, is); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'E': + case 'O': + if (command) + { + if (modified == CharT{}) + { + modified = *fmt; + } + else + { + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + } + else + read(is, *fmt); + break; + case '%': + if (command) + { + if (modified == CharT{}) + read(is, *fmt); + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + command = fmt; + break; + case 'z': + if (command) + { + int tH, tM; + minutes toff = not_a_offset; + bool neg = false; + auto ic = is.peek(); + if (!Traits::eq_int_type(ic, Traits::eof())) + { + auto c = static_cast(Traits::to_char_type(ic)); + if (c == '-') + { + neg = true; + (void)is.get(); + } + else if (c == '+') + (void)is.get(); + } + if (modified == CharT{}) + { + read(is, ru{tH, 2, 2}); + if (!is.fail()) + toff = hours{std::abs(tH)}; + if (is.good()) + { + ic = is.peek(); + if (!Traits::eq_int_type(ic, Traits::eof())) + { + auto c = static_cast(Traits::to_char_type(ic)); + if ('0' <= c && c <= '9') + { + read(is, ru{tM, 2, 2}); + if (!is.fail()) + toff += minutes{tM}; + } + } + } + } + else + { + read(is, ru{tH, 1, 2}); + if (!is.fail()) + toff = hours{std::abs(tH)}; + if (is.good()) + { + ic = is.peek(); + if (!Traits::eq_int_type(ic, Traits::eof())) + { + auto c = static_cast(Traits::to_char_type(ic)); + if (c == ':') + { + (void)is.get(); + read(is, ru{tM, 2, 2}); + if (!is.fail()) + toff += minutes{tM}; + } + } + } + } + if (neg && !is.fail()) + toff = -toff; + checked_set(temp_offset, toff, not_a_offset, is); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + case 'Z': + if (command) + { + if (modified == CharT{}) + { + std::basic_string buf; + while (is.rdstate() == std::ios::goodbit) + { + auto i = is.rdbuf()->sgetc(); + if (Traits::eq_int_type(i, Traits::eof())) + { + is.setstate(ios::eofbit); + break; + } + auto wc = Traits::to_char_type(i); + auto c = static_cast(wc); + // is c a valid time zone name or abbreviation character? + if (!(CharT{1} < wc && wc < CharT{127}) || !(isalnum(c) || + c == '_' || c == '/' || c == '-' || c == '+')) + break; + buf.push_back(c); + is.rdbuf()->sbumpc(); + } + if (buf.empty()) + is.setstate(ios::failbit); + checked_set(temp_abbrev, buf, {}, is); + } + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + else + read(is, *fmt); + break; + default: + if (command) + { + if (width == -1 && modified == CharT{} && '0' <= *fmt && *fmt <= '9') + { + width = static_cast(*fmt) - '0'; + while ('0' <= fmt[1] && fmt[1] <= '9') + width = 10*width + static_cast(*++fmt) - '0'; + } + else + { + if (modified == CharT{}) + read(is, CharT{'%'}, width, *fmt); + else + read(is, CharT{'%'}, width, modified, *fmt); + command = nullptr; + width = -1; + modified = CharT{}; + } + } + else // !command + { + if (isspace(static_cast(*fmt))) + { + // space matches 0 or more white space characters + if (is.good()) + ws(is); + } + else + read(is, *fmt); + } + break; + } + } + // is.fail() || *fmt == CharT{} + if (is.rdstate() == ios::goodbit && command) + { + if (modified == CharT{}) + read(is, CharT{'%'}, width); + else + read(is, CharT{'%'}, width, modified); + } + if (!is.fail()) + { + if (y != not_a_2digit_year) + { + // Convert y and an optional C to Y + if (!(0 <= y && y <= 99)) + goto broken; + if (C == not_a_century) + { + if (Y == not_a_year) + { + if (y >= 69) + C = 19; + else + C = 20; + } + else + { + C = (Y >= 0 ? Y : Y-100) / 100; + } + } + int tY; + if (C >= 0) + tY = 100*C + y; + else + tY = 100*(C+1) - (y == 0 ? 100 : y); + if (Y != not_a_year && Y != tY) + goto broken; + Y = tY; + } + if (g != not_a_2digit_year) + { + // Convert g and an optional C to G + if (!(0 <= g && g <= 99)) + goto broken; + if (C == not_a_century) + { + if (G == not_a_year) + { + if (g >= 69) + C = 19; + else + C = 20; + } + else + { + C = (G >= 0 ? G : G-100) / 100; + } + } + int tG; + if (C >= 0) + tG = 100*C + g; + else + tG = 100*(C+1) - (g == 0 ? 100 : g); + if (G != not_a_year && G != tG) + goto broken; + G = tG; + } + if (Y < static_cast(year::min()) || Y > static_cast(year::max())) + Y = not_a_year; + bool computed = false; + if (G != not_a_year && V != not_a_week_num && wd != not_a_weekday) + { + year_month_day ymd_trial = sys_days(year{G-1}/December/Thursday[last]) + + (Monday-Thursday) + weeks{V-1} + + (weekday{static_cast(wd)}-Monday); + if (Y == not_a_year) + Y = static_cast(ymd_trial.year()); + else if (year{Y} != ymd_trial.year()) + goto broken; + if (m == not_a_month) + m = static_cast(static_cast(ymd_trial.month())); + else if (month(static_cast(m)) != ymd_trial.month()) + goto broken; + if (d == not_a_day) + d = static_cast(static_cast(ymd_trial.day())); + else if (day(static_cast(d)) != ymd_trial.day()) + goto broken; + computed = true; + } + if (Y != not_a_year && U != not_a_week_num && wd != not_a_weekday) + { + year_month_day ymd_trial = sys_days(year{Y}/January/Sunday[1]) + + weeks{U-1} + + (weekday{static_cast(wd)} - Sunday); + if (year{Y} != ymd_trial.year()) + goto broken; + if (m == not_a_month) + m = static_cast(static_cast(ymd_trial.month())); + else if (month(static_cast(m)) != ymd_trial.month()) + goto broken; + if (d == not_a_day) + d = static_cast(static_cast(ymd_trial.day())); + else if (day(static_cast(d)) != ymd_trial.day()) + goto broken; + computed = true; + } + if (Y != not_a_year && W != not_a_week_num && wd != not_a_weekday) + { + year_month_day ymd_trial = sys_days(year{Y}/January/Monday[1]) + + weeks{W-1} + + (weekday{static_cast(wd)} - Monday); + if (year{Y} != ymd_trial.year()) + goto broken; + if (m == not_a_month) + m = static_cast(static_cast(ymd_trial.month())); + else if (month(static_cast(m)) != ymd_trial.month()) + goto broken; + if (d == not_a_day) + d = static_cast(static_cast(ymd_trial.day())); + else if (day(static_cast(d)) != ymd_trial.day()) + goto broken; + computed = true; + } + if (j != not_a_doy && Y != not_a_year) + { + auto ymd_trial = year_month_day{local_days(year{Y}/1/1) + days{j-1}}; + if (m == not_a_month) + m = static_cast(static_cast(ymd_trial.month())); + else if (month(static_cast(m)) != ymd_trial.month()) + goto broken; + if (d == not_a_day) + d = static_cast(static_cast(ymd_trial.day())); + else if (day(static_cast(d)) != ymd_trial.day()) + goto broken; + j = not_a_doy; + } + auto ymd = year{Y}/m/d; + if (ymd.ok()) + { + if (wd == not_a_weekday) + wd = static_cast((weekday(sys_days(ymd)) - Sunday).count()); + else if (wd != static_cast((weekday(sys_days(ymd)) - Sunday).count())) + goto broken; + if (!computed) + { + if (G != not_a_year || V != not_a_week_num) + { + sys_days sd = ymd; + auto G_trial = year_month_day{sd + days{3}}.year(); + auto start = sys_days((G_trial - years{1})/December/Thursday[last]) + + (Monday - Thursday); + if (sd < start) + { + --G_trial; + if (V != not_a_week_num) + start = sys_days((G_trial - years{1})/December/Thursday[last]) + + (Monday - Thursday); + } + if (G != not_a_year && G != static_cast(G_trial)) + goto broken; + if (V != not_a_week_num) + { + auto V_trial = duration_cast(sd - start).count() + 1; + if (V != V_trial) + goto broken; + } + } + if (U != not_a_week_num) + { + auto start = sys_days(Sunday[1]/January/ymd.year()); + auto U_trial = floor(sys_days(ymd) - start).count() + 1; + if (U != U_trial) + goto broken; + } + if (W != not_a_week_num) + { + auto start = sys_days(Monday[1]/January/ymd.year()); + auto W_trial = floor(sys_days(ymd) - start).count() + 1; + if (W != W_trial) + goto broken; + } + } + } + fds.ymd = ymd; + if (I != not_a_hour_12_value) + { + if (!(1 <= I && I <= 12)) + goto broken; + if (p != not_a_ampm) + { + // p is in [0, 1] == [AM, PM] + // Store trial H in I + if (I == 12) + --p; + I += p*12; + // Either set H from I or make sure H and I are consistent + if (H == not_a_hour) + H = I; + else if (I != H) + goto broken; + } + else // p == not_a_ampm + { + // if H, make sure H and I could be consistent + if (H != not_a_hour) + { + if (I == 12) + { + if (H != 0 && H != 12) + goto broken; + } + else if (!(I == H || I == H+12)) + { + goto broken; + } + } + else // I is ambiguous, AM or PM? + goto broken; + } + } + if (H != not_a_hour) + { + fds.has_tod = true; + fds.tod = hh_mm_ss{hours{H}}; + } + if (M != not_a_minute) + { + fds.has_tod = true; + fds.tod.m_ = minutes{M}; + } + if (s != not_a_second) + { + fds.has_tod = true; + fds.tod.s_ = detail::decimal_format_seconds{s}; + } + if (j != not_a_doy) + { + fds.has_tod = true; + fds.tod.h_ += hours{days{j}}; + } + if (wd != not_a_weekday) + fds.wd = weekday{static_cast(wd)}; + if (abbrev != nullptr) + *abbrev = std::move(temp_abbrev); + if (offset != nullptr && temp_offset != not_a_offset) + *offset = temp_offset; + } + return is; + } +broken: + is.setstate(ios::failbit); + return is; +} + +template > +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, year& y, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) +{ + using CT = std::chrono::seconds; + fields fds{}; + date::from_stream(is, fmt, fds, abbrev, offset); + if (!fds.ymd.year().ok()) + is.setstate(std::ios::failbit); + if (!is.fail()) + y = fds.ymd.year(); + return is; +} + +template > +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, month& m, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) +{ + using CT = std::chrono::seconds; + fields fds{}; + date::from_stream(is, fmt, fds, abbrev, offset); + if (!fds.ymd.month().ok()) + is.setstate(std::ios::failbit); + if (!is.fail()) + m = fds.ymd.month(); + return is; +} + +template > +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, day& d, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) +{ + using CT = std::chrono::seconds; + fields fds{}; + date::from_stream(is, fmt, fds, abbrev, offset); + if (!fds.ymd.day().ok()) + is.setstate(std::ios::failbit); + if (!is.fail()) + d = fds.ymd.day(); + return is; +} + +template > +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, weekday& wd, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) +{ + using CT = std::chrono::seconds; + fields fds{}; + date::from_stream(is, fmt, fds, abbrev, offset); + if (!fds.wd.ok()) + is.setstate(std::ios::failbit); + if (!is.fail()) + wd = fds.wd; + return is; +} + +template > +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, year_month& ym, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) +{ + using CT = std::chrono::seconds; + fields fds{}; + date::from_stream(is, fmt, fds, abbrev, offset); + if (!fds.ymd.month().ok()) + is.setstate(std::ios::failbit); + if (!is.fail()) + ym = fds.ymd.year()/fds.ymd.month(); + return is; +} + +template > +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, month_day& md, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) +{ + using CT = std::chrono::seconds; + fields fds{}; + date::from_stream(is, fmt, fds, abbrev, offset); + if (!fds.ymd.month().ok() || !fds.ymd.day().ok()) + is.setstate(std::ios::failbit); + if (!is.fail()) + md = fds.ymd.month()/fds.ymd.day(); + return is; +} + +template > +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, + year_month_day& ymd, std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) +{ + using CT = std::chrono::seconds; + fields fds{}; + date::from_stream(is, fmt, fds, abbrev, offset); + if (!fds.ymd.ok()) + is.setstate(std::ios::failbit); + if (!is.fail()) + ymd = fds.ymd; + return is; +} + +template > +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, + sys_time& tp, std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) +{ + using CT = typename std::common_type::type; + using detail::round_i; + std::chrono::minutes offset_local = std::chrono::minutes::min(); + fields fds{}; + fds.has_tod = true; + date::from_stream(is, fmt, fds, abbrev, &offset_local); + if (!fds.ymd.ok() || !fds.tod.in_conventional_range()) + is.setstate(std::ios::failbit); + if (!is.fail()) + { + if (offset_local != std::chrono::minutes::min()) + { + tp = round_i(sys_days(fds.ymd) - offset_local + fds.tod.to_duration()); + if (offset != nullptr) + *offset = offset_local; + } + else + { + tp = round_i(sys_days(fds.ymd) + fds.tod.to_duration()); + } + } + return is; +} + +template > +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, + local_time& tp, std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) +{ + using CT = typename std::common_type::type; + using detail::round_i; + fields fds{}; + fds.has_tod = true; + date::from_stream(is, fmt, fds, abbrev, offset); + if (!fds.ymd.ok() || !fds.tod.in_conventional_range()) + is.setstate(std::ios::failbit); + if (!is.fail()) + tp = round_i(local_seconds{local_days(fds.ymd)} + fds.tod.to_duration()); + return is; +} + +template > +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, + std::chrono::duration& d, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) +{ + using Duration = std::chrono::duration; + using CT = typename std::common_type::type; + using detail::round_i; + fields fds{}; + date::from_stream(is, fmt, fds, abbrev, offset); + if (!fds.has_tod) + is.setstate(std::ios::failbit); + if (!is.fail()) + d = round_i(fds.tod.to_duration()); + return is; +} + +template , + class Alloc = std::allocator> +struct parse_manip +{ + const std::basic_string format_; + Parsable& tp_; + std::basic_string* abbrev_; + std::chrono::minutes* offset_; + +public: + parse_manip(std::basic_string format, Parsable& tp, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) + : format_(std::move(format)) + , tp_(tp) + , abbrev_(abbrev) + , offset_(offset) + {} + +#if HAS_STRING_VIEW + parse_manip(const CharT* format, Parsable& tp, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) + : format_(format) + , tp_(tp) + , abbrev_(abbrev) + , offset_(offset) + {} + + parse_manip(std::basic_string_view format, Parsable& tp, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) + : format_(format) + , tp_(tp) + , abbrev_(abbrev) + , offset_(offset) + {} +#endif // HAS_STRING_VIEW +}; + +#ifdef _MSC_VER + +template +std::basic_istream& +operator>>(std::basic_istream& is, + const parse_manip& x) +{ + return date::from_stream(is, x.format_.c_str(), x.tp_, x.abbrev_, x.offset_); +} + +template +inline +auto +parse(const std::basic_string& format, Parsable& tp) + -> decltype(date::from_stream(std::declval&>(), + format.c_str(), tp), + parse_manip{format, tp}) +{ + return {format, tp}; +} + +template +inline +auto +parse(const std::basic_string& format, Parsable& tp, + std::basic_string& abbrev) + -> decltype(date::from_stream(std::declval&>(), + format.c_str(), tp, &abbrev), + parse_manip{format, tp, &abbrev}) +{ + return {format, tp, &abbrev}; +} + +template +inline +auto +parse(const std::basic_string& format, Parsable& tp, + std::chrono::minutes& offset) + -> decltype(date::from_stream(std::declval&>(), + format.c_str(), tp, + std::declval*>(), + &offset), + parse_manip{format, tp, nullptr, &offset}) +{ + return {format, tp, nullptr, &offset}; +} + +template +inline +auto +parse(const std::basic_string& format, Parsable& tp, + std::basic_string& abbrev, std::chrono::minutes& offset) + -> decltype(date::from_stream(std::declval&>(), + format.c_str(), tp, &abbrev, &offset), + parse_manip{format, tp, &abbrev, &offset}) +{ + return {format, tp, &abbrev, &offset}; +} + +// const CharT* formats + +template +inline +auto +parse(const CharT* format, Parsable& tp) + -> decltype(date::from_stream(std::declval&>(), format, tp), + parse_manip{format, tp}) +{ + return {format, tp}; +} + +template +inline +auto +parse(const CharT* format, Parsable& tp, std::basic_string& abbrev) + -> decltype(date::from_stream(std::declval&>(), format, + tp, &abbrev), + parse_manip{format, tp, &abbrev}) +{ + return {format, tp, &abbrev}; +} + +template +inline +auto +parse(const CharT* format, Parsable& tp, std::chrono::minutes& offset) + -> decltype(date::from_stream(std::declval&>(), format, + tp, std::declval*>(), &offset), + parse_manip{format, tp, nullptr, &offset}) +{ + return {format, tp, nullptr, &offset}; +} + +template +inline +auto +parse(const CharT* format, Parsable& tp, + std::basic_string& abbrev, std::chrono::minutes& offset) + -> decltype(date::from_stream(std::declval&>(), format, + tp, &abbrev, &offset), + parse_manip{format, tp, &abbrev, &offset}) +{ + return {format, tp, &abbrev, &offset}; +} + +#else // !defined _MSC_VER + +template +std::basic_istream& +operator>>(std::basic_istream& is, + const parse_manip& x) +{ + return from_stream(is, x.format_.c_str(), x.tp_, x.abbrev_, x.offset_); +} + +template +inline +auto +parse(const std::basic_string& format, Parsable& tp) + -> decltype(from_stream(std::declval&>(), + format.c_str(), tp), + parse_manip{format, tp}) +{ + return {format, tp}; +} + +template +inline +auto +parse(const std::basic_string& format, Parsable& tp, + std::basic_string& abbrev) + -> decltype(from_stream(std::declval&>(), + format.c_str(), tp, &abbrev), + parse_manip{format, tp, &abbrev}) +{ + return {format, tp, &abbrev}; +} + +template +inline +auto +parse(const std::basic_string& format, Parsable& tp, + std::chrono::minutes& offset) + -> decltype(from_stream(std::declval&>(), + format.c_str(), tp, + std::declval*>(), + &offset), + parse_manip{format, tp, nullptr, &offset}) +{ + return {format, tp, nullptr, &offset}; +} + +template +inline +auto +parse(const std::basic_string& format, Parsable& tp, + std::basic_string& abbrev, std::chrono::minutes& offset) + -> decltype(from_stream(std::declval&>(), + format.c_str(), tp, &abbrev, &offset), + parse_manip{format, tp, &abbrev, &offset}) +{ + return {format, tp, &abbrev, &offset}; +} + +// const CharT* formats + +template +inline +auto +parse(const CharT* format, Parsable& tp) + -> decltype(from_stream(std::declval&>(), format, tp), + parse_manip{format, tp}) +{ + return {format, tp}; +} + +template +inline +auto +parse(const CharT* format, Parsable& tp, std::basic_string& abbrev) + -> decltype(from_stream(std::declval&>(), format, + tp, &abbrev), + parse_manip{format, tp, &abbrev}) +{ + return {format, tp, &abbrev}; +} + +template +inline +auto +parse(const CharT* format, Parsable& tp, std::chrono::minutes& offset) + -> decltype(from_stream(std::declval&>(), format, + tp, std::declval*>(), &offset), + parse_manip{format, tp, nullptr, &offset}) +{ + return {format, tp, nullptr, &offset}; +} + +template +inline +auto +parse(const CharT* format, Parsable& tp, + std::basic_string& abbrev, std::chrono::minutes& offset) + -> decltype(from_stream(std::declval&>(), format, + tp, &abbrev, &offset), + parse_manip{format, tp, &abbrev, &offset}) +{ + return {format, tp, &abbrev, &offset}; +} + +#endif // !defined _MSC_VER + +// duration streaming + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, + const std::chrono::duration& d) +{ + return os << detail::make_string::from(d.count()) + + detail::get_units(typename Period::type{}); +} + +} // namespace date + +#ifdef _MSC_VER +# pragma warning(pop) +#endif + +#ifdef __GNUC__ +# pragma GCC diagnostic pop +#endif + +#endif // DATE_H diff --git a/vendor/date/ios.h b/vendor/date/ios.h new file mode 100644 index 000000000..a9f863653 --- /dev/null +++ b/vendor/date/ios.h @@ -0,0 +1,50 @@ +// +// ios.h +// DateTimeLib +// +// The MIT License (MIT) +// +// Copyright (c) 2016 Alexander Kormanovsky +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#ifndef ios_hpp +#define ios_hpp + +#if __APPLE__ +# include +# if TARGET_OS_IPHONE +# include + + namespace date + { + namespace iOSUtils + { + + std::string get_tzdata_path(); + std::string get_current_timezone(); + + } // namespace iOSUtils + } // namespace date + +# endif // TARGET_OS_IPHONE +#else // !__APPLE__ +# define TARGET_OS_IPHONE 0 +#endif // !__APPLE__ +#endif // ios_hpp diff --git a/vendor/date/islamic.h b/vendor/date/islamic.h new file mode 100644 index 000000000..b1a47baf8 --- /dev/null +++ b/vendor/date/islamic.h @@ -0,0 +1,3031 @@ +#ifndef ISLAMIC_H +#define ISLAMIC_H + +// The MIT License (MIT) +// +// Copyright (c) 2016 Howard Hinnant +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// Our apologies. When the previous paragraph was written, lowercase had not yet +// been invented (that would involve another several millennia of evolution). +// We did not mean to shout. + +#include "date.h" + +namespace islamic +{ + +// durations + +using days = date::days; + +using weeks = date::weeks; + +using years = std::chrono::duration + , days::period>>; + +using months = std::chrono::duration + >>; + +// time_point + +using sys_days = date::sys_days; +using local_days = date::local_days; + +// types + +struct last_spec +{ + explicit last_spec() = default; +}; + +class day; +class month; +class year; + +class weekday; +class weekday_indexed; +class weekday_last; + +class month_day; +class month_day_last; +class month_weekday; +class month_weekday_last; + +class year_month; + +class year_month_day; +class year_month_day_last; +class year_month_weekday; +class year_month_weekday_last; + +// date composition operators + +CONSTCD11 year_month operator/(const year& y, const month& m) NOEXCEPT; +CONSTCD11 year_month operator/(const year& y, int m) NOEXCEPT; + +CONSTCD11 month_day operator/(const day& d, const month& m) NOEXCEPT; +CONSTCD11 month_day operator/(const day& d, int m) NOEXCEPT; +CONSTCD11 month_day operator/(const month& m, const day& d) NOEXCEPT; +CONSTCD11 month_day operator/(const month& m, int d) NOEXCEPT; +CONSTCD11 month_day operator/(int m, const day& d) NOEXCEPT; + +CONSTCD11 month_day_last operator/(const month& m, last_spec) NOEXCEPT; +CONSTCD11 month_day_last operator/(int m, last_spec) NOEXCEPT; +CONSTCD11 month_day_last operator/(last_spec, const month& m) NOEXCEPT; +CONSTCD11 month_day_last operator/(last_spec, int m) NOEXCEPT; + +CONSTCD11 month_weekday operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT; +CONSTCD11 month_weekday operator/(int m, const weekday_indexed& wdi) NOEXCEPT; +CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT; +CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, int m) NOEXCEPT; + +CONSTCD11 month_weekday_last operator/(const month& m, const weekday_last& wdl) NOEXCEPT; +CONSTCD11 month_weekday_last operator/(int m, const weekday_last& wdl) NOEXCEPT; +CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, const month& m) NOEXCEPT; +CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, int m) NOEXCEPT; + +CONSTCD11 year_month_day operator/(const year_month& ym, const day& d) NOEXCEPT; +CONSTCD11 year_month_day operator/(const year_month& ym, int d) NOEXCEPT; +CONSTCD11 year_month_day operator/(const year& y, const month_day& md) NOEXCEPT; +CONSTCD11 year_month_day operator/(int y, const month_day& md) NOEXCEPT; +CONSTCD11 year_month_day operator/(const month_day& md, const year& y) NOEXCEPT; +CONSTCD11 year_month_day operator/(const month_day& md, int y) NOEXCEPT; + +CONSTCD11 + year_month_day_last operator/(const year_month& ym, last_spec) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(const year& y, const month_day_last& mdl) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(int y, const month_day_last& mdl) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(const month_day_last& mdl, const year& y) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(const month_day_last& mdl, int y) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const year& y, const month_weekday& mwd) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(int y, const month_weekday& mwd) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const month_weekday& mwd, const year& y) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const month_weekday& mwd, int y) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(int y, const month_weekday_last& mwdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const month_weekday_last& mwdl, int y) NOEXCEPT; + +// Detailed interface + +// day + +class day +{ + unsigned char d_; + +public: + explicit CONSTCD11 day(unsigned d) NOEXCEPT; + + CONSTCD14 day& operator++() NOEXCEPT; + CONSTCD14 day operator++(int) NOEXCEPT; + CONSTCD14 day& operator--() NOEXCEPT; + CONSTCD14 day operator--(int) NOEXCEPT; + + CONSTCD14 day& operator+=(const days& d) NOEXCEPT; + CONSTCD14 day& operator-=(const days& d) NOEXCEPT; + + CONSTCD11 explicit operator unsigned() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator!=(const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator< (const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator> (const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator<=(const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator>=(const day& x, const day& y) NOEXCEPT; + +CONSTCD11 day operator+(const day& x, const days& y) NOEXCEPT; +CONSTCD11 day operator+(const days& x, const day& y) NOEXCEPT; +CONSTCD11 day operator-(const day& x, const days& y) NOEXCEPT; +CONSTCD11 days operator-(const day& x, const day& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const day& d); + +// month + +class month +{ + unsigned char m_; + +public: + explicit CONSTCD11 month(unsigned m) NOEXCEPT; + + CONSTCD14 month& operator++() NOEXCEPT; + CONSTCD14 month operator++(int) NOEXCEPT; + CONSTCD14 month& operator--() NOEXCEPT; + CONSTCD14 month operator--(int) NOEXCEPT; + + CONSTCD14 month& operator+=(const months& m) NOEXCEPT; + CONSTCD14 month& operator-=(const months& m) NOEXCEPT; + + CONSTCD11 explicit operator unsigned() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator< (const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator> (const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator<=(const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator>=(const month& x, const month& y) NOEXCEPT; + +CONSTCD14 month operator+(const month& x, const months& y) NOEXCEPT; +CONSTCD14 month operator+(const months& x, const month& y) NOEXCEPT; +CONSTCD14 month operator-(const month& x, const months& y) NOEXCEPT; +CONSTCD14 months operator-(const month& x, const month& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month& m); + +// year + +class year +{ + short y_; + +public: + explicit CONSTCD11 year(int y) NOEXCEPT; + + CONSTCD14 year& operator++() NOEXCEPT; + CONSTCD14 year operator++(int) NOEXCEPT; + CONSTCD14 year& operator--() NOEXCEPT; + CONSTCD14 year operator--(int) NOEXCEPT; + + CONSTCD14 year& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year& operator-=(const years& y) NOEXCEPT; + + CONSTCD14 bool is_leap() const NOEXCEPT; + + CONSTCD11 explicit operator int() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; + + static CONSTCD11 year min() NOEXCEPT; + static CONSTCD11 year max() NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator< (const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator> (const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year& x, const year& y) NOEXCEPT; + +CONSTCD11 year operator+(const year& x, const years& y) NOEXCEPT; +CONSTCD11 year operator+(const years& x, const year& y) NOEXCEPT; +CONSTCD11 year operator-(const year& x, const years& y) NOEXCEPT; +CONSTCD11 years operator-(const year& x, const year& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year& y); + +// weekday + +class weekday +{ + unsigned char wd_; +public: + explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT; + explicit weekday(int) = delete; + CONSTCD11 weekday(const sys_days& dp) NOEXCEPT; + CONSTCD11 explicit weekday(const local_days& dp) NOEXCEPT; + + CONSTCD14 weekday& operator++() NOEXCEPT; + CONSTCD14 weekday operator++(int) NOEXCEPT; + CONSTCD14 weekday& operator--() NOEXCEPT; + CONSTCD14 weekday operator--(int) NOEXCEPT; + + CONSTCD14 weekday& operator+=(const days& d) NOEXCEPT; + CONSTCD14 weekday& operator-=(const days& d) NOEXCEPT; + + CONSTCD11 explicit operator unsigned() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; + + CONSTCD11 weekday_indexed operator[](unsigned index) const NOEXCEPT; + CONSTCD11 weekday_last operator[](last_spec) const NOEXCEPT; + +private: + static CONSTCD11 unsigned char weekday_from_days(int z) NOEXCEPT; +}; + +CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weekday& x, const weekday& y) NOEXCEPT; + +CONSTCD14 weekday operator+(const weekday& x, const days& y) NOEXCEPT; +CONSTCD14 weekday operator+(const days& x, const weekday& y) NOEXCEPT; +CONSTCD14 weekday operator-(const weekday& x, const days& y) NOEXCEPT; +CONSTCD14 days operator-(const weekday& x, const weekday& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday& wd); + +// weekday_indexed + +class weekday_indexed +{ + unsigned char wd_ : 4; + unsigned char index_ : 4; + +public: + CONSTCD11 weekday_indexed(const islamic::weekday& wd, unsigned index) NOEXCEPT; + + CONSTCD11 islamic::weekday weekday() const NOEXCEPT; + CONSTCD11 unsigned index() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_indexed& wdi); + +// weekday_last + +class weekday_last +{ + islamic::weekday wd_; + +public: + explicit CONSTCD11 weekday_last(const islamic::weekday& wd) NOEXCEPT; + + CONSTCD11 islamic::weekday weekday() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_last& wdl); + +// year_month + +class year_month +{ + islamic::year y_; + islamic::month m_; + +public: + CONSTCD11 year_month(const islamic::year& y, const islamic::month& m) NOEXCEPT; + + CONSTCD11 islamic::year year() const NOEXCEPT; + CONSTCD11 islamic::month month() const NOEXCEPT; + + CONSTCD14 year_month& operator+=(const months& dm) NOEXCEPT; + CONSTCD14 year_month& operator-=(const months& dm) NOEXCEPT; + CONSTCD14 year_month& operator+=(const years& dy) NOEXCEPT; + CONSTCD14 year_month& operator-=(const years& dy) NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator< (const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator> (const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year_month& x, const year_month& y) NOEXCEPT; + +CONSTCD14 year_month operator+(const year_month& ym, const months& dm) NOEXCEPT; +CONSTCD14 year_month operator+(const months& dm, const year_month& ym) NOEXCEPT; +CONSTCD14 year_month operator-(const year_month& ym, const months& dm) NOEXCEPT; + +CONSTCD11 months operator-(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 year_month operator+(const year_month& ym, const years& dy) NOEXCEPT; +CONSTCD11 year_month operator+(const years& dy, const year_month& ym) NOEXCEPT; +CONSTCD11 year_month operator-(const year_month& ym, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month& ym); + +// month_day + +class month_day +{ + islamic::month m_; + islamic::day d_; + +public: + CONSTCD11 month_day(const islamic::month& m, const islamic::day& d) NOEXCEPT; + + CONSTCD11 islamic::month month() const NOEXCEPT; + CONSTCD11 islamic::day day() const NOEXCEPT; + + CONSTCD14 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator< (const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator> (const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator<=(const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator>=(const month_day& x, const month_day& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day& md); + +// month_day_last + +class month_day_last +{ + islamic::month m_; + +public: + CONSTCD11 explicit month_day_last(const islamic::month& m) NOEXCEPT; + + CONSTCD11 islamic::month month() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator< (const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator> (const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day_last& mdl); + +// month_weekday + +class month_weekday +{ + islamic::month m_; + islamic::weekday_indexed wdi_; +public: + CONSTCD11 month_weekday(const islamic::month& m, + const islamic::weekday_indexed& wdi) NOEXCEPT; + + CONSTCD11 islamic::month month() const NOEXCEPT; + CONSTCD11 islamic::weekday_indexed weekday_indexed() const NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday& mwd); + +// month_weekday_last + +class month_weekday_last +{ + islamic::month m_; + islamic::weekday_last wdl_; + +public: + CONSTCD11 month_weekday_last(const islamic::month& m, + const islamic::weekday_last& wd) NOEXCEPT; + + CONSTCD11 islamic::month month() const NOEXCEPT; + CONSTCD11 islamic::weekday_last weekday_last() const NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 + bool operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT; +CONSTCD11 + bool operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday_last& mwdl); + +// class year_month_day + +class year_month_day +{ + islamic::year y_; + islamic::month m_; + islamic::day d_; + +public: + CONSTCD11 year_month_day(const islamic::year& y, const islamic::month& m, + const islamic::day& d) NOEXCEPT; + CONSTCD14 year_month_day(const year_month_day_last& ymdl) NOEXCEPT; + + CONSTCD14 year_month_day(sys_days dp) NOEXCEPT; + CONSTCD14 explicit year_month_day(local_days dp) NOEXCEPT; + + CONSTCD14 year_month_day& operator+=(const months& m) NOEXCEPT; + CONSTCD14 year_month_day& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_day& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_day& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 islamic::year year() const NOEXCEPT; + CONSTCD11 islamic::month month() const NOEXCEPT; + CONSTCD11 islamic::day day() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD14 bool ok() const NOEXCEPT; + +private: + static CONSTCD14 year_month_day from_days(days dp) NOEXCEPT; + CONSTCD14 days to_days() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator< (const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator> (const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT; + +CONSTCD14 year_month_day operator+(const year_month_day& ymd, const months& dm) NOEXCEPT; +CONSTCD14 year_month_day operator+(const months& dm, const year_month_day& ymd) NOEXCEPT; +CONSTCD14 year_month_day operator-(const year_month_day& ymd, const months& dm) NOEXCEPT; +CONSTCD11 year_month_day operator+(const year_month_day& ymd, const years& dy) NOEXCEPT; +CONSTCD11 year_month_day operator+(const years& dy, const year_month_day& ymd) NOEXCEPT; +CONSTCD11 year_month_day operator-(const year_month_day& ymd, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day& ymd); + +// year_month_day_last + +class year_month_day_last +{ + islamic::year y_; + islamic::month_day_last mdl_; + +public: + CONSTCD11 year_month_day_last(const islamic::year& y, + const islamic::month_day_last& mdl) NOEXCEPT; + + CONSTCD14 year_month_day_last& operator+=(const months& m) NOEXCEPT; + CONSTCD14 year_month_day_last& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_day_last& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_day_last& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 islamic::year year() const NOEXCEPT; + CONSTCD11 islamic::month month() const NOEXCEPT; + CONSTCD11 islamic::month_day_last month_day_last() const NOEXCEPT; + CONSTCD14 islamic::day day() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 + bool operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator< (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator> (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; + +CONSTCD14 +year_month_day_last +operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT; + +CONSTCD14 +year_month_day_last +operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT; + +CONSTCD11 +year_month_day_last +operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT; + +CONSTCD11 +year_month_day_last +operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT; + +CONSTCD14 +year_month_day_last +operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT; + +CONSTCD11 +year_month_day_last +operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day_last& ymdl); + +// year_month_weekday + +class year_month_weekday +{ + islamic::year y_; + islamic::month m_; + islamic::weekday_indexed wdi_; + +public: + CONSTCD11 year_month_weekday(const islamic::year& y, const islamic::month& m, + const islamic::weekday_indexed& wdi) NOEXCEPT; + CONSTCD14 year_month_weekday(const sys_days& dp) NOEXCEPT; + CONSTCD14 explicit year_month_weekday(const local_days& dp) NOEXCEPT; + + CONSTCD14 year_month_weekday& operator+=(const months& m) NOEXCEPT; + CONSTCD14 year_month_weekday& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_weekday& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_weekday& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 islamic::year year() const NOEXCEPT; + CONSTCD11 islamic::month month() const NOEXCEPT; + CONSTCD11 islamic::weekday weekday() const NOEXCEPT; + CONSTCD11 unsigned index() const NOEXCEPT; + CONSTCD11 islamic::weekday_indexed weekday_indexed() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD14 bool ok() const NOEXCEPT; + +private: + static CONSTCD14 year_month_weekday from_days(days dp) NOEXCEPT; + CONSTCD14 days to_days() const NOEXCEPT; +}; + +CONSTCD11 + bool operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT; +CONSTCD11 + bool operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT; + +CONSTCD14 +year_month_weekday +operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT; + +CONSTCD14 +year_month_weekday +operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT; + +CONSTCD14 +year_month_weekday +operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday& ymwdi); + +// year_month_weekday_last + +class year_month_weekday_last +{ + islamic::year y_; + islamic::month m_; + islamic::weekday_last wdl_; + +public: + CONSTCD11 year_month_weekday_last(const islamic::year& y, const islamic::month& m, + const islamic::weekday_last& wdl) NOEXCEPT; + + CONSTCD14 year_month_weekday_last& operator+=(const months& m) NOEXCEPT; + CONSTCD14 year_month_weekday_last& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_weekday_last& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_weekday_last& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 islamic::year year() const NOEXCEPT; + CONSTCD11 islamic::month month() const NOEXCEPT; + CONSTCD11 islamic::weekday weekday() const NOEXCEPT; + CONSTCD11 islamic::weekday_last weekday_last() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; + +private: + CONSTCD14 days to_days() const NOEXCEPT; +}; + +CONSTCD11 +bool +operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT; + +CONSTCD11 +bool +operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT; + +CONSTCD14 +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT; + +CONSTCD14 +year_month_weekday_last +operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT; + +CONSTCD14 +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday_last& ymwdl); + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +inline namespace literals +{ + +CONSTCD11 islamic::day operator ""_d(unsigned long long d) NOEXCEPT; +CONSTCD11 islamic::year operator ""_y(unsigned long long y) NOEXCEPT; + +} // inline namespace literals +#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900) + +//----------------+ +// Implementation | +//----------------+ + +// day + +CONSTCD11 inline day::day(unsigned d) NOEXCEPT : d_(static_cast(d)) {} +CONSTCD14 inline day& day::operator++() NOEXCEPT {++d_; return *this;} +CONSTCD14 inline day day::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline day& day::operator--() NOEXCEPT {--d_; return *this;} +CONSTCD14 inline day day::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} +CONSTCD14 inline day& day::operator+=(const days& d) NOEXCEPT {*this = *this + d; return *this;} +CONSTCD14 inline day& day::operator-=(const days& d) NOEXCEPT {*this = *this - d; return *this;} +CONSTCD11 inline day::operator unsigned() const NOEXCEPT {return d_;} +CONSTCD11 inline bool day::ok() const NOEXCEPT {return 1 <= d_ && d_ <= 30;} + +CONSTCD11 +inline +bool +operator==(const day& x, const day& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const day& x, const day& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const day& x, const day& y) NOEXCEPT +{ + return static_cast(x) < static_cast(y); +} + +CONSTCD11 +inline +bool +operator>(const day& x, const day& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const day& x, const day& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const day& x, const day& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD11 +inline +days +operator-(const day& x, const day& y) NOEXCEPT +{ + return days{static_cast(static_cast(x) + - static_cast(y))}; +} + +CONSTCD11 +inline +day +operator+(const day& x, const days& y) NOEXCEPT +{ + return day{static_cast(x) + static_cast(y.count())}; +} + +CONSTCD11 +inline +day +operator+(const days& x, const day& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD11 +inline +day +operator-(const day& x, const days& y) NOEXCEPT +{ + return x + -y; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const day& d) +{ + date::detail::save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os.width(2); + os << static_cast(d); + return os; +} + +// month + +CONSTCD11 inline month::month(unsigned m) NOEXCEPT : m_(static_cast(m)) {} +CONSTCD14 inline month& month::operator++() NOEXCEPT {if (++m_ == 13) m_ = 1; return *this;} +CONSTCD14 inline month month::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline month& month::operator--() NOEXCEPT {if (--m_ == 0) m_ = 12; return *this;} +CONSTCD14 inline month month::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} + +CONSTCD14 +inline +month& +month::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +month& +month::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD11 inline month::operator unsigned() const NOEXCEPT {return m_;} +CONSTCD11 inline bool month::ok() const NOEXCEPT {return 1 <= m_ && m_ <= 12;} + +CONSTCD11 +inline +bool +operator==(const month& x, const month& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const month& x, const month& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const month& x, const month& y) NOEXCEPT +{ + return static_cast(x) < static_cast(y); +} + +CONSTCD11 +inline +bool +operator>(const month& x, const month& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const month& x, const month& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const month& x, const month& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD14 +inline +months +operator-(const month& x, const month& y) NOEXCEPT +{ + auto const d = static_cast(x) - static_cast(y); + return months(d <= 11 ? d : d + 12); +} + +CONSTCD14 +inline +month +operator+(const month& x, const months& y) NOEXCEPT +{ + auto const mu = static_cast(static_cast(x)) - 1 + y.count(); + auto const yr = (mu >= 0 ? mu : mu-11) / 12; + return month{static_cast(mu - yr * 12 + 1)}; +} + +CONSTCD14 +inline +month +operator+(const months& x, const month& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD14 +inline +month +operator-(const month& x, const months& y) NOEXCEPT +{ + return x + -y; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month& m) +{ + switch (static_cast(m)) + { + case 1: + os << "Muharram"; + break; + case 2: + os << "Safar"; + break; + case 3: + os << "Rabi' al-awwal"; + break; + case 4: + os << "Rabi' al-thani"; + break; + case 5: + os << "Jumada al-awwal"; + break; + case 6: + os << "Jumada al-Thani"; + break; + case 7: + os << "Rajab"; + break; + case 8: + os << "Sha'ban"; + break; + case 9: + os << "Ramadan"; + break; + case 10: + os << "Shawwal"; + break; + case 11: + os << "Dhu al-Qi'dah"; + break; + case 12: + os << "Dhu al-Hijjah"; + break; + default: + os << static_cast(m) << " is not a valid month"; + break; + } + return os; +} + +// year + +CONSTCD11 inline year::year(int y) NOEXCEPT : y_(static_cast(y)) {} +CONSTCD14 inline year& year::operator++() NOEXCEPT {++y_; return *this;} +CONSTCD14 inline year year::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline year& year::operator--() NOEXCEPT {--y_; return *this;} +CONSTCD14 inline year year::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} +CONSTCD14 inline year& year::operator+=(const years& y) NOEXCEPT {*this = *this + y; return *this;} +CONSTCD14 inline year& year::operator-=(const years& y) NOEXCEPT {*this = *this - y; return *this;} + +CONSTCD14 +inline +bool +year::is_leap() const NOEXCEPT +{ + int y = y_ - 1; + const int era = (y >= 0 ? y : y-29) / 30; + const unsigned yoe = static_cast(y - era * 30); + switch (yoe) + { + case 1: + case 4: + case 6: + case 9: + case 12: + case 15: + case 17: + case 20: + case 23: + case 25: + case 28: + return true; + default: + return false; + } +} + +CONSTCD11 inline year::operator int() const NOEXCEPT {return y_;} +CONSTCD11 inline bool year::ok() const NOEXCEPT {return true;} + +CONSTCD11 +inline +year +year::min() NOEXCEPT +{ + return year{std::numeric_limits::min()}; +} + +CONSTCD11 +inline +year +year::max() NOEXCEPT +{ + return year{std::numeric_limits::max()}; +} + +CONSTCD11 +inline +bool +operator==(const year& x, const year& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const year& x, const year& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year& x, const year& y) NOEXCEPT +{ + return static_cast(x) < static_cast(y); +} + +CONSTCD11 +inline +bool +operator>(const year& x, const year& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year& x, const year& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year& x, const year& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD11 +inline +years +operator-(const year& x, const year& y) NOEXCEPT +{ + return years{static_cast(x) - static_cast(y)}; +} + +CONSTCD11 +inline +year +operator+(const year& x, const years& y) NOEXCEPT +{ + return year{static_cast(x) + y.count()}; +} + +CONSTCD11 +inline +year +operator+(const years& x, const year& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD11 +inline +year +operator-(const year& x, const years& y) NOEXCEPT +{ + return year{static_cast(x) - y.count()}; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year& y) +{ + date::detail::save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::internal); + os.width(4 + (y < year{0})); + os << static_cast(y); + return os; +} + +// weekday + +CONSTCD11 +inline +unsigned char +weekday::weekday_from_days(int z) NOEXCEPT +{ + return static_cast(static_cast( + z >= -4 ? (z+4) % 7 : (z+5) % 7 + 6)); +} + +CONSTCD11 +inline +weekday::weekday(unsigned wd) NOEXCEPT + : wd_(static_cast(wd)) + {} + +CONSTCD11 +inline +weekday::weekday(const sys_days& dp) NOEXCEPT + : wd_(weekday_from_days(dp.time_since_epoch().count())) + {} + +CONSTCD11 +inline +weekday::weekday(const local_days& dp) NOEXCEPT + : wd_(weekday_from_days(dp.time_since_epoch().count())) + {} + +CONSTCD14 inline weekday& weekday::operator++() NOEXCEPT {if (++wd_ == 7) wd_ = 0; return *this;} +CONSTCD14 inline weekday weekday::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline weekday& weekday::operator--() NOEXCEPT {if (wd_-- == 0) wd_ = 6; return *this;} +CONSTCD14 inline weekday weekday::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} + +CONSTCD14 +inline +weekday& +weekday::operator+=(const days& d) NOEXCEPT +{ + *this = *this + d; + return *this; +} + +CONSTCD14 +inline +weekday& +weekday::operator-=(const days& d) NOEXCEPT +{ + *this = *this - d; + return *this; +} + +CONSTCD11 +inline +weekday::operator unsigned() const NOEXCEPT +{ + return static_cast(wd_); +} + +CONSTCD11 inline bool weekday::ok() const NOEXCEPT {return wd_ <= 6;} + +CONSTCD11 +inline +bool +operator==(const weekday& x, const weekday& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const weekday& x, const weekday& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD14 +inline +days +operator-(const weekday& x, const weekday& y) NOEXCEPT +{ + auto const diff = static_cast(x) - static_cast(y); + return days{diff <= 6 ? diff : diff + 7}; +} + +CONSTCD14 +inline +weekday +operator+(const weekday& x, const days& y) NOEXCEPT +{ + auto const wdu = static_cast(static_cast(x)) + y.count(); + auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7; + return weekday{static_cast(wdu - wk * 7)}; +} + +CONSTCD14 +inline +weekday +operator+(const days& x, const weekday& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD14 +inline +weekday +operator-(const weekday& x, const days& y) NOEXCEPT +{ + return x + -y; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday& wd) +{ + switch (static_cast(wd)) + { + case 0: + os << "al-Aḥad"; + break; + case 1: + os << "al-Ithnayn"; + break; + case 2: + os << "ath-Thulāthā’"; + break; + case 3: + os << "al-Arba‘ā’"; + break; + case 4: + os << "al-Khamīs"; + break; + case 5: + os << "al-Jum‘ah"; + break; + case 6: + os << "as-Sabt"; + break; + default: + os << static_cast(wd) << " is not a valid weekday"; + break; + } + return os; +} + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +inline namespace literals +{ + +CONSTCD11 +inline +islamic::day +operator ""_d(unsigned long long d) NOEXCEPT +{ + return islamic::day{static_cast(d)}; +} + +CONSTCD11 +inline +islamic::year +operator ""_y(unsigned long long y) NOEXCEPT +{ + return islamic::year(static_cast(y)); +} +#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900) + +CONSTDATA islamic::last_spec last{}; + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +} // inline namespace literals +#endif + +// weekday_indexed + +CONSTCD11 +inline +weekday +weekday_indexed::weekday() const NOEXCEPT +{ + return islamic::weekday{static_cast(wd_)}; +} + +CONSTCD11 inline unsigned weekday_indexed::index() const NOEXCEPT {return index_;} + +CONSTCD11 +inline +bool +weekday_indexed::ok() const NOEXCEPT +{ + return weekday().ok() && 1 <= index_ && index_ <= 5; +} + +CONSTCD11 +inline +weekday_indexed::weekday_indexed(const islamic::weekday& wd, unsigned index) NOEXCEPT + : wd_(static_cast(static_cast(wd))) + , index_(static_cast(index)) + {} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_indexed& wdi) +{ + return os << wdi.weekday() << '[' << wdi.index() << ']'; +} + +CONSTCD11 +inline +weekday_indexed +weekday::operator[](unsigned index) const NOEXCEPT +{ + return {*this, index}; +} + +CONSTCD11 +inline +bool +operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT +{ + return x.weekday() == y.weekday() && x.index() == y.index(); +} + +CONSTCD11 +inline +bool +operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT +{ + return !(x == y); +} + +// weekday_last + +CONSTCD11 inline islamic::weekday weekday_last::weekday() const NOEXCEPT {return wd_;} +CONSTCD11 inline bool weekday_last::ok() const NOEXCEPT {return wd_.ok();} +CONSTCD11 inline weekday_last::weekday_last(const islamic::weekday& wd) NOEXCEPT : wd_(wd) {} + +CONSTCD11 +inline +bool +operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT +{ + return x.weekday() == y.weekday(); +} + +CONSTCD11 +inline +bool +operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_last& wdl) +{ + return os << wdl.weekday() << "[last]"; +} + +CONSTCD11 +inline +weekday_last +weekday::operator[](last_spec) const NOEXCEPT +{ + return weekday_last{*this}; +} + +// year_month + +CONSTCD11 +inline +year_month::year_month(const islamic::year& y, const islamic::month& m) NOEXCEPT + : y_(y) + , m_(m) + {} + +CONSTCD11 inline year year_month::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month::month() const NOEXCEPT {return m_;} +CONSTCD11 inline bool year_month::ok() const NOEXCEPT {return y_.ok() && m_.ok();} + +CONSTCD14 +inline +year_month& +year_month::operator+=(const months& dm) NOEXCEPT +{ + *this = *this + dm; + return *this; +} + +CONSTCD14 +inline +year_month& +year_month::operator-=(const months& dm) NOEXCEPT +{ + *this = *this - dm; + return *this; +} + +CONSTCD14 +inline +year_month& +year_month::operator+=(const years& dy) NOEXCEPT +{ + *this = *this + dy; + return *this; +} + +CONSTCD14 +inline +year_month& +year_month::operator-=(const years& dy) NOEXCEPT +{ + *this = *this - dy; + return *this; +} + +CONSTCD11 +inline +bool +operator==(const year_month& x, const year_month& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month& x, const year_month& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_month& x, const year_month& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (x.month() < y.month())); +} + +CONSTCD11 +inline +bool +operator>(const year_month& x, const year_month& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_month& x, const year_month& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_month& x, const year_month& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD14 +inline +year_month +operator+(const year_month& ym, const months& dm) NOEXCEPT +{ + auto dmi = static_cast(static_cast(ym.month())) - 1 + dm.count(); + auto dy = (dmi >= 0 ? dmi : dmi-11) / 12; + dmi = dmi - dy * 12 + 1; + return (ym.year() + years(dy)) / month(static_cast(dmi)); +} + +CONSTCD14 +inline +year_month +operator+(const months& dm, const year_month& ym) NOEXCEPT +{ + return ym + dm; +} + +CONSTCD14 +inline +year_month +operator-(const year_month& ym, const months& dm) NOEXCEPT +{ + return ym + -dm; +} + +CONSTCD11 +inline +months +operator-(const year_month& x, const year_month& y) NOEXCEPT +{ + return (x.year() - y.year()) + + months(static_cast(x.month()) - static_cast(y.month())); +} + +CONSTCD11 +inline +year_month +operator+(const year_month& ym, const years& dy) NOEXCEPT +{ + return (ym.year() + dy) / ym.month(); +} + +CONSTCD11 +inline +year_month +operator+(const years& dy, const year_month& ym) NOEXCEPT +{ + return ym + dy; +} + +CONSTCD11 +inline +year_month +operator-(const year_month& ym, const years& dy) NOEXCEPT +{ + return ym + -dy; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month& ym) +{ + return os << ym.year() << '/' << ym.month(); +} + +// month_day + +CONSTCD11 +inline +month_day::month_day(const islamic::month& m, const islamic::day& d) NOEXCEPT + : m_(m) + , d_(d) + {} + +CONSTCD11 inline islamic::month month_day::month() const NOEXCEPT {return m_;} +CONSTCD11 inline islamic::day month_day::day() const NOEXCEPT {return d_;} + +CONSTCD14 +inline +bool +month_day::ok() const NOEXCEPT +{ + CONSTDATA islamic::day d[] = + {30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 30_d}; + return m_.ok() && 1_d <= d_ && d_ <= d[static_cast(m_)-1]; +} + +CONSTCD11 +inline +bool +operator==(const month_day& x, const month_day& y) NOEXCEPT +{ + return x.month() == y.month() && x.day() == y.day(); +} + +CONSTCD11 +inline +bool +operator!=(const month_day& x, const month_day& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const month_day& x, const month_day& y) NOEXCEPT +{ + return x.month() < y.month() ? true + : (x.month() > y.month() ? false + : (x.day() < y.day())); +} + +CONSTCD11 +inline +bool +operator>(const month_day& x, const month_day& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const month_day& x, const month_day& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const month_day& x, const month_day& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day& md) +{ + return os << md.month() << '/' << md.day(); +} + +// month_day_last + +CONSTCD11 inline month month_day_last::month() const NOEXCEPT {return m_;} +CONSTCD11 inline bool month_day_last::ok() const NOEXCEPT {return m_.ok();} +CONSTCD11 inline month_day_last::month_day_last(const islamic::month& m) NOEXCEPT : m_(m) {} + +CONSTCD11 +inline +bool +operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return x.month() == y.month(); +} + +CONSTCD11 +inline +bool +operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return x.month() < y.month(); +} + +CONSTCD11 +inline +bool +operator>(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day_last& mdl) +{ + return os << mdl.month() << "/last"; +} + +// month_weekday + +CONSTCD11 +inline +month_weekday::month_weekday(const islamic::month& m, + const islamic::weekday_indexed& wdi) NOEXCEPT + : m_(m) + , wdi_(wdi) + {} + +CONSTCD11 inline month month_weekday::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday_indexed +month_weekday::weekday_indexed() const NOEXCEPT +{ + return wdi_; +} + +CONSTCD11 +inline +bool +month_weekday::ok() const NOEXCEPT +{ + return m_.ok() && wdi_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT +{ + return x.month() == y.month() && x.weekday_indexed() == y.weekday_indexed(); +} + +CONSTCD11 +inline +bool +operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday& mwd) +{ + return os << mwd.month() << '/' << mwd.weekday_indexed(); +} + +// month_weekday_last + +CONSTCD11 +inline +month_weekday_last::month_weekday_last(const islamic::month& m, + const islamic::weekday_last& wdl) NOEXCEPT + : m_(m) + , wdl_(wdl) + {} + +CONSTCD11 inline month month_weekday_last::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday_last +month_weekday_last::weekday_last() const NOEXCEPT +{ + return wdl_; +} + +CONSTCD11 +inline +bool +month_weekday_last::ok() const NOEXCEPT +{ + return m_.ok() && wdl_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT +{ + return x.month() == y.month() && x.weekday_last() == y.weekday_last(); +} + +CONSTCD11 +inline +bool +operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday_last& mwdl) +{ + return os << mwdl.month() << '/' << mwdl.weekday_last(); +} + +// year_month_day_last + +CONSTCD11 +inline +year_month_day_last::year_month_day_last(const islamic::year& y, + const islamic::month_day_last& mdl) NOEXCEPT + : y_(y) + , mdl_(mdl) + {} + +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline year year_month_day_last::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_day_last::month() const NOEXCEPT {return mdl_.month();} + +CONSTCD11 +inline +month_day_last +year_month_day_last::month_day_last() const NOEXCEPT +{ + return mdl_; +} + +CONSTCD14 +inline +day +year_month_day_last::day() const NOEXCEPT +{ + CONSTDATA islamic::day d[] = + {30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d, 30_d, 29_d}; + return month() != islamic::month(12) || !y_.is_leap() ? + d[static_cast(month())-1] : 30_d; +} + +CONSTCD14 +inline +year_month_day_last::operator sys_days() const NOEXCEPT +{ + return sys_days(year()/month()/day()); +} + +CONSTCD14 +inline +year_month_day_last::operator local_days() const NOEXCEPT +{ + return local_days(year()/month()/day()); +} + +CONSTCD11 +inline +bool +year_month_day_last::ok() const NOEXCEPT +{ + return y_.ok() && mdl_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return x.year() == y.year() && x.month_day_last() == y.month_day_last(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (x.month_day_last() < y.month_day_last())); +} + +CONSTCD11 +inline +bool +operator>(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day_last& ymdl) +{ + return os << ymdl.year() << '/' << ymdl.month_day_last(); +} + +CONSTCD14 +inline +year_month_day_last +operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT +{ + return (ymdl.year() / ymdl.month() + dm) / last; +} + +CONSTCD14 +inline +year_month_day_last +operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT +{ + return ymdl + dm; +} + +CONSTCD14 +inline +year_month_day_last +operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT +{ + return ymdl + (-dm); +} + +CONSTCD11 +inline +year_month_day_last +operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT +{ + return {ymdl.year()+dy, ymdl.month_day_last()}; +} + +CONSTCD11 +inline +year_month_day_last +operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT +{ + return ymdl + dy; +} + +CONSTCD11 +inline +year_month_day_last +operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT +{ + return ymdl + (-dy); +} + +// year_month_day + +CONSTCD11 +inline +year_month_day::year_month_day(const islamic::year& y, const islamic::month& m, + const islamic::day& d) NOEXCEPT + : y_(y) + , m_(m) + , d_(d) + {} + +CONSTCD14 +inline +year_month_day::year_month_day(const year_month_day_last& ymdl) NOEXCEPT + : y_(ymdl.year()) + , m_(ymdl.month()) + , d_(ymdl.day()) + {} + +CONSTCD14 +inline +year_month_day::year_month_day(sys_days dp) NOEXCEPT + : year_month_day(from_days(dp.time_since_epoch())) + {} + +CONSTCD14 +inline +year_month_day::year_month_day(local_days dp) NOEXCEPT + : year_month_day(from_days(dp.time_since_epoch())) + {} + +CONSTCD11 inline year year_month_day::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_day::month() const NOEXCEPT {return m_;} +CONSTCD11 inline day year_month_day::day() const NOEXCEPT {return d_;} + +CONSTCD14 +inline +year_month_day& +year_month_day::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +year_month_day& +year_month_day::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_day& +year_month_day::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_day& +year_month_day::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD14 +inline +days +year_month_day::to_days() const NOEXCEPT +{ + static_assert(std::numeric_limits::digits >= 18, + "This algorithm has not been ported to a 16 bit unsigned integer"); + static_assert(std::numeric_limits::digits >= 20, + "This algorithm has not been ported to a 16 bit signed integer"); + auto const y = static_cast(y_) - 1; + auto const m = static_cast(m_); + auto const d = static_cast(d_); + auto const era = (y >= 0 ? y : y-29) / 30; + auto const yoe = static_cast(y - era * 30); // [0, 29] + auto const doy = 29*(m-1) + m/2 + d-1; // [0, 354] + auto const doe = yoe * 354 + (11*(yoe+1)+3)/30 + doy; // [0, 10630] + return days{era * 10631 + static_cast(doe) - 492148}; +} + +CONSTCD14 +inline +year_month_day::operator sys_days() const NOEXCEPT +{ + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_day::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; +} + +CONSTCD14 +inline +bool +year_month_day::ok() const NOEXCEPT +{ + if (!(y_.ok() && m_.ok())) + return false; + return 1_d <= d_ && d_ <= (y_/m_/last).day(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month() && x.day() == y.day(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (x.month() < y.month() ? true + : (x.month() > y.month() ? false + : (x.day() < y.day())))); +} + +CONSTCD11 +inline +bool +operator>(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day& ymd) +{ + date::detail::save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os << ymd.year() << '-'; + os.width(2); + os << static_cast(ymd.month()) << '-'; + os << ymd.day(); + return os; +} + +CONSTCD14 +inline +year_month_day +year_month_day::from_days(days dp) NOEXCEPT +{ + static_assert(std::numeric_limits::digits >= 18, + "This algorithm has not been ported to a 16 bit unsigned integer"); + static_assert(std::numeric_limits::digits >= 20, + "This algorithm has not been ported to a 16 bit signed integer"); + auto const z = dp.count() + 492148; + auto const era = (z >= 0 ? z : z - 10630) / 10631; + auto const doe = static_cast(z - era * 10631); // [0, 10630] + auto const yoe = (30*doe + 10646)/10631 - 1; // [0, 29] + auto const y = static_cast(yoe) + era * 30 + 1; + auto const doy = doe - (yoe * 354 + (11*(yoe+1)+3)/30); // [0, 354] + auto const m = (11*doy + 330) / 325; // [1, 12] + auto const d = doy - (29*(m-1) + m/2) + 1; // [1, 30] + return year_month_day{islamic::year{y}, islamic::month(m), islamic::day(d)}; +} + +CONSTCD14 +inline +year_month_day +operator+(const year_month_day& ymd, const months& dm) NOEXCEPT +{ + return (ymd.year() / ymd.month() + dm) / ymd.day(); +} + +CONSTCD14 +inline +year_month_day +operator+(const months& dm, const year_month_day& ymd) NOEXCEPT +{ + return ymd + dm; +} + +CONSTCD14 +inline +year_month_day +operator-(const year_month_day& ymd, const months& dm) NOEXCEPT +{ + return ymd + (-dm); +} + +CONSTCD11 +inline +year_month_day +operator+(const year_month_day& ymd, const years& dy) NOEXCEPT +{ + return (ymd.year() + dy) / ymd.month() / ymd.day(); +} + +CONSTCD11 +inline +year_month_day +operator+(const years& dy, const year_month_day& ymd) NOEXCEPT +{ + return ymd + dy; +} + +CONSTCD11 +inline +year_month_day +operator-(const year_month_day& ymd, const years& dy) NOEXCEPT +{ + return ymd + (-dy); +} + +// year_month_weekday + +CONSTCD11 +inline +year_month_weekday::year_month_weekday(const islamic::year& y, const islamic::month& m, + const islamic::weekday_indexed& wdi) + NOEXCEPT + : y_(y) + , m_(m) + , wdi_(wdi) + {} + +CONSTCD14 +inline +year_month_weekday::year_month_weekday(const sys_days& dp) NOEXCEPT + : year_month_weekday(from_days(dp.time_since_epoch())) + {} + +CONSTCD14 +inline +year_month_weekday::year_month_weekday(const local_days& dp) NOEXCEPT + : year_month_weekday(from_days(dp.time_since_epoch())) + {} + +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline year year_month_weekday::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_weekday::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday +year_month_weekday::weekday() const NOEXCEPT +{ + return wdi_.weekday(); +} + +CONSTCD11 +inline +unsigned +year_month_weekday::index() const NOEXCEPT +{ + return wdi_.index(); +} + +CONSTCD11 +inline +weekday_indexed +year_month_weekday::weekday_indexed() const NOEXCEPT +{ + return wdi_; +} + +CONSTCD14 +inline +year_month_weekday::operator sys_days() const NOEXCEPT +{ + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_weekday::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; +} + +CONSTCD14 +inline +bool +year_month_weekday::ok() const NOEXCEPT +{ + if (!y_.ok() || !m_.ok() || !wdi_.weekday().ok() || wdi_.index() < 1) + return false; + if (wdi_.index() <= 4) + return true; + auto d2 = wdi_.weekday() - islamic::weekday(y_/m_/1) + days((wdi_.index()-1)*7 + 1); + return static_cast(d2.count()) <= static_cast((y_/m_/last).day()); +} + +CONSTCD14 +inline +year_month_weekday +year_month_weekday::from_days(days d) NOEXCEPT +{ + sys_days dp{d}; + auto const wd = islamic::weekday(dp); + auto const ymd = year_month_day(dp); + return {ymd.year(), ymd.month(), wd[(static_cast(ymd.day())-1)/7+1]}; +} + +CONSTCD14 +inline +days +year_month_weekday::to_days() const NOEXCEPT +{ + auto d = sys_days(y_/m_/1); + return (d + (wdi_.weekday() - islamic::weekday(d) + days{(wdi_.index()-1)*7}) + ).time_since_epoch(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month() && + x.weekday_indexed() == y.weekday_indexed(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday& ymwdi) +{ + return os << ymwdi.year() << '/' << ymwdi.month() + << '/' << ymwdi.weekday_indexed(); +} + +CONSTCD14 +inline +year_month_weekday +operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT +{ + return (ymwd.year() / ymwd.month() + dm) / ymwd.weekday_indexed(); +} + +CONSTCD14 +inline +year_month_weekday +operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT +{ + return ymwd + dm; +} + +CONSTCD14 +inline +year_month_weekday +operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT +{ + return ymwd + (-dm); +} + +CONSTCD11 +inline +year_month_weekday +operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT +{ + return {ymwd.year()+dy, ymwd.month(), ymwd.weekday_indexed()}; +} + +CONSTCD11 +inline +year_month_weekday +operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT +{ + return ymwd + dy; +} + +CONSTCD11 +inline +year_month_weekday +operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT +{ + return ymwd + (-dy); +} + +// year_month_weekday_last + +CONSTCD11 +inline +year_month_weekday_last::year_month_weekday_last(const islamic::year& y, + const islamic::month& m, + const islamic::weekday_last& wdl) NOEXCEPT + : y_(y) + , m_(m) + , wdl_(wdl) + {} + +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline year year_month_weekday_last::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_weekday_last::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday +year_month_weekday_last::weekday() const NOEXCEPT +{ + return wdl_.weekday(); +} + +CONSTCD11 +inline +weekday_last +year_month_weekday_last::weekday_last() const NOEXCEPT +{ + return wdl_; +} + +CONSTCD14 +inline +year_month_weekday_last::operator sys_days() const NOEXCEPT +{ + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_weekday_last::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; +} + +CONSTCD11 +inline +bool +year_month_weekday_last::ok() const NOEXCEPT +{ + return y_.ok() && m_.ok() && wdl_.ok(); +} + +CONSTCD14 +inline +days +year_month_weekday_last::to_days() const NOEXCEPT +{ + auto const d = sys_days(y_/m_/last); + return (d - (islamic::weekday{d} - wdl_.weekday())).time_since_epoch(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month() && + x.weekday_last() == y.weekday_last(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday_last& ymwdl) +{ + return os << ymwdl.year() << '/' << ymwdl.month() << '/' << ymwdl.weekday_last(); +} + +CONSTCD14 +inline +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT +{ + return (ymwdl.year() / ymwdl.month() + dm) / ymwdl.weekday_last(); +} + +CONSTCD14 +inline +year_month_weekday_last +operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT +{ + return ymwdl + dm; +} + +CONSTCD14 +inline +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT +{ + return ymwdl + (-dm); +} + +CONSTCD11 +inline +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT +{ + return {ymwdl.year()+dy, ymwdl.month(), ymwdl.weekday_last()}; +} + +CONSTCD11 +inline +year_month_weekday_last +operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT +{ + return ymwdl + dy; +} + +CONSTCD11 +inline +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT +{ + return ymwdl + (-dy); +} + +// year_month from operator/() + +CONSTCD11 +inline +year_month +operator/(const year& y, const month& m) NOEXCEPT +{ + return {y, m}; +} + +CONSTCD11 +inline +year_month +operator/(const year& y, int m) NOEXCEPT +{ + return y / month(static_cast(m)); +} + +// month_day from operator/() + +CONSTCD11 +inline +month_day +operator/(const month& m, const day& d) NOEXCEPT +{ + return {m, d}; +} + +CONSTCD11 +inline +month_day +operator/(const day& d, const month& m) NOEXCEPT +{ + return m / d; +} + +CONSTCD11 +inline +month_day +operator/(const month& m, int d) NOEXCEPT +{ + return m / day(static_cast(d)); +} + +CONSTCD11 +inline +month_day +operator/(int m, const day& d) NOEXCEPT +{ + return month(static_cast(m)) / d; +} + +CONSTCD11 inline month_day operator/(const day& d, int m) NOEXCEPT {return m / d;} + +// month_day_last from operator/() + +CONSTCD11 +inline +month_day_last +operator/(const month& m, last_spec) NOEXCEPT +{ + return month_day_last{m}; +} + +CONSTCD11 +inline +month_day_last +operator/(last_spec, const month& m) NOEXCEPT +{ + return m/last; +} + +CONSTCD11 +inline +month_day_last +operator/(int m, last_spec) NOEXCEPT +{ + return month(static_cast(m))/last; +} + +CONSTCD11 +inline +month_day_last +operator/(last_spec, int m) NOEXCEPT +{ + return m/last; +} + +// month_weekday from operator/() + +CONSTCD11 +inline +month_weekday +operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT +{ + return {m, wdi}; +} + +CONSTCD11 +inline +month_weekday +operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT +{ + return m / wdi; +} + +CONSTCD11 +inline +month_weekday +operator/(int m, const weekday_indexed& wdi) NOEXCEPT +{ + return month(static_cast(m)) / wdi; +} + +CONSTCD11 +inline +month_weekday +operator/(const weekday_indexed& wdi, int m) NOEXCEPT +{ + return m / wdi; +} + +// month_weekday_last from operator/() + +CONSTCD11 +inline +month_weekday_last +operator/(const month& m, const weekday_last& wdl) NOEXCEPT +{ + return {m, wdl}; +} + +CONSTCD11 +inline +month_weekday_last +operator/(const weekday_last& wdl, const month& m) NOEXCEPT +{ + return m / wdl; +} + +CONSTCD11 +inline +month_weekday_last +operator/(int m, const weekday_last& wdl) NOEXCEPT +{ + return month(static_cast(m)) / wdl; +} + +CONSTCD11 +inline +month_weekday_last +operator/(const weekday_last& wdl, int m) NOEXCEPT +{ + return m / wdl; +} + +// year_month_day from operator/() + +CONSTCD11 +inline +year_month_day +operator/(const year_month& ym, const day& d) NOEXCEPT +{ + return {ym.year(), ym.month(), d}; +} + +CONSTCD11 +inline +year_month_day +operator/(const year_month& ym, int d) NOEXCEPT +{ + return ym / day(static_cast(d)); +} + +CONSTCD11 +inline +year_month_day +operator/(const year& y, const month_day& md) NOEXCEPT +{ + return y / md.month() / md.day(); +} + +CONSTCD11 +inline +year_month_day +operator/(int y, const month_day& md) NOEXCEPT +{ + return year(y) / md; +} + +CONSTCD11 +inline +year_month_day +operator/(const month_day& md, const year& y) NOEXCEPT +{ + return y / md; +} + +CONSTCD11 +inline +year_month_day +operator/(const month_day& md, int y) NOEXCEPT +{ + return year(y) / md; +} + +// year_month_day_last from operator/() + +CONSTCD11 +inline +year_month_day_last +operator/(const year_month& ym, last_spec) NOEXCEPT +{ + return {ym.year(), month_day_last{ym.month()}}; +} + +CONSTCD11 +inline +year_month_day_last +operator/(const year& y, const month_day_last& mdl) NOEXCEPT +{ + return {y, mdl}; +} + +CONSTCD11 +inline +year_month_day_last +operator/(int y, const month_day_last& mdl) NOEXCEPT +{ + return year(y) / mdl; +} + +CONSTCD11 +inline +year_month_day_last +operator/(const month_day_last& mdl, const year& y) NOEXCEPT +{ + return y / mdl; +} + +CONSTCD11 +inline +year_month_day_last +operator/(const month_day_last& mdl, int y) NOEXCEPT +{ + return year(y) / mdl; +} + +// year_month_weekday from operator/() + +CONSTCD11 +inline +year_month_weekday +operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT +{ + return {ym.year(), ym.month(), wdi}; +} + +CONSTCD11 +inline +year_month_weekday +operator/(const year& y, const month_weekday& mwd) NOEXCEPT +{ + return {y, mwd.month(), mwd.weekday_indexed()}; +} + +CONSTCD11 +inline +year_month_weekday +operator/(int y, const month_weekday& mwd) NOEXCEPT +{ + return year(y) / mwd; +} + +CONSTCD11 +inline +year_month_weekday +operator/(const month_weekday& mwd, const year& y) NOEXCEPT +{ + return y / mwd; +} + +CONSTCD11 +inline +year_month_weekday +operator/(const month_weekday& mwd, int y) NOEXCEPT +{ + return year(y) / mwd; +} + +// year_month_weekday_last from operator/() + +CONSTCD11 +inline +year_month_weekday_last +operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT +{ + return {ym.year(), ym.month(), wdl}; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT +{ + return {y, mwdl.month(), mwdl.weekday_last()}; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(int y, const month_weekday_last& mwdl) NOEXCEPT +{ + return year(y) / mwdl; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT +{ + return y / mwdl; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(const month_weekday_last& mwdl, int y) NOEXCEPT +{ + return year(y) / mwdl; +} + +} // namespace islamic + +#endif // ISLAMIC_H diff --git a/vendor/date/iso_week.h b/vendor/date/iso_week.h new file mode 100644 index 000000000..de6ea393a --- /dev/null +++ b/vendor/date/iso_week.h @@ -0,0 +1,1761 @@ +#ifndef ISO_WEEK_H +#define ISO_WEEK_H + +// The MIT License (MIT) +// +// Copyright (c) 2015, 2016, 2017 Howard Hinnant +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include "date.h" + +#include + +namespace iso_week +{ + +// y/wn/wd +// wn/wd/y +// wd/wn/y + +using days = date::days; +using weeks = date::weeks; +using years = date::years; + +// time_point + +using sys_days = date::sys_days; +using local_days = date::local_days; + +// types + +struct last_week +{ + explicit last_week() = default; +}; + +class weekday; +class weeknum; +class year; + +class year_weeknum; +class year_lastweek; +class weeknum_weekday; +class lastweek_weekday; + +class year_weeknum_weekday; +class year_lastweek_weekday; + +// date composition operators + +CONSTCD11 year_weeknum operator/(const year& y, const weeknum& wn) NOEXCEPT; +CONSTCD11 year_weeknum operator/(const year& y, int wn) NOEXCEPT; + +CONSTCD11 year_lastweek operator/(const year& y, last_week wn) NOEXCEPT; + +CONSTCD11 weeknum_weekday operator/(const weeknum& wn, const weekday& wd) NOEXCEPT; +CONSTCD11 weeknum_weekday operator/(const weeknum& wn, int wd) NOEXCEPT; +CONSTCD11 weeknum_weekday operator/(const weekday& wd, const weeknum& wn) NOEXCEPT; +CONSTCD11 weeknum_weekday operator/(const weekday& wd, int wn) NOEXCEPT; + +CONSTCD11 lastweek_weekday operator/(const last_week& wn, const weekday& wd) NOEXCEPT; +CONSTCD11 lastweek_weekday operator/(const last_week& wn, int wd) NOEXCEPT; +CONSTCD11 lastweek_weekday operator/(const weekday& wd, const last_week& wn) NOEXCEPT; + +CONSTCD11 year_weeknum_weekday operator/(const year_weeknum& ywn, const weekday& wd) NOEXCEPT; +CONSTCD11 year_weeknum_weekday operator/(const year_weeknum& ywn, int wd) NOEXCEPT; +CONSTCD11 year_weeknum_weekday operator/(const weeknum_weekday& wnwd, const year& y) NOEXCEPT; +CONSTCD11 year_weeknum_weekday operator/(const weeknum_weekday& wnwd, int y) NOEXCEPT; + +CONSTCD11 year_lastweek_weekday operator/(const year_lastweek& ylw, const weekday& wd) NOEXCEPT; +CONSTCD11 year_lastweek_weekday operator/(const year_lastweek& ylw, int wd) NOEXCEPT; + +CONSTCD11 year_lastweek_weekday operator/(const lastweek_weekday& lwwd, const year& y) NOEXCEPT; +CONSTCD11 year_lastweek_weekday operator/(const lastweek_weekday& lwwd, int y) NOEXCEPT; + +// weekday + +class weekday +{ + unsigned char wd_; +public: + explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT; + CONSTCD11 weekday(date::weekday wd) NOEXCEPT; + explicit weekday(int) = delete; + CONSTCD11 weekday(const sys_days& dp) NOEXCEPT; + CONSTCD11 explicit weekday(const local_days& dp) NOEXCEPT; + + weekday& operator++() NOEXCEPT; + weekday operator++(int) NOEXCEPT; + weekday& operator--() NOEXCEPT; + weekday operator--(int) NOEXCEPT; + + weekday& operator+=(const days& d) NOEXCEPT; + weekday& operator-=(const days& d) NOEXCEPT; + + CONSTCD11 explicit operator unsigned() const NOEXCEPT; + CONSTCD11 operator date::weekday() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; + +private: + static CONSTCD11 unsigned char weekday_from_days(int z) NOEXCEPT; + static CONSTCD11 unsigned char to_iso_encoding(unsigned char) NOEXCEPT; + static CONSTCD11 unsigned from_iso_encoding(unsigned) NOEXCEPT; +}; + +CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weekday& x, const weekday& y) NOEXCEPT; + +CONSTCD14 weekday operator+(const weekday& x, const days& y) NOEXCEPT; +CONSTCD14 weekday operator+(const days& x, const weekday& y) NOEXCEPT; +CONSTCD14 weekday operator-(const weekday& x, const days& y) NOEXCEPT; +CONSTCD14 days operator-(const weekday& x, const weekday& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday& wd); + +// year + +class year +{ + short y_; + +public: + explicit CONSTCD11 year(int y) NOEXCEPT; + + year& operator++() NOEXCEPT; + year operator++(int) NOEXCEPT; + year& operator--() NOEXCEPT; + year operator--(int) NOEXCEPT; + + year& operator+=(const years& y) NOEXCEPT; + year& operator-=(const years& y) NOEXCEPT; + + CONSTCD14 bool is_leap() const NOEXCEPT; + + CONSTCD11 explicit operator int() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; + + static CONSTCD11 year min() NOEXCEPT; + static CONSTCD11 year max() NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator< (const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator> (const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year& x, const year& y) NOEXCEPT; + +CONSTCD11 year operator+(const year& x, const years& y) NOEXCEPT; +CONSTCD11 year operator+(const years& x, const year& y) NOEXCEPT; +CONSTCD11 year operator-(const year& x, const years& y) NOEXCEPT; +CONSTCD11 years operator-(const year& x, const year& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year& y); + +// weeknum + +class weeknum +{ + unsigned char wn_; + +public: + explicit CONSTCD11 weeknum(unsigned wn) NOEXCEPT; + + weeknum& operator++() NOEXCEPT; + weeknum operator++(int) NOEXCEPT; + weeknum& operator--() NOEXCEPT; + weeknum operator--(int) NOEXCEPT; + + weeknum& operator+=(const weeks& y) NOEXCEPT; + weeknum& operator-=(const weeks& y) NOEXCEPT; + + CONSTCD11 explicit operator unsigned() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const weeknum& x, const weeknum& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weeknum& x, const weeknum& y) NOEXCEPT; +CONSTCD11 bool operator< (const weeknum& x, const weeknum& y) NOEXCEPT; +CONSTCD11 bool operator> (const weeknum& x, const weeknum& y) NOEXCEPT; +CONSTCD11 bool operator<=(const weeknum& x, const weeknum& y) NOEXCEPT; +CONSTCD11 bool operator>=(const weeknum& x, const weeknum& y) NOEXCEPT; + +CONSTCD11 weeknum operator+(const weeknum& x, const weeks& y) NOEXCEPT; +CONSTCD11 weeknum operator+(const weeks& x, const weeknum& y) NOEXCEPT; +CONSTCD11 weeknum operator-(const weeknum& x, const weeks& y) NOEXCEPT; +CONSTCD11 weeks operator-(const weeknum& x, const weeknum& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weeknum& wn); + +// year_weeknum + +class year_weeknum +{ + iso_week::year y_; + iso_week::weeknum wn_; + +public: + CONSTCD11 year_weeknum(const iso_week::year& y, const iso_week::weeknum& wn) NOEXCEPT; + + CONSTCD11 iso_week::year year() const NOEXCEPT; + CONSTCD11 iso_week::weeknum weeknum() const NOEXCEPT; + + year_weeknum& operator+=(const years& dy) NOEXCEPT; + year_weeknum& operator-=(const years& dy) NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year_weeknum& x, const year_weeknum& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT; +CONSTCD11 bool operator< (const year_weeknum& x, const year_weeknum& y) NOEXCEPT; +CONSTCD11 bool operator> (const year_weeknum& x, const year_weeknum& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT; + +CONSTCD11 year_weeknum operator+(const year_weeknum& ym, const years& dy) NOEXCEPT; +CONSTCD11 year_weeknum operator+(const years& dy, const year_weeknum& ym) NOEXCEPT; +CONSTCD11 year_weeknum operator-(const year_weeknum& ym, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_weeknum& ym); + +// year_lastweek + +class year_lastweek +{ + iso_week::year y_; + +public: + CONSTCD11 explicit year_lastweek(const iso_week::year& y) NOEXCEPT; + + CONSTCD11 iso_week::year year() const NOEXCEPT; + CONSTCD14 iso_week::weeknum weeknum() const NOEXCEPT; + + year_lastweek& operator+=(const years& dy) NOEXCEPT; + year_lastweek& operator-=(const years& dy) NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year_lastweek& x, const year_lastweek& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT; +CONSTCD11 bool operator< (const year_lastweek& x, const year_lastweek& y) NOEXCEPT; +CONSTCD11 bool operator> (const year_lastweek& x, const year_lastweek& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT; + +CONSTCD11 year_lastweek operator+(const year_lastweek& ym, const years& dy) NOEXCEPT; +CONSTCD11 year_lastweek operator+(const years& dy, const year_lastweek& ym) NOEXCEPT; +CONSTCD11 year_lastweek operator-(const year_lastweek& ym, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_lastweek& ym); + +// weeknum_weekday + +class weeknum_weekday +{ + iso_week::weeknum wn_; + iso_week::weekday wd_; + +public: + CONSTCD11 weeknum_weekday(const iso_week::weeknum& wn, + const iso_week::weekday& wd) NOEXCEPT; + + CONSTCD11 iso_week::weeknum weeknum() const NOEXCEPT; + CONSTCD11 iso_week::weekday weekday() const NOEXCEPT; + + CONSTCD14 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT; +CONSTCD11 bool operator< (const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT; +CONSTCD11 bool operator> (const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT; +CONSTCD11 bool operator<=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT; +CONSTCD11 bool operator>=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weeknum_weekday& md); + +// lastweek_weekday + +class lastweek_weekday +{ + iso_week::weekday wd_; + +public: + CONSTCD11 explicit lastweek_weekday(const iso_week::weekday& wd) NOEXCEPT; + + CONSTCD11 iso_week::weekday weekday() const NOEXCEPT; + + CONSTCD14 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT; +CONSTCD11 bool operator!=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT; +CONSTCD11 bool operator< (const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT; +CONSTCD11 bool operator> (const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT; +CONSTCD11 bool operator<=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT; +CONSTCD11 bool operator>=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const lastweek_weekday& md); + +// year_lastweek_weekday + +class year_lastweek_weekday +{ + iso_week::year y_; + iso_week::weekday wd_; + +public: + CONSTCD11 year_lastweek_weekday(const iso_week::year& y, + const iso_week::weekday& wd) NOEXCEPT; + + year_lastweek_weekday& operator+=(const years& y) NOEXCEPT; + year_lastweek_weekday& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 iso_week::year year() const NOEXCEPT; + CONSTCD14 iso_week::weeknum weeknum() const NOEXCEPT; + CONSTCD11 iso_week::weekday weekday() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT; +CONSTCD11 bool operator< (const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT; +CONSTCD11 bool operator> (const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT; + +CONSTCD11 year_lastweek_weekday operator+(const year_lastweek_weekday& ywnwd, const years& y) NOEXCEPT; +CONSTCD11 year_lastweek_weekday operator+(const years& y, const year_lastweek_weekday& ywnwd) NOEXCEPT; +CONSTCD11 year_lastweek_weekday operator-(const year_lastweek_weekday& ywnwd, const years& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_lastweek_weekday& ywnwd); + +// class year_weeknum_weekday + +class year_weeknum_weekday +{ + iso_week::year y_; + iso_week::weeknum wn_; + iso_week::weekday wd_; + +public: + CONSTCD11 year_weeknum_weekday(const iso_week::year& y, const iso_week::weeknum& wn, + const iso_week::weekday& wd) NOEXCEPT; + CONSTCD14 year_weeknum_weekday(const year_lastweek_weekday& ylwwd) NOEXCEPT; + CONSTCD14 year_weeknum_weekday(const sys_days& dp) NOEXCEPT; + CONSTCD14 explicit year_weeknum_weekday(const local_days& dp) NOEXCEPT; + + year_weeknum_weekday& operator+=(const years& y) NOEXCEPT; + year_weeknum_weekday& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 iso_week::year year() const NOEXCEPT; + CONSTCD11 iso_week::weeknum weeknum() const NOEXCEPT; + CONSTCD11 iso_week::weekday weekday() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD14 bool ok() const NOEXCEPT; + +private: + static CONSTCD14 year_weeknum_weekday from_days(days dp) NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT; +CONSTCD11 bool operator< (const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT; +CONSTCD11 bool operator> (const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT; + +CONSTCD11 year_weeknum_weekday operator+(const year_weeknum_weekday& ywnwd, const years& y) NOEXCEPT; +CONSTCD11 year_weeknum_weekday operator+(const years& y, const year_weeknum_weekday& ywnwd) NOEXCEPT; +CONSTCD11 year_weeknum_weekday operator-(const year_weeknum_weekday& ywnwd, const years& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_weeknum_weekday& ywnwd); + +//----------------+ +// Implementation | +//----------------+ + +// weekday + +CONSTCD11 +inline +unsigned char +weekday::to_iso_encoding(unsigned char z) NOEXCEPT +{ + return z != 0 ? z : (unsigned char)7; +} + +CONSTCD11 +inline +unsigned +weekday::from_iso_encoding(unsigned z) NOEXCEPT +{ + return z != 7 ? z : 0u; +} + +CONSTCD11 +inline +unsigned char +weekday::weekday_from_days(int z) NOEXCEPT +{ + return to_iso_encoding(static_cast(static_cast( + z >= -4 ? (z+4) % 7 : (z+5) % 7 + 6))); +} + +CONSTCD11 +inline +weekday::weekday(unsigned wd) NOEXCEPT + : wd_(static_cast(wd)) + {} + +CONSTCD11 +inline +weekday::weekday(date::weekday wd) NOEXCEPT + : wd_(wd.iso_encoding()) + {} + +CONSTCD11 +inline +weekday::weekday(const sys_days& dp) NOEXCEPT + : wd_(weekday_from_days(dp.time_since_epoch().count())) + {} + +CONSTCD11 +inline +weekday::weekday(const local_days& dp) NOEXCEPT + : wd_(weekday_from_days(dp.time_since_epoch().count())) + {} + +inline weekday& weekday::operator++() NOEXCEPT {if (++wd_ == 8) wd_ = 1; return *this;} +inline weekday weekday::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +inline weekday& weekday::operator--() NOEXCEPT {if (wd_-- == 1) wd_ = 7; return *this;} +inline weekday weekday::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} + +inline +weekday& +weekday::operator+=(const days& d) NOEXCEPT +{ + *this = *this + d; + return *this; +} + +inline +weekday& +weekday::operator-=(const days& d) NOEXCEPT +{ + *this = *this - d; + return *this; +} + +CONSTCD11 +inline +weekday::operator unsigned() const NOEXCEPT +{ + return wd_; +} + +CONSTCD11 +inline +weekday::operator date::weekday() const NOEXCEPT +{ + return date::weekday{from_iso_encoding(unsigned{wd_})}; +} + +CONSTCD11 inline bool weekday::ok() const NOEXCEPT {return 1 <= wd_ && wd_ <= 7;} + +CONSTCD11 +inline +bool +operator==(const weekday& x, const weekday& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const weekday& x, const weekday& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD14 +inline +days +operator-(const weekday& x, const weekday& y) NOEXCEPT +{ + auto const diff = static_cast(x) - static_cast(y); + return days{diff <= 6 ? diff : diff + 7}; +} + +CONSTCD14 +inline +weekday +operator+(const weekday& x, const days& y) NOEXCEPT +{ + auto const wdu = static_cast(static_cast(x) - 1u) + y.count(); + auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7; + return weekday{static_cast(wdu - wk * 7) + 1u}; +} + +CONSTCD14 +inline +weekday +operator+(const days& x, const weekday& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD14 +inline +weekday +operator-(const weekday& x, const days& y) NOEXCEPT +{ + return x + -y; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday& wd) +{ + switch (static_cast(wd)) + { + case 7: + os << "Sun"; + break; + case 1: + os << "Mon"; + break; + case 2: + os << "Tue"; + break; + case 3: + os << "Wed"; + break; + case 4: + os << "Thu"; + break; + case 5: + os << "Fri"; + break; + case 6: + os << "Sat"; + break; + default: + os << static_cast(wd) << " is not a valid weekday"; + break; + } + return os; +} + +// year + +CONSTCD11 inline year::year(int y) NOEXCEPT : y_(static_cast(y)) {} +inline year& year::operator++() NOEXCEPT {++y_; return *this;} +inline year year::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +inline year& year::operator--() NOEXCEPT {--y_; return *this;} +inline year year::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} +inline year& year::operator+=(const years& y) NOEXCEPT {*this = *this + y; return *this;} +inline year& year::operator-=(const years& y) NOEXCEPT {*this = *this - y; return *this;} + +CONSTCD14 +inline +bool +year::is_leap() const NOEXCEPT +{ + const auto y = date::year{static_cast(y_)}; + const auto s0 = sys_days((y-years{1})/12/date::thu[date::last]); + const auto s1 = sys_days(y/12/date::thu[date::last]); + return s1-s0 != days{7*52}; +} + +CONSTCD11 inline year::operator int() const NOEXCEPT {return y_;} +CONSTCD11 inline bool year::ok() const NOEXCEPT {return min() <= *this && *this <= max();} + +CONSTCD11 +inline +year +year::min() NOEXCEPT +{ + using std::chrono::seconds; + using std::chrono::minutes; + using std::chrono::hours; + using std::chrono::duration_cast; + static_assert(sizeof(seconds)*CHAR_BIT >= 41, "seconds may overflow"); + static_assert(sizeof(hours)*CHAR_BIT >= 30, "hours may overflow"); + return sizeof(minutes)*CHAR_BIT < 34 ? + year{1970} + duration_cast(minutes::min()) : + year{std::numeric_limits::min()}; +} + +CONSTCD11 +inline +year +year::max() NOEXCEPT +{ + using std::chrono::seconds; + using std::chrono::minutes; + using std::chrono::hours; + using std::chrono::duration_cast; + static_assert(sizeof(seconds)*CHAR_BIT >= 41, "seconds may overflow"); + static_assert(sizeof(hours)*CHAR_BIT >= 30, "hours may overflow"); + return sizeof(minutes)*CHAR_BIT < 34 ? + year{1969} + duration_cast(minutes::max()) : + year{std::numeric_limits::max()}; +} + +CONSTCD11 +inline +bool +operator==(const year& x, const year& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const year& x, const year& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year& x, const year& y) NOEXCEPT +{ + return static_cast(x) < static_cast(y); +} + +CONSTCD11 +inline +bool +operator>(const year& x, const year& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year& x, const year& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year& x, const year& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD11 +inline +years +operator-(const year& x, const year& y) NOEXCEPT +{ + return years{static_cast(x) - static_cast(y)}; +} + +CONSTCD11 +inline +year +operator+(const year& x, const years& y) NOEXCEPT +{ + return year{static_cast(x) + y.count()}; +} + +CONSTCD11 +inline +year +operator+(const years& x, const year& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD11 +inline +year +operator-(const year& x, const years& y) NOEXCEPT +{ + return year{static_cast(x) - y.count()}; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year& y) +{ + date::detail::save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::internal); + os.width(4 + (y < year{0})); + os << static_cast(y); + return os; +} + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +inline namespace literals +{ + +CONSTCD11 +inline +iso_week::year +operator ""_y(unsigned long long y) NOEXCEPT +{ + return iso_week::year(static_cast(y)); +} + +CONSTCD11 +inline +iso_week::weeknum +operator ""_w(unsigned long long wn) NOEXCEPT +{ + return iso_week::weeknum(static_cast(wn)); +} + +#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900) + +CONSTDATA iso_week::last_week last{}; + +CONSTDATA iso_week::weekday sun{7u}; +CONSTDATA iso_week::weekday mon{1u}; +CONSTDATA iso_week::weekday tue{2u}; +CONSTDATA iso_week::weekday wed{3u}; +CONSTDATA iso_week::weekday thu{4u}; +CONSTDATA iso_week::weekday fri{5u}; +CONSTDATA iso_week::weekday sat{6u}; + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +} // inline namespace literals +#endif + +// weeknum + +CONSTCD11 +inline +weeknum::weeknum(unsigned wn) NOEXCEPT + : wn_(static_cast(wn)) + {} + +inline weeknum& weeknum::operator++() NOEXCEPT {++wn_; return *this;} +inline weeknum weeknum::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +inline weeknum& weeknum::operator--() NOEXCEPT {--wn_; return *this;} +inline weeknum weeknum::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} + +inline +weeknum& +weeknum::operator+=(const weeks& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +inline +weeknum& +weeknum::operator-=(const weeks& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline weeknum::operator unsigned() const NOEXCEPT {return wn_;} +CONSTCD11 inline bool weeknum::ok() const NOEXCEPT {return 1 <= wn_ && wn_ <= 53;} + +CONSTCD11 +inline +bool +operator==(const weeknum& x, const weeknum& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const weeknum& x, const weeknum& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const weeknum& x, const weeknum& y) NOEXCEPT +{ + return static_cast(x) < static_cast(y); +} + +CONSTCD11 +inline +bool +operator>(const weeknum& x, const weeknum& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const weeknum& x, const weeknum& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const weeknum& x, const weeknum& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD11 +inline +weeks +operator-(const weeknum& x, const weeknum& y) NOEXCEPT +{ + return weeks{static_cast(static_cast(x)) - + static_cast(static_cast(y))}; +} + +CONSTCD11 +inline +weeknum +operator+(const weeknum& x, const weeks& y) NOEXCEPT +{ + return weeknum{static_cast(x) + static_cast(y.count())}; +} + +CONSTCD11 +inline +weeknum +operator+(const weeks& x, const weeknum& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD11 +inline +weeknum +operator-(const weeknum& x, const weeks& y) NOEXCEPT +{ + return x + -y; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weeknum& wn) +{ + date::detail::save_ostream _(os); + os << 'W'; + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os.width(2); + os << static_cast(wn); + return os; +} + +// year_weeknum + +CONSTCD11 +inline +year_weeknum::year_weeknum(const iso_week::year& y, const iso_week::weeknum& wn) NOEXCEPT + : y_(y) + , wn_(wn) + {} + +CONSTCD11 inline year year_weeknum::year() const NOEXCEPT {return y_;} +CONSTCD11 inline weeknum year_weeknum::weeknum() const NOEXCEPT {return wn_;} +CONSTCD11 inline bool year_weeknum::ok() const NOEXCEPT +{ + return y_.ok() && 1u <= static_cast(wn_) && wn_ <= (y_/last).weeknum(); +} + +inline +year_weeknum& +year_weeknum::operator+=(const years& dy) NOEXCEPT +{ + *this = *this + dy; + return *this; +} + +inline +year_weeknum& +year_weeknum::operator-=(const years& dy) NOEXCEPT +{ + *this = *this - dy; + return *this; +} + +CONSTCD11 +inline +bool +operator==(const year_weeknum& x, const year_weeknum& y) NOEXCEPT +{ + return x.year() == y.year() && x.weeknum() == y.weeknum(); +} + +CONSTCD11 +inline +bool +operator!=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_weeknum& x, const year_weeknum& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (x.weeknum() < y.weeknum())); +} + +CONSTCD11 +inline +bool +operator>(const year_weeknum& x, const year_weeknum& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_weeknum& x, const year_weeknum& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD11 +inline +year_weeknum +operator+(const year_weeknum& ym, const years& dy) NOEXCEPT +{ + return (ym.year() + dy) / ym.weeknum(); +} + +CONSTCD11 +inline +year_weeknum +operator+(const years& dy, const year_weeknum& ym) NOEXCEPT +{ + return ym + dy; +} + +CONSTCD11 +inline +year_weeknum +operator-(const year_weeknum& ym, const years& dy) NOEXCEPT +{ + return ym + -dy; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_weeknum& ywn) +{ + return os << ywn.year() << '-' << ywn.weeknum(); +} + + +// year_lastweek + +CONSTCD11 +inline +year_lastweek::year_lastweek(const iso_week::year& y) NOEXCEPT + : y_(y) + {} + +CONSTCD11 inline year year_lastweek::year() const NOEXCEPT {return y_;} + +CONSTCD14 +inline +weeknum +year_lastweek::weeknum() const NOEXCEPT +{ + return iso_week::weeknum(y_.is_leap() ? 53u : 52u); +} + +CONSTCD11 inline bool year_lastweek::ok() const NOEXCEPT {return y_.ok();} + +inline +year_lastweek& +year_lastweek::operator+=(const years& dy) NOEXCEPT +{ + *this = *this + dy; + return *this; +} + +inline +year_lastweek& +year_lastweek::operator-=(const years& dy) NOEXCEPT +{ + *this = *this - dy; + return *this; +} + +CONSTCD11 +inline +bool +operator==(const year_lastweek& x, const year_lastweek& y) NOEXCEPT +{ + return x.year() == y.year(); +} + +CONSTCD11 +inline +bool +operator!=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_lastweek& x, const year_lastweek& y) NOEXCEPT +{ + return x.year() < y.year(); +} + +CONSTCD11 +inline +bool +operator>(const year_lastweek& x, const year_lastweek& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_lastweek& x, const year_lastweek& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD11 +inline +year_lastweek +operator+(const year_lastweek& ym, const years& dy) NOEXCEPT +{ + return year_lastweek{ym.year() + dy}; +} + +CONSTCD11 +inline +year_lastweek +operator+(const years& dy, const year_lastweek& ym) NOEXCEPT +{ + return ym + dy; +} + +CONSTCD11 +inline +year_lastweek +operator-(const year_lastweek& ym, const years& dy) NOEXCEPT +{ + return ym + -dy; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_lastweek& ywn) +{ + return os << ywn.year() << "-W last"; +} + +// weeknum_weekday + +CONSTCD11 +inline +weeknum_weekday::weeknum_weekday(const iso_week::weeknum& wn, + const iso_week::weekday& wd) NOEXCEPT + : wn_(wn) + , wd_(wd) + {} + +CONSTCD11 inline weeknum weeknum_weekday::weeknum() const NOEXCEPT {return wn_;} +CONSTCD11 inline weekday weeknum_weekday::weekday() const NOEXCEPT {return wd_;} + +CONSTCD14 +inline +bool +weeknum_weekday::ok() const NOEXCEPT +{ + return wn_.ok() && wd_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT +{ + return x.weeknum() == y.weeknum() && x.weekday() == y.weekday(); +} + +CONSTCD11 +inline +bool +operator!=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT +{ + return x.weeknum() < y.weeknum() ? true + : (x.weeknum() > y.weeknum() ? false + : (static_cast(x.weekday()) < static_cast(y.weekday()))); +} + +CONSTCD11 +inline +bool +operator>(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const weeknum_weekday& x, const weeknum_weekday& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weeknum_weekday& md) +{ + return os << md.weeknum() << '-' << md.weekday(); +} + +// lastweek_weekday + +CONSTCD11 +inline +lastweek_weekday::lastweek_weekday(const iso_week::weekday& wd) NOEXCEPT + : wd_(wd) + {} + +CONSTCD11 inline weekday lastweek_weekday::weekday() const NOEXCEPT {return wd_;} + +CONSTCD14 +inline +bool +lastweek_weekday::ok() const NOEXCEPT +{ + return wd_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT +{ + return x.weekday() == y.weekday(); +} + +CONSTCD11 +inline +bool +operator!=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT +{ + return static_cast(x.weekday()) < static_cast(y.weekday()); +} + +CONSTCD11 +inline +bool +operator>(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const lastweek_weekday& x, const lastweek_weekday& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const lastweek_weekday& md) +{ + return os << "W last-" << md.weekday(); +} + +// year_lastweek_weekday + +CONSTCD11 +inline +year_lastweek_weekday::year_lastweek_weekday(const iso_week::year& y, + const iso_week::weekday& wd) NOEXCEPT + : y_(y) + , wd_(wd) + {} + +inline +year_lastweek_weekday& +year_lastweek_weekday::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +inline +year_lastweek_weekday& +year_lastweek_weekday::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline year year_lastweek_weekday::year() const NOEXCEPT {return y_;} + +CONSTCD14 +inline +weeknum +year_lastweek_weekday::weeknum() const NOEXCEPT +{ + return (y_ / last).weeknum(); +} + +CONSTCD11 inline weekday year_lastweek_weekday::weekday() const NOEXCEPT {return wd_;} + +CONSTCD14 +inline +year_lastweek_weekday::operator sys_days() const NOEXCEPT +{ + return sys_days(date::year{static_cast(y_)}/date::dec/date::thu[date::last]) + + (sun - thu) - (sun - wd_); +} + +CONSTCD14 +inline +year_lastweek_weekday::operator local_days() const NOEXCEPT +{ + return local_days(date::year{static_cast(y_)}/date::dec/date::thu[date::last]) + + (sun - thu) - (sun - wd_); +} + +CONSTCD11 +inline +bool +year_lastweek_weekday::ok() const NOEXCEPT +{ + return y_.ok() && wd_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT +{ + return x.year() == y.year() && x.weekday() == y.weekday(); +} + +CONSTCD11 +inline +bool +operator!=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (static_cast(x.weekday()) < static_cast(y.weekday()))); +} + +CONSTCD11 +inline +bool +operator>(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_lastweek_weekday& x, const year_lastweek_weekday& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD11 +inline +year_lastweek_weekday +operator+(const year_lastweek_weekday& ywnwd, const years& y) NOEXCEPT +{ + return (ywnwd.year() + y) / last / ywnwd.weekday(); +} + +CONSTCD11 +inline +year_lastweek_weekday +operator+(const years& y, const year_lastweek_weekday& ywnwd) NOEXCEPT +{ + return ywnwd + y; +} + +CONSTCD11 +inline +year_lastweek_weekday +operator-(const year_lastweek_weekday& ywnwd, const years& y) NOEXCEPT +{ + return ywnwd + -y; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_lastweek_weekday& ywnwd) +{ + return os << ywnwd.year() << "-W last-" << ywnwd.weekday(); +} + +// year_weeknum_weekday + +CONSTCD11 +inline +year_weeknum_weekday::year_weeknum_weekday(const iso_week::year& y, + const iso_week::weeknum& wn, + const iso_week::weekday& wd) NOEXCEPT + : y_(y) + , wn_(wn) + , wd_(wd) + {} + +CONSTCD14 +inline +year_weeknum_weekday::year_weeknum_weekday(const year_lastweek_weekday& ylwwd) NOEXCEPT + : y_(ylwwd.year()) + , wn_(ylwwd.weeknum()) + , wd_(ylwwd.weekday()) + {} + +CONSTCD14 +inline +year_weeknum_weekday::year_weeknum_weekday(const sys_days& dp) NOEXCEPT + : year_weeknum_weekday(from_days(dp.time_since_epoch())) + {} + +CONSTCD14 +inline +year_weeknum_weekday::year_weeknum_weekday(const local_days& dp) NOEXCEPT + : year_weeknum_weekday(from_days(dp.time_since_epoch())) + {} + +inline +year_weeknum_weekday& +year_weeknum_weekday::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +inline +year_weeknum_weekday& +year_weeknum_weekday::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline year year_weeknum_weekday::year() const NOEXCEPT {return y_;} +CONSTCD11 inline weeknum year_weeknum_weekday::weeknum() const NOEXCEPT {return wn_;} +CONSTCD11 inline weekday year_weeknum_weekday::weekday() const NOEXCEPT {return wd_;} + +CONSTCD14 +inline +year_weeknum_weekday::operator sys_days() const NOEXCEPT +{ + return sys_days(date::year{static_cast(y_)-1}/date::dec/date::thu[date::last]) + + (date::mon - date::thu) + weeks{static_cast(wn_)-1} + (wd_ - mon); +} + +CONSTCD14 +inline +year_weeknum_weekday::operator local_days() const NOEXCEPT +{ + return local_days(date::year{static_cast(y_)-1}/date::dec/date::thu[date::last]) + + (date::mon - date::thu) + weeks{static_cast(wn_)-1} + (wd_ - mon); +} + +CONSTCD14 +inline +bool +year_weeknum_weekday::ok() const NOEXCEPT +{ + return y_.ok() && wd_.ok() && iso_week::weeknum{1u} <= wn_ && wn_ <= year_lastweek{y_}.weeknum(); +} + +CONSTCD14 +inline +year_weeknum_weekday +year_weeknum_weekday::from_days(days d) NOEXCEPT +{ + const auto dp = sys_days{d}; + const auto wd = iso_week::weekday{dp}; + auto y = date::year_month_day{dp + days{3}}.year(); + auto start = sys_days((y - date::years{1})/date::dec/date::thu[date::last]) + (mon-thu); + if (dp < start) + { + --y; + start = sys_days((y - date::years{1})/date::dec/date::thu[date::last]) + (mon-thu); + } + const auto wn = iso_week::weeknum( + static_cast(date::trunc(dp - start).count() + 1)); + return {iso_week::year(static_cast(y)), wn, wd}; +} + +CONSTCD11 +inline +bool +operator==(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT +{ + return x.year() == y.year() && x.weeknum() == y.weeknum() && x.weekday() == y.weekday(); +} + +CONSTCD11 +inline +bool +operator!=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (x.weeknum() < y.weeknum() ? true + : (x.weeknum() > y.weeknum() ? false + : (static_cast(x.weekday()) < static_cast(y.weekday()))))); +} + +CONSTCD11 +inline +bool +operator>(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_weeknum_weekday& x, const year_weeknum_weekday& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD11 +inline +year_weeknum_weekday +operator+(const year_weeknum_weekday& ywnwd, const years& y) NOEXCEPT +{ + return (ywnwd.year() + y) / ywnwd.weeknum() / ywnwd.weekday(); +} + +CONSTCD11 +inline +year_weeknum_weekday +operator+(const years& y, const year_weeknum_weekday& ywnwd) NOEXCEPT +{ + return ywnwd + y; +} + +CONSTCD11 +inline +year_weeknum_weekday +operator-(const year_weeknum_weekday& ywnwd, const years& y) NOEXCEPT +{ + return ywnwd + -y; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_weeknum_weekday& ywnwd) +{ + return os << ywnwd.year() << '-' << ywnwd.weeknum() << '-' << ywnwd.weekday(); +} + +// date composition operators + +CONSTCD11 +inline +year_weeknum +operator/(const year& y, const weeknum& wn) NOEXCEPT +{ + return {y, wn}; +} + +CONSTCD11 +inline +year_weeknum +operator/(const year& y, int wn) NOEXCEPT +{ + return y/weeknum(static_cast(wn)); +} + +CONSTCD11 +inline +year_lastweek +operator/(const year& y, last_week) NOEXCEPT +{ + return year_lastweek{y}; +} + +CONSTCD11 +inline +weeknum_weekday +operator/(const weeknum& wn, const weekday& wd) NOEXCEPT +{ + return {wn, wd}; +} + +CONSTCD11 +inline +weeknum_weekday +operator/(const weeknum& wn, int wd) NOEXCEPT +{ + return wn/weekday{static_cast(wd)}; +} + +CONSTCD11 +inline +weeknum_weekday +operator/(const weekday& wd, const weeknum& wn) NOEXCEPT +{ + return wn/wd; +} + +CONSTCD11 +inline +weeknum_weekday +operator/(const weekday& wd, int wn) NOEXCEPT +{ + return weeknum{static_cast(wn)}/wd; +} + +CONSTCD11 +inline +lastweek_weekday +operator/(const last_week&, const weekday& wd) NOEXCEPT +{ + return lastweek_weekday{wd}; +} + +CONSTCD11 +inline +lastweek_weekday +operator/(const last_week& wn, int wd) NOEXCEPT +{ + return wn / weekday{static_cast(wd)}; +} + +CONSTCD11 +inline +lastweek_weekday +operator/(const weekday& wd, const last_week& wn) NOEXCEPT +{ + return wn / wd; +} + +CONSTCD11 +inline +year_weeknum_weekday +operator/(const year_weeknum& ywn, const weekday& wd) NOEXCEPT +{ + return {ywn.year(), ywn.weeknum(), wd}; +} + +CONSTCD11 +inline +year_weeknum_weekday +operator/(const year_weeknum& ywn, int wd) NOEXCEPT +{ + return ywn / weekday(static_cast(wd)); +} + +CONSTCD11 +inline +year_weeknum_weekday +operator/(const weeknum_weekday& wnwd, const year& y) NOEXCEPT +{ + return {y, wnwd.weeknum(), wnwd.weekday()}; +} + +CONSTCD11 +inline +year_weeknum_weekday +operator/(const weeknum_weekday& wnwd, int y) NOEXCEPT +{ + return wnwd / year{y}; +} + +CONSTCD11 +inline +year_lastweek_weekday +operator/(const year_lastweek& ylw, const weekday& wd) NOEXCEPT +{ + return {ylw.year(), wd}; +} + +CONSTCD11 +inline +year_lastweek_weekday +operator/(const year_lastweek& ylw, int wd) NOEXCEPT +{ + return ylw / weekday(static_cast(wd)); +} + +CONSTCD11 +inline +year_lastweek_weekday +operator/(const lastweek_weekday& lwwd, const year& y) NOEXCEPT +{ + return {y, lwwd.weekday()}; +} + +CONSTCD11 +inline +year_lastweek_weekday +operator/(const lastweek_weekday& lwwd, int y) NOEXCEPT +{ + return lwwd / year{y}; +} + +} // namespace iso_week + +#endif // ISO_WEEK_H diff --git a/vendor/date/julian.h b/vendor/date/julian.h new file mode 100644 index 000000000..e9187a676 --- /dev/null +++ b/vendor/date/julian.h @@ -0,0 +1,3052 @@ +#ifndef JULIAN_H +#define JULIAN_H + +// The MIT License (MIT) +// +// Copyright (c) 2016 Howard Hinnant +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// Our apologies. When the previous paragraph was written, lowercase had not yet +// been invented (that would involve another several millennia of evolution). +// We did not mean to shout. + +#include "date.h" + +namespace julian +{ + +// durations + +using days = date::days; + +using weeks = date::weeks; + +using years = std::chrono::duration + , days::period>>; + +using months = std::chrono::duration + >>; + +// time_point + +using sys_days = date::sys_days; +using local_days = date::local_days; + +// types + +struct last_spec +{ + explicit last_spec() = default; +}; + +class day; +class month; +class year; + +class weekday; +class weekday_indexed; +class weekday_last; + +class month_day; +class month_day_last; +class month_weekday; +class month_weekday_last; + +class year_month; + +class year_month_day; +class year_month_day_last; +class year_month_weekday; +class year_month_weekday_last; + +// date composition operators + +CONSTCD11 year_month operator/(const year& y, const month& m) NOEXCEPT; +CONSTCD11 year_month operator/(const year& y, int m) NOEXCEPT; + +CONSTCD11 month_day operator/(const day& d, const month& m) NOEXCEPT; +CONSTCD11 month_day operator/(const day& d, int m) NOEXCEPT; +CONSTCD11 month_day operator/(const month& m, const day& d) NOEXCEPT; +CONSTCD11 month_day operator/(const month& m, int d) NOEXCEPT; +CONSTCD11 month_day operator/(int m, const day& d) NOEXCEPT; + +CONSTCD11 month_day_last operator/(const month& m, last_spec) NOEXCEPT; +CONSTCD11 month_day_last operator/(int m, last_spec) NOEXCEPT; +CONSTCD11 month_day_last operator/(last_spec, const month& m) NOEXCEPT; +CONSTCD11 month_day_last operator/(last_spec, int m) NOEXCEPT; + +CONSTCD11 month_weekday operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT; +CONSTCD11 month_weekday operator/(int m, const weekday_indexed& wdi) NOEXCEPT; +CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT; +CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, int m) NOEXCEPT; + +CONSTCD11 month_weekday_last operator/(const month& m, const weekday_last& wdl) NOEXCEPT; +CONSTCD11 month_weekday_last operator/(int m, const weekday_last& wdl) NOEXCEPT; +CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, const month& m) NOEXCEPT; +CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, int m) NOEXCEPT; + +CONSTCD11 year_month_day operator/(const year_month& ym, const day& d) NOEXCEPT; +CONSTCD11 year_month_day operator/(const year_month& ym, int d) NOEXCEPT; +CONSTCD11 year_month_day operator/(const year& y, const month_day& md) NOEXCEPT; +CONSTCD11 year_month_day operator/(int y, const month_day& md) NOEXCEPT; +CONSTCD11 year_month_day operator/(const month_day& md, const year& y) NOEXCEPT; +CONSTCD11 year_month_day operator/(const month_day& md, int y) NOEXCEPT; + +CONSTCD11 + year_month_day_last operator/(const year_month& ym, last_spec) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(const year& y, const month_day_last& mdl) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(int y, const month_day_last& mdl) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(const month_day_last& mdl, const year& y) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(const month_day_last& mdl, int y) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const year& y, const month_weekday& mwd) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(int y, const month_weekday& mwd) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const month_weekday& mwd, const year& y) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const month_weekday& mwd, int y) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(int y, const month_weekday_last& mwdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const month_weekday_last& mwdl, int y) NOEXCEPT; + +// Detailed interface + +// day + +class day +{ + unsigned char d_; + +public: + explicit CONSTCD11 day(unsigned d) NOEXCEPT; + + CONSTCD14 day& operator++() NOEXCEPT; + CONSTCD14 day operator++(int) NOEXCEPT; + CONSTCD14 day& operator--() NOEXCEPT; + CONSTCD14 day operator--(int) NOEXCEPT; + + CONSTCD14 day& operator+=(const days& d) NOEXCEPT; + CONSTCD14 day& operator-=(const days& d) NOEXCEPT; + + CONSTCD11 explicit operator unsigned() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator!=(const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator< (const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator> (const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator<=(const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator>=(const day& x, const day& y) NOEXCEPT; + +CONSTCD11 day operator+(const day& x, const days& y) NOEXCEPT; +CONSTCD11 day operator+(const days& x, const day& y) NOEXCEPT; +CONSTCD11 day operator-(const day& x, const days& y) NOEXCEPT; +CONSTCD11 days operator-(const day& x, const day& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const day& d); + +// month + +class month +{ + unsigned char m_; + +public: + explicit CONSTCD11 month(unsigned m) NOEXCEPT; + + CONSTCD14 month& operator++() NOEXCEPT; + CONSTCD14 month operator++(int) NOEXCEPT; + CONSTCD14 month& operator--() NOEXCEPT; + CONSTCD14 month operator--(int) NOEXCEPT; + + CONSTCD14 month& operator+=(const months& m) NOEXCEPT; + CONSTCD14 month& operator-=(const months& m) NOEXCEPT; + + CONSTCD11 explicit operator unsigned() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator< (const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator> (const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator<=(const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator>=(const month& x, const month& y) NOEXCEPT; + +CONSTCD14 month operator+(const month& x, const months& y) NOEXCEPT; +CONSTCD14 month operator+(const months& x, const month& y) NOEXCEPT; +CONSTCD14 month operator-(const month& x, const months& y) NOEXCEPT; +CONSTCD14 months operator-(const month& x, const month& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month& m); + +// year + +class year +{ + short y_; + +public: + explicit CONSTCD11 year(int y) NOEXCEPT; + + CONSTCD14 year& operator++() NOEXCEPT; + CONSTCD14 year operator++(int) NOEXCEPT; + CONSTCD14 year& operator--() NOEXCEPT; + CONSTCD14 year operator--(int) NOEXCEPT; + + CONSTCD14 year& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 bool is_leap() const NOEXCEPT; + + CONSTCD11 explicit operator int() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; + + static CONSTCD11 year min() NOEXCEPT; + static CONSTCD11 year max() NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator< (const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator> (const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year& x, const year& y) NOEXCEPT; + +CONSTCD11 year operator+(const year& x, const years& y) NOEXCEPT; +CONSTCD11 year operator+(const years& x, const year& y) NOEXCEPT; +CONSTCD11 year operator-(const year& x, const years& y) NOEXCEPT; +CONSTCD11 years operator-(const year& x, const year& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year& y); + +// weekday + +class weekday +{ + unsigned char wd_; +public: + explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT; + explicit weekday(int) = delete; + CONSTCD11 weekday(const sys_days& dp) NOEXCEPT; + CONSTCD11 explicit weekday(const local_days& dp) NOEXCEPT; + + CONSTCD14 weekday& operator++() NOEXCEPT; + CONSTCD14 weekday operator++(int) NOEXCEPT; + CONSTCD14 weekday& operator--() NOEXCEPT; + CONSTCD14 weekday operator--(int) NOEXCEPT; + + CONSTCD14 weekday& operator+=(const days& d) NOEXCEPT; + CONSTCD14 weekday& operator-=(const days& d) NOEXCEPT; + + CONSTCD11 explicit operator unsigned() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; + + CONSTCD11 weekday_indexed operator[](unsigned index) const NOEXCEPT; + CONSTCD11 weekday_last operator[](last_spec) const NOEXCEPT; + +private: + static CONSTCD11 unsigned char weekday_from_days(int z) NOEXCEPT; +}; + +CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weekday& x, const weekday& y) NOEXCEPT; + +CONSTCD14 weekday operator+(const weekday& x, const days& y) NOEXCEPT; +CONSTCD14 weekday operator+(const days& x, const weekday& y) NOEXCEPT; +CONSTCD14 weekday operator-(const weekday& x, const days& y) NOEXCEPT; +CONSTCD14 days operator-(const weekday& x, const weekday& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday& wd); + +// weekday_indexed + +class weekday_indexed +{ + unsigned char wd_ : 4; + unsigned char index_ : 4; + +public: + CONSTCD11 weekday_indexed(const julian::weekday& wd, unsigned index) NOEXCEPT; + + CONSTCD11 julian::weekday weekday() const NOEXCEPT; + CONSTCD11 unsigned index() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_indexed& wdi); + +// weekday_last + +class weekday_last +{ + julian::weekday wd_; + +public: + explicit CONSTCD11 weekday_last(const julian::weekday& wd) NOEXCEPT; + + CONSTCD11 julian::weekday weekday() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_last& wdl); + +// year_month + +class year_month +{ + julian::year y_; + julian::month m_; + +public: + CONSTCD11 year_month(const julian::year& y, const julian::month& m) NOEXCEPT; + + CONSTCD11 julian::year year() const NOEXCEPT; + CONSTCD11 julian::month month() const NOEXCEPT; + + CONSTCD14 year_month& operator+=(const months& dm) NOEXCEPT; + CONSTCD14 year_month& operator-=(const months& dm) NOEXCEPT; + CONSTCD14 year_month& operator+=(const years& dy) NOEXCEPT; + CONSTCD14 year_month& operator-=(const years& dy) NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator< (const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator> (const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year_month& x, const year_month& y) NOEXCEPT; + +CONSTCD14 year_month operator+(const year_month& ym, const months& dm) NOEXCEPT; +CONSTCD14 year_month operator+(const months& dm, const year_month& ym) NOEXCEPT; +CONSTCD14 year_month operator-(const year_month& ym, const months& dm) NOEXCEPT; + +CONSTCD11 months operator-(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 year_month operator+(const year_month& ym, const years& dy) NOEXCEPT; +CONSTCD11 year_month operator+(const years& dy, const year_month& ym) NOEXCEPT; +CONSTCD11 year_month operator-(const year_month& ym, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month& ym); + +// month_day + +class month_day +{ + julian::month m_; + julian::day d_; + +public: + CONSTCD11 month_day(const julian::month& m, const julian::day& d) NOEXCEPT; + + CONSTCD11 julian::month month() const NOEXCEPT; + CONSTCD11 julian::day day() const NOEXCEPT; + + CONSTCD14 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator< (const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator> (const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator<=(const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator>=(const month_day& x, const month_day& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day& md); + +// month_day_last + +class month_day_last +{ + julian::month m_; + +public: + CONSTCD11 explicit month_day_last(const julian::month& m) NOEXCEPT; + + CONSTCD11 julian::month month() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator< (const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator> (const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day_last& mdl); + +// month_weekday + +class month_weekday +{ + julian::month m_; + julian::weekday_indexed wdi_; +public: + CONSTCD11 month_weekday(const julian::month& m, + const julian::weekday_indexed& wdi) NOEXCEPT; + + CONSTCD11 julian::month month() const NOEXCEPT; + CONSTCD11 julian::weekday_indexed weekday_indexed() const NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday& mwd); + +// month_weekday_last + +class month_weekday_last +{ + julian::month m_; + julian::weekday_last wdl_; + +public: + CONSTCD11 month_weekday_last(const julian::month& m, + const julian::weekday_last& wd) NOEXCEPT; + + CONSTCD11 julian::month month() const NOEXCEPT; + CONSTCD11 julian::weekday_last weekday_last() const NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 + bool operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT; +CONSTCD11 + bool operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday_last& mwdl); + +// class year_month_day + +class year_month_day +{ + julian::year y_; + julian::month m_; + julian::day d_; + +public: + CONSTCD11 year_month_day(const julian::year& y, const julian::month& m, + const julian::day& d) NOEXCEPT; + CONSTCD14 year_month_day(const year_month_day_last& ymdl) NOEXCEPT; + + CONSTCD14 year_month_day(sys_days dp) NOEXCEPT; + CONSTCD14 explicit year_month_day(local_days dp) NOEXCEPT; + + CONSTCD14 year_month_day& operator+=(const months& m) NOEXCEPT; + CONSTCD14 year_month_day& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_day& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_day& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 julian::year year() const NOEXCEPT; + CONSTCD11 julian::month month() const NOEXCEPT; + CONSTCD11 julian::day day() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD14 bool ok() const NOEXCEPT; + +private: + static CONSTCD14 year_month_day from_days(days dp) NOEXCEPT; + CONSTCD14 days to_days() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator< (const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator> (const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT; + +CONSTCD14 year_month_day operator+(const year_month_day& ymd, const months& dm) NOEXCEPT; +CONSTCD14 year_month_day operator+(const months& dm, const year_month_day& ymd) NOEXCEPT; +CONSTCD14 year_month_day operator-(const year_month_day& ymd, const months& dm) NOEXCEPT; +CONSTCD11 year_month_day operator+(const year_month_day& ymd, const years& dy) NOEXCEPT; +CONSTCD11 year_month_day operator+(const years& dy, const year_month_day& ymd) NOEXCEPT; +CONSTCD11 year_month_day operator-(const year_month_day& ymd, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day& ymd); + +// year_month_day_last + +class year_month_day_last +{ + julian::year y_; + julian::month_day_last mdl_; + +public: + CONSTCD11 year_month_day_last(const julian::year& y, + const julian::month_day_last& mdl) NOEXCEPT; + + CONSTCD14 year_month_day_last& operator+=(const months& m) NOEXCEPT; + CONSTCD14 year_month_day_last& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_day_last& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_day_last& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 julian::year year() const NOEXCEPT; + CONSTCD11 julian::month month() const NOEXCEPT; + CONSTCD11 julian::month_day_last month_day_last() const NOEXCEPT; + CONSTCD14 julian::day day() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 + bool operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator< (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator> (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; + +CONSTCD14 +year_month_day_last +operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT; + +CONSTCD14 +year_month_day_last +operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT; + +CONSTCD11 +year_month_day_last +operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT; + +CONSTCD11 +year_month_day_last +operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT; + +CONSTCD14 +year_month_day_last +operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT; + +CONSTCD11 +year_month_day_last +operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day_last& ymdl); + +// year_month_weekday + +class year_month_weekday +{ + julian::year y_; + julian::month m_; + julian::weekday_indexed wdi_; + +public: + CONSTCD11 year_month_weekday(const julian::year& y, const julian::month& m, + const julian::weekday_indexed& wdi) NOEXCEPT; + CONSTCD14 year_month_weekday(const sys_days& dp) NOEXCEPT; + CONSTCD14 explicit year_month_weekday(const local_days& dp) NOEXCEPT; + + CONSTCD14 year_month_weekday& operator+=(const months& m) NOEXCEPT; + CONSTCD14 year_month_weekday& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_weekday& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_weekday& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 julian::year year() const NOEXCEPT; + CONSTCD11 julian::month month() const NOEXCEPT; + CONSTCD11 julian::weekday weekday() const NOEXCEPT; + CONSTCD11 unsigned index() const NOEXCEPT; + CONSTCD11 julian::weekday_indexed weekday_indexed() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD14 bool ok() const NOEXCEPT; + +private: + static CONSTCD14 year_month_weekday from_days(days dp) NOEXCEPT; + CONSTCD14 days to_days() const NOEXCEPT; +}; + +CONSTCD11 + bool operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT; +CONSTCD11 + bool operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT; + +CONSTCD14 +year_month_weekday +operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT; + +CONSTCD14 +year_month_weekday +operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT; + +CONSTCD14 +year_month_weekday +operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday& ymwdi); + +// year_month_weekday_last + +class year_month_weekday_last +{ + julian::year y_; + julian::month m_; + julian::weekday_last wdl_; + +public: + CONSTCD11 year_month_weekday_last(const julian::year& y, const julian::month& m, + const julian::weekday_last& wdl) NOEXCEPT; + + CONSTCD14 year_month_weekday_last& operator+=(const months& m) NOEXCEPT; + CONSTCD14 year_month_weekday_last& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_weekday_last& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_weekday_last& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 julian::year year() const NOEXCEPT; + CONSTCD11 julian::month month() const NOEXCEPT; + CONSTCD11 julian::weekday weekday() const NOEXCEPT; + CONSTCD11 julian::weekday_last weekday_last() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; + +private: + CONSTCD14 days to_days() const NOEXCEPT; +}; + +CONSTCD11 +bool +operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT; + +CONSTCD11 +bool +operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT; + +CONSTCD14 +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT; + +CONSTCD14 +year_month_weekday_last +operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT; + +CONSTCD14 +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday_last& ymwdl); + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +inline namespace literals +{ + +CONSTCD11 julian::day operator ""_d(unsigned long long d) NOEXCEPT; +CONSTCD11 julian::year operator ""_y(unsigned long long y) NOEXCEPT; + +// CONSTDATA julian::month jan{1}; +// CONSTDATA julian::month feb{2}; +// CONSTDATA julian::month mar{3}; +// CONSTDATA julian::month apr{4}; +// CONSTDATA julian::month may{5}; +// CONSTDATA julian::month jun{6}; +// CONSTDATA julian::month jul{7}; +// CONSTDATA julian::month aug{8}; +// CONSTDATA julian::month sep{9}; +// CONSTDATA julian::month oct{10}; +// CONSTDATA julian::month nov{11}; +// CONSTDATA julian::month dec{12}; + +} // inline namespace literals +#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900) + +//----------------+ +// Implementation | +//----------------+ + +// day + +CONSTCD11 inline day::day(unsigned d) NOEXCEPT : d_(static_cast(d)) {} +CONSTCD14 inline day& day::operator++() NOEXCEPT {++d_; return *this;} +CONSTCD14 inline day day::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline day& day::operator--() NOEXCEPT {--d_; return *this;} +CONSTCD14 inline day day::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} +CONSTCD14 inline day& day::operator+=(const days& d) NOEXCEPT {*this = *this + d; return *this;} +CONSTCD14 inline day& day::operator-=(const days& d) NOEXCEPT {*this = *this - d; return *this;} +CONSTCD11 inline day::operator unsigned() const NOEXCEPT {return d_;} +CONSTCD11 inline bool day::ok() const NOEXCEPT {return 1 <= d_ && d_ <= 31;} + +CONSTCD11 +inline +bool +operator==(const day& x, const day& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const day& x, const day& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const day& x, const day& y) NOEXCEPT +{ + return static_cast(x) < static_cast(y); +} + +CONSTCD11 +inline +bool +operator>(const day& x, const day& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const day& x, const day& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const day& x, const day& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD11 +inline +days +operator-(const day& x, const day& y) NOEXCEPT +{ + return days{static_cast(static_cast(x) + - static_cast(y))}; +} + +CONSTCD11 +inline +day +operator+(const day& x, const days& y) NOEXCEPT +{ + return day{static_cast(x) + static_cast(y.count())}; +} + +CONSTCD11 +inline +day +operator+(const days& x, const day& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD11 +inline +day +operator-(const day& x, const days& y) NOEXCEPT +{ + return x + -y; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const day& d) +{ + date::detail::save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os.width(2); + os << static_cast(d); + return os; +} + +// month + +CONSTCD11 inline month::month(unsigned m) NOEXCEPT : m_(static_cast(m)) {} +CONSTCD14 inline month& month::operator++() NOEXCEPT {if (++m_ == 13) m_ = 1; return *this;} +CONSTCD14 inline month month::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline month& month::operator--() NOEXCEPT {if (--m_ == 0) m_ = 12; return *this;} +CONSTCD14 inline month month::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} + +CONSTCD14 +inline +month& +month::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +month& +month::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD11 inline month::operator unsigned() const NOEXCEPT {return m_;} +CONSTCD11 inline bool month::ok() const NOEXCEPT {return 1 <= m_ && m_ <= 12;} + +CONSTCD11 +inline +bool +operator==(const month& x, const month& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const month& x, const month& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const month& x, const month& y) NOEXCEPT +{ + return static_cast(x) < static_cast(y); +} + +CONSTCD11 +inline +bool +operator>(const month& x, const month& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const month& x, const month& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const month& x, const month& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD14 +inline +months +operator-(const month& x, const month& y) NOEXCEPT +{ + auto const d = static_cast(x) - static_cast(y); + return months(d <= 11 ? d : d + 12); +} + +CONSTCD14 +inline +month +operator+(const month& x, const months& y) NOEXCEPT +{ + auto const mu = static_cast(static_cast(x)) - 1 + y.count(); + auto const yr = (mu >= 0 ? mu : mu-11) / 12; + return month{static_cast(mu - yr * 12 + 1)}; +} + +CONSTCD14 +inline +month +operator+(const months& x, const month& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD14 +inline +month +operator-(const month& x, const months& y) NOEXCEPT +{ + return x + -y; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month& m) +{ + switch (static_cast(m)) + { + case 1: + os << "Jan"; + break; + case 2: + os << "Feb"; + break; + case 3: + os << "Mar"; + break; + case 4: + os << "Apr"; + break; + case 5: + os << "May"; + break; + case 6: + os << "Jun"; + break; + case 7: + os << "Jul"; + break; + case 8: + os << "Aug"; + break; + case 9: + os << "Sep"; + break; + case 10: + os << "Oct"; + break; + case 11: + os << "Nov"; + break; + case 12: + os << "Dec"; + break; + default: + os << static_cast(m) << " is not a valid month"; + break; + } + return os; +} + +// year + +CONSTCD11 inline year::year(int y) NOEXCEPT : y_(static_cast(y)) {} +CONSTCD14 inline year& year::operator++() NOEXCEPT {++y_; return *this;} +CONSTCD14 inline year year::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline year& year::operator--() NOEXCEPT {--y_; return *this;} +CONSTCD14 inline year year::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} +CONSTCD14 inline year& year::operator+=(const years& y) NOEXCEPT {*this = *this + y; return *this;} +CONSTCD14 inline year& year::operator-=(const years& y) NOEXCEPT {*this = *this - y; return *this;} + +CONSTCD11 +inline +bool +year::is_leap() const NOEXCEPT +{ + return y_ % 4 == 0; +} + +CONSTCD11 inline year::operator int() const NOEXCEPT {return y_;} +CONSTCD11 inline bool year::ok() const NOEXCEPT {return true;} + +CONSTCD11 +inline +year +year::min() NOEXCEPT +{ + return year{std::numeric_limits::min()}; +} + +CONSTCD11 +inline +year +year::max() NOEXCEPT +{ + return year{std::numeric_limits::max()}; +} + +CONSTCD11 +inline +bool +operator==(const year& x, const year& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const year& x, const year& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year& x, const year& y) NOEXCEPT +{ + return static_cast(x) < static_cast(y); +} + +CONSTCD11 +inline +bool +operator>(const year& x, const year& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year& x, const year& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year& x, const year& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD11 +inline +years +operator-(const year& x, const year& y) NOEXCEPT +{ + return years{static_cast(x) - static_cast(y)}; +} + +CONSTCD11 +inline +year +operator+(const year& x, const years& y) NOEXCEPT +{ + return year{static_cast(x) + y.count()}; +} + +CONSTCD11 +inline +year +operator+(const years& x, const year& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD11 +inline +year +operator-(const year& x, const years& y) NOEXCEPT +{ + return year{static_cast(x) - y.count()}; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year& y) +{ + date::detail::save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::internal); + os.width(4 + (y < year{0})); + os << static_cast(y); + return os; +} + +// weekday + +CONSTCD11 +inline +unsigned char +weekday::weekday_from_days(int z) NOEXCEPT +{ + return static_cast(static_cast( + z >= -4 ? (z+4) % 7 : (z+5) % 7 + 6)); +} + +CONSTCD11 +inline +weekday::weekday(unsigned wd) NOEXCEPT + : wd_(static_cast(wd)) + {} + +CONSTCD11 +inline +weekday::weekday(const sys_days& dp) NOEXCEPT + : wd_(weekday_from_days(dp.time_since_epoch().count())) + {} + +CONSTCD11 +inline +weekday::weekday(const local_days& dp) NOEXCEPT + : wd_(weekday_from_days(dp.time_since_epoch().count())) + {} + +CONSTCD14 inline weekday& weekday::operator++() NOEXCEPT {if (++wd_ == 7) wd_ = 0; return *this;} +CONSTCD14 inline weekday weekday::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline weekday& weekday::operator--() NOEXCEPT {if (wd_-- == 0) wd_ = 6; return *this;} +CONSTCD14 inline weekday weekday::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} + +CONSTCD14 +inline +weekday& +weekday::operator+=(const days& d) NOEXCEPT +{ + *this = *this + d; + return *this; +} + +CONSTCD14 +inline +weekday& +weekday::operator-=(const days& d) NOEXCEPT +{ + *this = *this - d; + return *this; +} + +CONSTCD11 +inline +weekday::operator unsigned() const NOEXCEPT +{ + return static_cast(wd_); +} + +CONSTCD11 inline bool weekday::ok() const NOEXCEPT {return wd_ <= 6;} + +CONSTCD11 +inline +bool +operator==(const weekday& x, const weekday& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const weekday& x, const weekday& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD14 +inline +days +operator-(const weekday& x, const weekday& y) NOEXCEPT +{ + auto const diff = static_cast(x) - static_cast(y); + return days{diff <= 6 ? diff : diff + 7}; +} + +CONSTCD14 +inline +weekday +operator+(const weekday& x, const days& y) NOEXCEPT +{ + auto const wdu = static_cast(static_cast(x)) + y.count(); + auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7; + return weekday{static_cast(wdu - wk * 7)}; +} + +CONSTCD14 +inline +weekday +operator+(const days& x, const weekday& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD14 +inline +weekday +operator-(const weekday& x, const days& y) NOEXCEPT +{ + return x + -y; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday& wd) +{ + switch (static_cast(wd)) + { + case 0: + os << "Sun"; + break; + case 1: + os << "Mon"; + break; + case 2: + os << "Tue"; + break; + case 3: + os << "Wed"; + break; + case 4: + os << "Thu"; + break; + case 5: + os << "Fri"; + break; + case 6: + os << "Sat"; + break; + default: + os << static_cast(wd) << " is not a valid weekday"; + break; + } + return os; +} + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +inline namespace literals +{ + +CONSTCD11 +inline +julian::day +operator ""_d(unsigned long long d) NOEXCEPT +{ + return julian::day{static_cast(d)}; +} + +CONSTCD11 +inline +julian::year +operator ""_y(unsigned long long y) NOEXCEPT +{ + return julian::year(static_cast(y)); +} +#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900) + +CONSTDATA julian::last_spec last{}; + +CONSTDATA julian::month jan{1}; +CONSTDATA julian::month feb{2}; +CONSTDATA julian::month mar{3}; +CONSTDATA julian::month apr{4}; +CONSTDATA julian::month may{5}; +CONSTDATA julian::month jun{6}; +CONSTDATA julian::month jul{7}; +CONSTDATA julian::month aug{8}; +CONSTDATA julian::month sep{9}; +CONSTDATA julian::month oct{10}; +CONSTDATA julian::month nov{11}; +CONSTDATA julian::month dec{12}; + +CONSTDATA julian::weekday sun{0u}; +CONSTDATA julian::weekday mon{1u}; +CONSTDATA julian::weekday tue{2u}; +CONSTDATA julian::weekday wed{3u}; +CONSTDATA julian::weekday thu{4u}; +CONSTDATA julian::weekday fri{5u}; +CONSTDATA julian::weekday sat{6u}; + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +} // inline namespace literals +#endif + +// weekday_indexed + +CONSTCD11 +inline +weekday +weekday_indexed::weekday() const NOEXCEPT +{ + return julian::weekday{static_cast(wd_)}; +} + +CONSTCD11 inline unsigned weekday_indexed::index() const NOEXCEPT {return index_;} + +CONSTCD11 +inline +bool +weekday_indexed::ok() const NOEXCEPT +{ + return weekday().ok() && 1 <= index_ && index_ <= 5; +} + +CONSTCD11 +inline +weekday_indexed::weekday_indexed(const julian::weekday& wd, unsigned index) NOEXCEPT + : wd_(static_cast(static_cast(wd))) + , index_(static_cast(index)) + {} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_indexed& wdi) +{ + return os << wdi.weekday() << '[' << wdi.index() << ']'; +} + +CONSTCD11 +inline +weekday_indexed +weekday::operator[](unsigned index) const NOEXCEPT +{ + return {*this, index}; +} + +CONSTCD11 +inline +bool +operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT +{ + return x.weekday() == y.weekday() && x.index() == y.index(); +} + +CONSTCD11 +inline +bool +operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT +{ + return !(x == y); +} + +// weekday_last + +CONSTCD11 inline julian::weekday weekday_last::weekday() const NOEXCEPT {return wd_;} +CONSTCD11 inline bool weekday_last::ok() const NOEXCEPT {return wd_.ok();} +CONSTCD11 inline weekday_last::weekday_last(const julian::weekday& wd) NOEXCEPT : wd_(wd) {} + +CONSTCD11 +inline +bool +operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT +{ + return x.weekday() == y.weekday(); +} + +CONSTCD11 +inline +bool +operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_last& wdl) +{ + return os << wdl.weekday() << "[last]"; +} + +CONSTCD11 +inline +weekday_last +weekday::operator[](last_spec) const NOEXCEPT +{ + return weekday_last{*this}; +} + +// year_month + +CONSTCD11 +inline +year_month::year_month(const julian::year& y, const julian::month& m) NOEXCEPT + : y_(y) + , m_(m) + {} + +CONSTCD11 inline year year_month::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month::month() const NOEXCEPT {return m_;} +CONSTCD11 inline bool year_month::ok() const NOEXCEPT {return y_.ok() && m_.ok();} + +CONSTCD14 +inline +year_month& +year_month::operator+=(const months& dm) NOEXCEPT +{ + *this = *this + dm; + return *this; +} + +CONSTCD14 +inline +year_month& +year_month::operator-=(const months& dm) NOEXCEPT +{ + *this = *this - dm; + return *this; +} + +CONSTCD14 +inline +year_month& +year_month::operator+=(const years& dy) NOEXCEPT +{ + *this = *this + dy; + return *this; +} + +CONSTCD14 +inline +year_month& +year_month::operator-=(const years& dy) NOEXCEPT +{ + *this = *this - dy; + return *this; +} + +CONSTCD11 +inline +bool +operator==(const year_month& x, const year_month& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month& x, const year_month& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_month& x, const year_month& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (x.month() < y.month())); +} + +CONSTCD11 +inline +bool +operator>(const year_month& x, const year_month& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_month& x, const year_month& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_month& x, const year_month& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD14 +inline +year_month +operator+(const year_month& ym, const months& dm) NOEXCEPT +{ + auto dmi = static_cast(static_cast(ym.month())) - 1 + dm.count(); + auto dy = (dmi >= 0 ? dmi : dmi-11) / 12; + dmi = dmi - dy * 12 + 1; + return (ym.year() + years(dy)) / month(static_cast(dmi)); +} + +CONSTCD14 +inline +year_month +operator+(const months& dm, const year_month& ym) NOEXCEPT +{ + return ym + dm; +} + +CONSTCD14 +inline +year_month +operator-(const year_month& ym, const months& dm) NOEXCEPT +{ + return ym + -dm; +} + +CONSTCD11 +inline +months +operator-(const year_month& x, const year_month& y) NOEXCEPT +{ + return (x.year() - y.year()) + + months(static_cast(x.month()) - static_cast(y.month())); +} + +CONSTCD11 +inline +year_month +operator+(const year_month& ym, const years& dy) NOEXCEPT +{ + return (ym.year() + dy) / ym.month(); +} + +CONSTCD11 +inline +year_month +operator+(const years& dy, const year_month& ym) NOEXCEPT +{ + return ym + dy; +} + +CONSTCD11 +inline +year_month +operator-(const year_month& ym, const years& dy) NOEXCEPT +{ + return ym + -dy; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month& ym) +{ + return os << ym.year() << '/' << ym.month(); +} + +// month_day + +CONSTCD11 +inline +month_day::month_day(const julian::month& m, const julian::day& d) NOEXCEPT + : m_(m) + , d_(d) + {} + +CONSTCD11 inline julian::month month_day::month() const NOEXCEPT {return m_;} +CONSTCD11 inline julian::day month_day::day() const NOEXCEPT {return d_;} + +CONSTCD14 +inline +bool +month_day::ok() const NOEXCEPT +{ + CONSTDATA julian::day d[] = { + julian::day(31), julian::day(29), julian::day(31), julian::day(30), + julian::day(31), julian::day(30), julian::day(31), julian::day(31), + julian::day(30), julian::day(31), julian::day(30), julian::day(31) + }; + return m_.ok() && julian::day(1) <= d_ && d_ <= d[static_cast(m_)-1]; +} + +CONSTCD11 +inline +bool +operator==(const month_day& x, const month_day& y) NOEXCEPT +{ + return x.month() == y.month() && x.day() == y.day(); +} + +CONSTCD11 +inline +bool +operator!=(const month_day& x, const month_day& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const month_day& x, const month_day& y) NOEXCEPT +{ + return x.month() < y.month() ? true + : (x.month() > y.month() ? false + : (x.day() < y.day())); +} + +CONSTCD11 +inline +bool +operator>(const month_day& x, const month_day& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const month_day& x, const month_day& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const month_day& x, const month_day& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day& md) +{ + return os << md.month() << '/' << md.day(); +} + +// month_day_last + +CONSTCD11 inline month month_day_last::month() const NOEXCEPT {return m_;} +CONSTCD11 inline bool month_day_last::ok() const NOEXCEPT {return m_.ok();} +CONSTCD11 inline month_day_last::month_day_last(const julian::month& m) NOEXCEPT : m_(m) {} + +CONSTCD11 +inline +bool +operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return x.month() == y.month(); +} + +CONSTCD11 +inline +bool +operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return x.month() < y.month(); +} + +CONSTCD11 +inline +bool +operator>(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day_last& mdl) +{ + return os << mdl.month() << "/last"; +} + +// month_weekday + +CONSTCD11 +inline +month_weekday::month_weekday(const julian::month& m, + const julian::weekday_indexed& wdi) NOEXCEPT + : m_(m) + , wdi_(wdi) + {} + +CONSTCD11 inline month month_weekday::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday_indexed +month_weekday::weekday_indexed() const NOEXCEPT +{ + return wdi_; +} + +CONSTCD11 +inline +bool +month_weekday::ok() const NOEXCEPT +{ + return m_.ok() && wdi_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT +{ + return x.month() == y.month() && x.weekday_indexed() == y.weekday_indexed(); +} + +CONSTCD11 +inline +bool +operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday& mwd) +{ + return os << mwd.month() << '/' << mwd.weekday_indexed(); +} + +// month_weekday_last + +CONSTCD11 +inline +month_weekday_last::month_weekday_last(const julian::month& m, + const julian::weekday_last& wdl) NOEXCEPT + : m_(m) + , wdl_(wdl) + {} + +CONSTCD11 inline month month_weekday_last::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday_last +month_weekday_last::weekday_last() const NOEXCEPT +{ + return wdl_; +} + +CONSTCD11 +inline +bool +month_weekday_last::ok() const NOEXCEPT +{ + return m_.ok() && wdl_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT +{ + return x.month() == y.month() && x.weekday_last() == y.weekday_last(); +} + +CONSTCD11 +inline +bool +operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday_last& mwdl) +{ + return os << mwdl.month() << '/' << mwdl.weekday_last(); +} + +// year_month_day_last + +CONSTCD11 +inline +year_month_day_last::year_month_day_last(const julian::year& y, + const julian::month_day_last& mdl) NOEXCEPT + : y_(y) + , mdl_(mdl) + {} + +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline year year_month_day_last::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_day_last::month() const NOEXCEPT {return mdl_.month();} + +CONSTCD11 +inline +month_day_last +year_month_day_last::month_day_last() const NOEXCEPT +{ + return mdl_; +} + +CONSTCD14 +inline +day +year_month_day_last::day() const NOEXCEPT +{ + CONSTDATA julian::day d[] = { + julian::day(31), julian::day(28), julian::day(31), julian::day(30), + julian::day(31), julian::day(30), julian::day(31), julian::day(31), + julian::day(30), julian::day(31), julian::day(30), julian::day(31) + }; + return month() != feb || !y_.is_leap() ? d[static_cast(month())-1] : julian::day(29); +} + +CONSTCD14 +inline +year_month_day_last::operator sys_days() const NOEXCEPT +{ + return sys_days(year()/month()/day()); +} + +CONSTCD14 +inline +year_month_day_last::operator local_days() const NOEXCEPT +{ + return local_days(year()/month()/day()); +} + +CONSTCD11 +inline +bool +year_month_day_last::ok() const NOEXCEPT +{ + return y_.ok() && mdl_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return x.year() == y.year() && x.month_day_last() == y.month_day_last(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (x.month_day_last() < y.month_day_last())); +} + +CONSTCD11 +inline +bool +operator>(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day_last& ymdl) +{ + return os << ymdl.year() << '/' << ymdl.month_day_last(); +} + +CONSTCD14 +inline +year_month_day_last +operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT +{ + return (ymdl.year() / ymdl.month() + dm) / last; +} + +CONSTCD14 +inline +year_month_day_last +operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT +{ + return ymdl + dm; +} + +CONSTCD14 +inline +year_month_day_last +operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT +{ + return ymdl + (-dm); +} + +CONSTCD11 +inline +year_month_day_last +operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT +{ + return {ymdl.year()+dy, ymdl.month_day_last()}; +} + +CONSTCD11 +inline +year_month_day_last +operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT +{ + return ymdl + dy; +} + +CONSTCD11 +inline +year_month_day_last +operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT +{ + return ymdl + (-dy); +} + +// year_month_day + +CONSTCD11 +inline +year_month_day::year_month_day(const julian::year& y, const julian::month& m, + const julian::day& d) NOEXCEPT + : y_(y) + , m_(m) + , d_(d) + {} + +CONSTCD14 +inline +year_month_day::year_month_day(const year_month_day_last& ymdl) NOEXCEPT + : y_(ymdl.year()) + , m_(ymdl.month()) + , d_(ymdl.day()) + {} + +CONSTCD14 +inline +year_month_day::year_month_day(sys_days dp) NOEXCEPT + : year_month_day(from_days(dp.time_since_epoch())) + {} + +CONSTCD14 +inline +year_month_day::year_month_day(local_days dp) NOEXCEPT + : year_month_day(from_days(dp.time_since_epoch())) + {} + +CONSTCD11 inline year year_month_day::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_day::month() const NOEXCEPT {return m_;} +CONSTCD11 inline day year_month_day::day() const NOEXCEPT {return d_;} + +CONSTCD14 +inline +year_month_day& +year_month_day::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +year_month_day& +year_month_day::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_day& +year_month_day::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_day& +year_month_day::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD14 +inline +days +year_month_day::to_days() const NOEXCEPT +{ + static_assert(std::numeric_limits::digits >= 18, + "This algorithm has not been ported to a 16 bit unsigned integer"); + static_assert(std::numeric_limits::digits >= 20, + "This algorithm has not been ported to a 16 bit signed integer"); + auto const y = static_cast(y_) - (m_ <= feb); + auto const m = static_cast(m_); + auto const d = static_cast(d_); + auto const era = (y >= 0 ? y : y-3) / 4; + auto const yoe = static_cast(y - era * 4); // [0, 3] + auto const doy = (153*(m > 2 ? m-3 : m+9) + 2)/5 + d-1; // [0, 365] + auto const doe = yoe * 365 + doy; // [0, 1460] + return days{era * 1461 + static_cast(doe) - 719470}; +} + +CONSTCD14 +inline +year_month_day::operator sys_days() const NOEXCEPT +{ + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_day::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; +} + +CONSTCD14 +inline +bool +year_month_day::ok() const NOEXCEPT +{ + if (!(y_.ok() && m_.ok())) + return false; + return julian::day(1) <= d_ && d_ <= (y_/m_/last).day(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month() && x.day() == y.day(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (x.month() < y.month() ? true + : (x.month() > y.month() ? false + : (x.day() < y.day())))); +} + +CONSTCD11 +inline +bool +operator>(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day& ymd) +{ + date::detail::save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os << ymd.year() << '-'; + os.width(2); + os << static_cast(ymd.month()) << '-'; + os << ymd.day(); + return os; +} + +CONSTCD14 +inline +year_month_day +year_month_day::from_days(days dp) NOEXCEPT +{ + static_assert(std::numeric_limits::digits >= 18, + "This algorithm has not been ported to a 16 bit unsigned integer"); + static_assert(std::numeric_limits::digits >= 20, + "This algorithm has not been ported to a 16 bit signed integer"); + auto const z = dp.count() + 719470; + auto const era = (z >= 0 ? z : z - 1460) / 1461; + auto const doe = static_cast(z - era * 1461); // [0, 1460] + auto const yoe = (doe - doe/1460) / 365; // [0, 3] + auto const y = static_cast(yoe) + era * 4; + auto const doy = doe - 365*yoe; // [0, 365] + auto const mp = (5*doy + 2)/153; // [0, 11] + auto const d = doy - (153*mp+2)/5 + 1; // [1, 31] + auto const m = mp < 10 ? mp+3 : mp-9; // [1, 12] + return year_month_day{julian::year{y + (m <= 2)}, julian::month(m), julian::day(d)}; +} + +CONSTCD14 +inline +year_month_day +operator+(const year_month_day& ymd, const months& dm) NOEXCEPT +{ + return (ymd.year() / ymd.month() + dm) / ymd.day(); +} + +CONSTCD14 +inline +year_month_day +operator+(const months& dm, const year_month_day& ymd) NOEXCEPT +{ + return ymd + dm; +} + +CONSTCD14 +inline +year_month_day +operator-(const year_month_day& ymd, const months& dm) NOEXCEPT +{ + return ymd + (-dm); +} + +CONSTCD11 +inline +year_month_day +operator+(const year_month_day& ymd, const years& dy) NOEXCEPT +{ + return (ymd.year() + dy) / ymd.month() / ymd.day(); +} + +CONSTCD11 +inline +year_month_day +operator+(const years& dy, const year_month_day& ymd) NOEXCEPT +{ + return ymd + dy; +} + +CONSTCD11 +inline +year_month_day +operator-(const year_month_day& ymd, const years& dy) NOEXCEPT +{ + return ymd + (-dy); +} + +// year_month_weekday + +CONSTCD11 +inline +year_month_weekday::year_month_weekday(const julian::year& y, const julian::month& m, + const julian::weekday_indexed& wdi) + NOEXCEPT + : y_(y) + , m_(m) + , wdi_(wdi) + {} + +CONSTCD14 +inline +year_month_weekday::year_month_weekday(const sys_days& dp) NOEXCEPT + : year_month_weekday(from_days(dp.time_since_epoch())) + {} + +CONSTCD14 +inline +year_month_weekday::year_month_weekday(const local_days& dp) NOEXCEPT + : year_month_weekday(from_days(dp.time_since_epoch())) + {} + +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline year year_month_weekday::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_weekday::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday +year_month_weekday::weekday() const NOEXCEPT +{ + return wdi_.weekday(); +} + +CONSTCD11 +inline +unsigned +year_month_weekday::index() const NOEXCEPT +{ + return wdi_.index(); +} + +CONSTCD11 +inline +weekday_indexed +year_month_weekday::weekday_indexed() const NOEXCEPT +{ + return wdi_; +} + +CONSTCD14 +inline +year_month_weekday::operator sys_days() const NOEXCEPT +{ + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_weekday::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; +} + +CONSTCD14 +inline +bool +year_month_weekday::ok() const NOEXCEPT +{ + if (!y_.ok() || !m_.ok() || !wdi_.weekday().ok() || wdi_.index() < 1) + return false; + if (wdi_.index() <= 4) + return true; + auto d2 = wdi_.weekday() - julian::weekday(y_/m_/1) + days((wdi_.index()-1)*7 + 1); + return static_cast(d2.count()) <= static_cast((y_/m_/last).day()); +} + +CONSTCD14 +inline +year_month_weekday +year_month_weekday::from_days(days d) NOEXCEPT +{ + sys_days dp{d}; + auto const wd = julian::weekday(dp); + auto const ymd = year_month_day(dp); + return {ymd.year(), ymd.month(), wd[(static_cast(ymd.day())-1)/7+1]}; +} + +CONSTCD14 +inline +days +year_month_weekday::to_days() const NOEXCEPT +{ + auto d = sys_days(y_/m_/1); + return (d + (wdi_.weekday() - julian::weekday(d) + days{(wdi_.index()-1)*7}) + ).time_since_epoch(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month() && + x.weekday_indexed() == y.weekday_indexed(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday& ymwdi) +{ + return os << ymwdi.year() << '/' << ymwdi.month() + << '/' << ymwdi.weekday_indexed(); +} + +CONSTCD14 +inline +year_month_weekday +operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT +{ + return (ymwd.year() / ymwd.month() + dm) / ymwd.weekday_indexed(); +} + +CONSTCD14 +inline +year_month_weekday +operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT +{ + return ymwd + dm; +} + +CONSTCD14 +inline +year_month_weekday +operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT +{ + return ymwd + (-dm); +} + +CONSTCD11 +inline +year_month_weekday +operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT +{ + return {ymwd.year()+dy, ymwd.month(), ymwd.weekday_indexed()}; +} + +CONSTCD11 +inline +year_month_weekday +operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT +{ + return ymwd + dy; +} + +CONSTCD11 +inline +year_month_weekday +operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT +{ + return ymwd + (-dy); +} + +// year_month_weekday_last + +CONSTCD11 +inline +year_month_weekday_last::year_month_weekday_last(const julian::year& y, + const julian::month& m, + const julian::weekday_last& wdl) NOEXCEPT + : y_(y) + , m_(m) + , wdl_(wdl) + {} + +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline year year_month_weekday_last::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_weekday_last::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday +year_month_weekday_last::weekday() const NOEXCEPT +{ + return wdl_.weekday(); +} + +CONSTCD11 +inline +weekday_last +year_month_weekday_last::weekday_last() const NOEXCEPT +{ + return wdl_; +} + +CONSTCD14 +inline +year_month_weekday_last::operator sys_days() const NOEXCEPT +{ + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_weekday_last::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; +} + +CONSTCD11 +inline +bool +year_month_weekday_last::ok() const NOEXCEPT +{ + return y_.ok() && m_.ok() && wdl_.ok(); +} + +CONSTCD14 +inline +days +year_month_weekday_last::to_days() const NOEXCEPT +{ + auto const d = sys_days(y_/m_/last); + return (d - (julian::weekday{d} - wdl_.weekday())).time_since_epoch(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month() && + x.weekday_last() == y.weekday_last(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday_last& ymwdl) +{ + return os << ymwdl.year() << '/' << ymwdl.month() << '/' << ymwdl.weekday_last(); +} + +CONSTCD14 +inline +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT +{ + return (ymwdl.year() / ymwdl.month() + dm) / ymwdl.weekday_last(); +} + +CONSTCD14 +inline +year_month_weekday_last +operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT +{ + return ymwdl + dm; +} + +CONSTCD14 +inline +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT +{ + return ymwdl + (-dm); +} + +CONSTCD11 +inline +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT +{ + return {ymwdl.year()+dy, ymwdl.month(), ymwdl.weekday_last()}; +} + +CONSTCD11 +inline +year_month_weekday_last +operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT +{ + return ymwdl + dy; +} + +CONSTCD11 +inline +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT +{ + return ymwdl + (-dy); +} + +// year_month from operator/() + +CONSTCD11 +inline +year_month +operator/(const year& y, const month& m) NOEXCEPT +{ + return {y, m}; +} + +CONSTCD11 +inline +year_month +operator/(const year& y, int m) NOEXCEPT +{ + return y / month(static_cast(m)); +} + +// month_day from operator/() + +CONSTCD11 +inline +month_day +operator/(const month& m, const day& d) NOEXCEPT +{ + return {m, d}; +} + +CONSTCD11 +inline +month_day +operator/(const day& d, const month& m) NOEXCEPT +{ + return m / d; +} + +CONSTCD11 +inline +month_day +operator/(const month& m, int d) NOEXCEPT +{ + return m / day(static_cast(d)); +} + +CONSTCD11 +inline +month_day +operator/(int m, const day& d) NOEXCEPT +{ + return month(static_cast(m)) / d; +} + +CONSTCD11 inline month_day operator/(const day& d, int m) NOEXCEPT {return m / d;} + +// month_day_last from operator/() + +CONSTCD11 +inline +month_day_last +operator/(const month& m, last_spec) NOEXCEPT +{ + return month_day_last{m}; +} + +CONSTCD11 +inline +month_day_last +operator/(last_spec, const month& m) NOEXCEPT +{ + return m/last; +} + +CONSTCD11 +inline +month_day_last +operator/(int m, last_spec) NOEXCEPT +{ + return month(static_cast(m))/last; +} + +CONSTCD11 +inline +month_day_last +operator/(last_spec, int m) NOEXCEPT +{ + return m/last; +} + +// month_weekday from operator/() + +CONSTCD11 +inline +month_weekday +operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT +{ + return {m, wdi}; +} + +CONSTCD11 +inline +month_weekday +operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT +{ + return m / wdi; +} + +CONSTCD11 +inline +month_weekday +operator/(int m, const weekday_indexed& wdi) NOEXCEPT +{ + return month(static_cast(m)) / wdi; +} + +CONSTCD11 +inline +month_weekday +operator/(const weekday_indexed& wdi, int m) NOEXCEPT +{ + return m / wdi; +} + +// month_weekday_last from operator/() + +CONSTCD11 +inline +month_weekday_last +operator/(const month& m, const weekday_last& wdl) NOEXCEPT +{ + return {m, wdl}; +} + +CONSTCD11 +inline +month_weekday_last +operator/(const weekday_last& wdl, const month& m) NOEXCEPT +{ + return m / wdl; +} + +CONSTCD11 +inline +month_weekday_last +operator/(int m, const weekday_last& wdl) NOEXCEPT +{ + return month(static_cast(m)) / wdl; +} + +CONSTCD11 +inline +month_weekday_last +operator/(const weekday_last& wdl, int m) NOEXCEPT +{ + return m / wdl; +} + +// year_month_day from operator/() + +CONSTCD11 +inline +year_month_day +operator/(const year_month& ym, const day& d) NOEXCEPT +{ + return {ym.year(), ym.month(), d}; +} + +CONSTCD11 +inline +year_month_day +operator/(const year_month& ym, int d) NOEXCEPT +{ + return ym / day(static_cast(d)); +} + +CONSTCD11 +inline +year_month_day +operator/(const year& y, const month_day& md) NOEXCEPT +{ + return y / md.month() / md.day(); +} + +CONSTCD11 +inline +year_month_day +operator/(int y, const month_day& md) NOEXCEPT +{ + return year(y) / md; +} + +CONSTCD11 +inline +year_month_day +operator/(const month_day& md, const year& y) NOEXCEPT +{ + return y / md; +} + +CONSTCD11 +inline +year_month_day +operator/(const month_day& md, int y) NOEXCEPT +{ + return year(y) / md; +} + +// year_month_day_last from operator/() + +CONSTCD11 +inline +year_month_day_last +operator/(const year_month& ym, last_spec) NOEXCEPT +{ + return {ym.year(), month_day_last{ym.month()}}; +} + +CONSTCD11 +inline +year_month_day_last +operator/(const year& y, const month_day_last& mdl) NOEXCEPT +{ + return {y, mdl}; +} + +CONSTCD11 +inline +year_month_day_last +operator/(int y, const month_day_last& mdl) NOEXCEPT +{ + return year(y) / mdl; +} + +CONSTCD11 +inline +year_month_day_last +operator/(const month_day_last& mdl, const year& y) NOEXCEPT +{ + return y / mdl; +} + +CONSTCD11 +inline +year_month_day_last +operator/(const month_day_last& mdl, int y) NOEXCEPT +{ + return year(y) / mdl; +} + +// year_month_weekday from operator/() + +CONSTCD11 +inline +year_month_weekday +operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT +{ + return {ym.year(), ym.month(), wdi}; +} + +CONSTCD11 +inline +year_month_weekday +operator/(const year& y, const month_weekday& mwd) NOEXCEPT +{ + return {y, mwd.month(), mwd.weekday_indexed()}; +} + +CONSTCD11 +inline +year_month_weekday +operator/(int y, const month_weekday& mwd) NOEXCEPT +{ + return year(y) / mwd; +} + +CONSTCD11 +inline +year_month_weekday +operator/(const month_weekday& mwd, const year& y) NOEXCEPT +{ + return y / mwd; +} + +CONSTCD11 +inline +year_month_weekday +operator/(const month_weekday& mwd, int y) NOEXCEPT +{ + return year(y) / mwd; +} + +// year_month_weekday_last from operator/() + +CONSTCD11 +inline +year_month_weekday_last +operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT +{ + return {ym.year(), ym.month(), wdl}; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT +{ + return {y, mwdl.month(), mwdl.weekday_last()}; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(int y, const month_weekday_last& mwdl) NOEXCEPT +{ + return year(y) / mwdl; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT +{ + return y / mwdl; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(const month_weekday_last& mwdl, int y) NOEXCEPT +{ + return year(y) / mwdl; +} + +} // namespace julian + +#endif // JULIAN_H diff --git a/vendor/date/ptz.h b/vendor/date/ptz.h new file mode 100644 index 000000000..e496927bd --- /dev/null +++ b/vendor/date/ptz.h @@ -0,0 +1,991 @@ +#ifndef PTZ_H +#define PTZ_H + +// The MIT License (MIT) +// +// Copyright (c) 2017 Howard Hinnant +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +// This header allows Posix-style time zones as specified for TZ here: +// http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03 +// +// Posix::time_zone can be constructed with a posix-style string and then used in +// a zoned_time like so: +// +// zoned_time zt{"EST5EDT,M3.2.0,M11.1.0", +// system_clock::now()}; +// or: +// +// Posix::time_zone tz{"EST5EDT,M3.2.0,M11.1.0"}; +// zoned_time zt{tz, system_clock::now()}; +// +// In C++17 CTAD simplifies this to: +// +// Posix::time_zone tz{"EST5EDT,M3.2.0,M11.1.0"}; +// zoned_time zt{tz, system_clock::now()}; +// +// Extension to the Posix rules to allow a constant daylight saving offset: +// +// If the rule set is missing (everything starting with ','), then +// there must be exactly one abbreviation (std or daylight) with +// length 3 or greater, and that will be used as the constant offset. If +// there are two, the std abbreviation is silently set to "", and the +// result is constant daylight saving. If there are zero abbreviations +// with no rule set, an exception is thrown. +// +// Example: +// "EST5" yields a constant offset of -5h with 0h save and "EST abbreviation. +// "5EDT" yields a constant offset of -4h with 1h save and "EDT" abbreviation. +// "EST5EDT" and "5EDT4" are both equal to "5EDT". +// +// Note, Posix-style time zones are not recommended for all of the reasons described here: +// https://stackoverflow.com/tags/timezone/info +// +// They are provided here as a non-trivial custom time zone example, and if you really +// have to have Posix time zones, you're welcome to use this one. + +#include +#include +#include +#include +#include +#include + +#ifndef HAS_CHRONO_20 +# if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION <= 200100 +# define HAS_CHRONO_20 0 +# else +# define HAS_CHRONO_20 1 +# endif +#endif + +#if HAS_CHRONO_20 + namespace chr = std::chrono; +# define HAS_STRING_VIEW 1 +# include +#else +# include "date/tz.h" + namespace chr = date; +#endif + +namespace Posix +{ + +namespace detail +{ + +#if HAS_STRING_VIEW + +using string_t = std::string_view; + +#else // !HAS_STRING_VIEW + +using string_t = std::string; + +#endif // !HAS_STRING_VIEW + +class rule; + +void throw_invalid(const string_t& s, unsigned i, const string_t& message); +unsigned read_date(const string_t& s, unsigned i, rule& r); +unsigned read_name(const string_t& s, unsigned i, std::string& name); +unsigned read_signed_time(const string_t& s, unsigned i, std::chrono::seconds& t); +unsigned read_unsigned_time(const string_t& s, unsigned i, std::chrono::seconds& t); +unsigned read_unsigned(const string_t& s, unsigned i, unsigned limit, unsigned& u, + const string_t& message = string_t{}); + +class rule +{ + enum {off, J, M, N}; + + chr::month m_; + chr::weekday wd_; + unsigned short n_ : 14; + unsigned short mode_ : 2; + std::chrono::duration time_ = std::chrono::hours{2}; + +public: + rule() : mode_(off) {} + + bool ok() const {return mode_ != off;} + chr::local_seconds operator()(chr::year y) const; + std::string to_string() const; + + friend std::ostream& operator<<(std::ostream& os, const rule& r); + friend unsigned read_date(const string_t& s, unsigned i, rule& r); + friend bool operator==(const rule& x, const rule& y); +}; + +inline +bool +operator==(const rule& x, const rule& y) +{ + if (x.mode_ != y.mode_) + return false; + switch (x.mode_) + { + case rule::J: + case rule::N: + return x.n_ == y.n_; + case rule::M: + return x.m_ == y.m_ && x.n_ == y.n_ && x.wd_ == y.wd_; + default: + return true; + } +} + +inline +bool +operator!=(const rule& x, const rule& y) +{ + return !(x == y); +} + +inline +chr::local_seconds +rule::operator()(chr::year y) const +{ + using chr::local_days; + using chr::January; + using chr::days; + using chr::last; + using sec = std::chrono::seconds; + chr::local_seconds t; + switch (mode_) + { + case J: + t = local_days{y/January/0} + days{n_ + (y.is_leap() && n_ > 59)} + sec{time_}; + break; + case M: + t = (n_ == 5 ? local_days{y/m_/wd_[last]} : local_days{y/m_/wd_[n_]}) + sec{time_}; + break; + case N: + t = local_days{y/January/1} + days{n_} + sec{time_}; + break; + default: + assert(!"rule called with bad mode"); + } + return t; +} + +inline +std::string +rule::to_string() const +{ + using namespace std::chrono; + auto print_offset = [](seconds off) + { + std::string nm; + if (off != hours{2}) + { + chr::hh_mm_ss offset{off}; + nm = '/'; + nm += std::to_string(offset.hours().count()); + if (offset.minutes() != minutes{0} || offset.seconds() != seconds{0}) + { + nm += ':'; + if (offset.minutes() < minutes{10}) + nm += '0'; + nm += std::to_string(offset.minutes().count()); + if (offset.seconds() != seconds{0}) + { + nm += ':'; + if (offset.seconds() < seconds{10}) + nm += '0'; + nm += std::to_string(offset.seconds().count()); + } + } + } + return nm; + }; + + std::string nm; + switch (mode_) + { + case rule::J: + nm = 'J'; + nm += std::to_string(n_); + break; + case rule::M: + nm = 'M'; + nm += std::to_string(static_cast(m_)); + nm += '.'; + nm += std::to_string(n_); + nm += '.'; + nm += std::to_string(wd_.c_encoding()); + break; + case rule::N: + nm = std::to_string(n_); + break; + default: + break; + } + nm += print_offset(time_); + return nm; +} + +inline +std::ostream& +operator<<(std::ostream& os, const rule& r) +{ + switch (r.mode_) + { + case rule::J: +#if HAS_CHRONO_20 + os << "J " << r.n_ << std::format("{:%T}", r.time_); +#else + os << 'J' << r.n_ << date::format(" %T", r.time_); +#endif + break; + case rule::M: + if (r.n_ == 5) + os << r.m_/r.wd_[chr::last]; + else + os << r.m_/r.wd_[r.n_]; +#if HAS_CHRONO_20 + os << ' ' << std::format("{:%T}", r.time_); +#else + os << date::format(" %T", r.time_); +#endif + break; + case rule::N: +#if HAS_CHRONO_20 + os << r.n_ << ' ' << std::format("{:%T}", r.time_); +#else + os << r.n_ << date::format(" %T", r.time_); +#endif + break; + default: + break; + } + return os; +} + +} // namespace detail + +class time_zone +{ + std::string std_abbrev_; + std::string dst_abbrev_ = {}; + std::chrono::seconds offset_; + std::chrono::seconds save_ = std::chrono::hours{1}; + detail::rule start_rule_; + detail::rule end_rule_; + +public: + explicit time_zone(const detail::string_t& name); + + template + chr::sys_info get_info(chr::sys_time st) const; + template + chr::local_info get_info(chr::local_time tp) const; + + template + chr::sys_time::type> + to_sys(chr::local_time tp) const; + + template + chr::sys_time::type> + to_sys(chr::local_time tp, chr::choose z) const; + + template + chr::local_time::type> + to_local(chr::sys_time tp) const; + + friend std::ostream& operator<<(std::ostream& os, const time_zone& z); + + const time_zone* operator->() const {return this;} + + std::string name() const; + + friend bool operator==(const time_zone& x, const time_zone& y); + +private: + chr::sys_seconds get_start(chr::year y) const; + chr::sys_seconds get_prev_start(chr::year y) const; + chr::sys_seconds get_next_start(chr::year y) const; + chr::sys_seconds get_end(chr::year y) const; + chr::sys_seconds get_prev_end(chr::year y) const; + chr::sys_seconds get_next_end(chr::year y) const; + chr::sys_info contant_offset() const; +}; + +inline +chr::sys_seconds +time_zone::get_start(chr::year y) const +{ + return chr::sys_seconds{(start_rule_(y) - offset_).time_since_epoch()}; +} + +inline +chr::sys_seconds +time_zone::get_prev_start(chr::year y) const +{ + return chr::sys_seconds{(start_rule_(--y) - offset_).time_since_epoch()}; +} + +inline +chr::sys_seconds +time_zone::get_next_start(chr::year y) const +{ + return chr::sys_seconds{(start_rule_(++y) - offset_).time_since_epoch()}; +} + +inline +chr::sys_seconds +time_zone::get_end(chr::year y) const +{ + return chr::sys_seconds{(end_rule_(y) - (offset_ + save_)).time_since_epoch()}; +} + +inline +chr::sys_seconds +time_zone::get_prev_end(chr::year y) const +{ + return chr::sys_seconds{(end_rule_(--y) - (offset_ + save_)).time_since_epoch()}; +} + +inline +chr::sys_seconds +time_zone::get_next_end(chr::year y) const +{ + return chr::sys_seconds{(end_rule_(++y) - (offset_ + save_)).time_since_epoch()}; +} + +inline +chr::sys_info +time_zone::contant_offset() const +{ + using chr::year; + using chr::sys_info; + using chr::sys_days; + using chr::January; + using chr::December; + using chr::last; + using chr::days; + using std::chrono::minutes; + sys_info r; + r.begin = sys_days{year::min()/January/1}; + r.end = sys_days{year::max()/December/last} + days{1} - std::chrono::seconds{1}; + if (std_abbrev_.size() > 0) + { + r.abbrev = std_abbrev_; + r.offset = offset_; + r.save = {}; + } + else + { + r.abbrev = dst_abbrev_; + r.offset = offset_ + save_; + r.save = chr::ceil(save_); + } + return r; +} + +inline +time_zone::time_zone(const detail::string_t& s) +{ + using detail::read_name; + using detail::read_signed_time; + using detail::throw_invalid; + auto i = read_name(s, 0, std_abbrev_); + auto std_name_i = i; + auto abbrev_name_i = i; + i = read_signed_time(s, i, offset_); + offset_ = -offset_; + if (i != s.size()) + { + i = read_name(s, i, dst_abbrev_); + abbrev_name_i = i; + if (i != s.size()) + { + if (s[i] != ',') + { + i = read_signed_time(s, i, save_); + save_ = -save_ - offset_; + } + if (i != s.size()) + { + if (s[i] != ',') + throw_invalid(s, i, "Expecting end of string or ',' to start rule"); + ++i; + i = read_date(s, i, start_rule_); + if (i == s.size() || s[i] != ',') + throw_invalid(s, i, "Expecting ',' and then the ending rule"); + ++i; + i = read_date(s, i, end_rule_); + if (i != s.size()) + throw_invalid(s, i, "Found unexpected trailing characters"); + } + } + } + if (start_rule_.ok()) + { + if (std_abbrev_.size() < 3) + throw_invalid(s, std_name_i, "Zone with rules must have a std" + " abbreviation of length 3 or greater"); + if (dst_abbrev_.size() < 3) + throw_invalid(s, abbrev_name_i, "Zone with rules must have a daylight" + " abbreviation of length 3 or greater"); + } + else + { + if (dst_abbrev_.size() >= 3) + { + std_abbrev_.clear(); + } + else if (std_abbrev_.size() < 3) + { + throw_invalid(s, std_name_i, "Zone must have at least one abbreviation" + " of length 3 or greater"); + } + else + { + dst_abbrev_.clear(); + save_ = {}; + } + } +} + +template +chr::sys_info +time_zone::get_info(chr::sys_time st) const +{ + using chr::sys_info; + using chr::year_month_day; + using chr::sys_days; + using chr::floor; + using chr::ceil; + using chr::days; + using chr::year; + using chr::January; + using chr::December; + using chr::last; + using std::chrono::minutes; + sys_info r{}; + r.offset = offset_; + if (start_rule_.ok()) + { + auto y = year_month_day{floor(st)}.year(); + if (st >= get_next_start(y)) + ++y; + else if (st < get_prev_end(y)) + --y; + auto start = get_start(y); + auto end = get_end(y); + if (start <= end) // (northern hemisphere) + { + if (start <= st && st < end) + { + r.begin = start; + r.end = end; + r.offset += save_; + r.save = ceil(save_); + r.abbrev = dst_abbrev_; + } + else if (st < start) + { + r.begin = get_prev_end(y); + r.end = start; + r.abbrev = std_abbrev_; + } + else // st >= end + { + r.begin = end; + r.end = get_next_start(y); + r.abbrev = std_abbrev_; + } + } + else // end < start (southern hemisphere) + { + if (end <= st && st < start) + { + r.begin = end; + r.end = start; + r.abbrev = std_abbrev_; + } + else if (st < end) + { + r.begin = get_prev_start(y); + r.end = end; + r.offset += save_; + r.save = ceil(save_); + r.abbrev = dst_abbrev_; + } + else // st >= start + { + r.begin = start; + r.end = get_next_end(y); + r.offset += save_; + r.save = ceil(save_); + r.abbrev = dst_abbrev_; + } + } + } + else + r = contant_offset(); + using seconds = std::chrono::seconds; + assert(r.begin <= floor(st) && floor(st) <= r.end); + return r; +} + +template +chr::local_info +time_zone::get_info(chr::local_time tp) const +{ + using chr::local_info; + using chr::year_month_day; + using chr::days; + using chr::sys_days; + using chr::sys_seconds; + using chr::year; + using chr::ceil; + using chr::January; + using chr::December; + using chr::last; + using std::chrono::seconds; + using std::chrono::minutes; + local_info r{}; + using chr::floor; + if (start_rule_.ok()) + { + auto y = year_month_day{floor(tp)}.year(); + auto start = get_start(y); + auto end = get_end(y); + auto utcs = sys_seconds{floor(tp - offset_).time_since_epoch()}; + auto utcd = sys_seconds{floor(tp - (offset_ + save_)).time_since_epoch()}; + auto northern = start <= end; + if ((utcs < start) != (utcd < start)) + { + if (northern) + r.first.begin = get_prev_end(y); + else + r.first.begin = end; + r.first.end = start; + r.first.offset = offset_; + r.first.abbrev = std_abbrev_; + r.second.begin = start; + if (northern) + r.second.end = end; + else + r.second.end = get_next_end(y); + r.second.abbrev = dst_abbrev_; + r.second.offset = offset_ + save_; + r.second.save = ceil(save_); + r.result = save_ > seconds{0} ? local_info::nonexistent + : local_info::ambiguous; + } + else if ((utcs < end) != (utcd < end)) + { + if (northern) + r.first.begin = start; + else + r.first.begin = get_prev_start(y); + r.first.end = end; + r.first.offset = offset_ + save_; + r.first.save = ceil(save_); + r.first.abbrev = dst_abbrev_; + r.second.begin = end; + if (northern) + r.second.end = get_next_start(y); + else + r.second.end = start; + r.second.abbrev = std_abbrev_; + r.second.offset = offset_; + r.result = save_ > seconds{0} ? local_info::ambiguous + : local_info::nonexistent; + } + else + r.first = get_info(utcs); + } + else + r.first = contant_offset(); + return r; +} + +template +chr::sys_time::type> +time_zone::to_sys(chr::local_time tp) const +{ + using chr::local_info; + using chr::sys_time; + using chr::ambiguous_local_time; + using chr::nonexistent_local_time; + auto i = get_info(tp); + if (i.result == local_info::nonexistent) + throw nonexistent_local_time(tp, i); + else if (i.result == local_info::ambiguous) + throw ambiguous_local_time(tp, i); + return sys_time{tp.time_since_epoch()} - i.first.offset; +} + +template +chr::sys_time::type> +time_zone::to_sys(chr::local_time tp, chr::choose z) const +{ + using chr::local_info; + using chr::sys_time; + using chr::choose; + auto i = get_info(tp); + if (i.result == local_info::nonexistent) + { + return i.first.end; + } + else if (i.result == local_info::ambiguous) + { + if (z == choose::latest) + return sys_time{tp.time_since_epoch()} - i.second.offset; + } + return sys_time{tp.time_since_epoch()} - i.first.offset; +} + +template +chr::local_time::type> +time_zone::to_local(chr::sys_time tp) const +{ + using chr::local_time; + using std::chrono::seconds; + using LT = local_time::type>; + auto i = get_info(tp); + return LT{(tp + i.offset).time_since_epoch()}; +} + +inline +std::ostream& +operator<<(std::ostream& os, const time_zone& z) +{ + using chr::operator<<; + os << '{'; +#if HAS_CHRONO_20 + os << z.std_abbrev_ << ", " << z.dst_abbrev_ << ", " << std::format("{:%T, }", z.offset_) + << std::format("{:%T, [}", z.save_) << z.start_rule_ << ", " << z.end_rule_ << ")}"; +#else + os << z.std_abbrev_ << ", " << z.dst_abbrev_ << date::format(", %T, ", z.offset_) + << date::format("%T, [", z.save_) << z.start_rule_ << ", " << z.end_rule_ << ")}"; +#endif + return os; +} + +inline +std::string +time_zone::name() const +{ + using namespace chr; + using namespace std::chrono; + auto print_abbrev = [](std::string const& nm) + { + if (std::any_of(nm.begin(), nm.end(), + [](char c) + { + return !std::isalpha(c); + })) + { + return '<' + nm + '>'; + } + return nm; + }; + auto print_offset = [](seconds off) + { + std::string nm; + chr::hh_mm_ss offset{-off}; + if (offset.is_negative()) + nm += '-'; + nm += std::to_string(offset.hours().count()); + if (offset.minutes() != minutes{0} || offset.seconds() != seconds{0}) + { + nm += ':'; + if (offset.minutes() < minutes{10}) + nm += '0'; + nm += std::to_string(offset.minutes().count()); + if (offset.seconds() != seconds{0}) + { + nm += ':'; + if (offset.seconds() < seconds{10}) + nm += '0'; + nm += std::to_string(offset.seconds().count()); + } + } + return nm; + }; + auto nm = print_abbrev(std_abbrev_); + nm += print_offset(offset_); + if (!dst_abbrev_.empty()) + { + nm += print_abbrev(dst_abbrev_); + if (save_ != hours{1}) + nm += print_offset(offset_+save_); + if (start_rule_.ok()) + { + nm += ','; + nm += start_rule_.to_string(); + nm += ','; + nm += end_rule_.to_string(); + } + } + return nm; +} + +inline +bool +operator==(const time_zone& x, const time_zone& y) +{ + return x.std_abbrev_ == y.std_abbrev_ && + x.dst_abbrev_ == y. dst_abbrev_ && + x.offset_ == y.offset_ && + x.save_ == y.save_ && + x.start_rule_ == y.start_rule_ && + x.end_rule_ == y.end_rule_; +} + +inline +bool +operator!=(const time_zone& x, const time_zone& y) +{ + return !(x == y); +} + +namespace detail +{ + +inline +void +throw_invalid(const string_t& s, unsigned i, const string_t& message) +{ + throw std::runtime_error(std::string("Invalid time_zone initializer.\n") + + std::string(message) + ":\n" + + std::string(s) + '\n' + + "\x1b[1;32m" + + std::string(i, '~') + '^' + + std::string(i < s.size() ? s.size()-i-1 : 0, '~') + + "\x1b[0m"); +} + +inline +unsigned +read_date(const string_t& s, unsigned i, rule& r) +{ + using chr::month; + using chr::weekday; + if (i == s.size()) + throw_invalid(s, i, "Expected rule but found end of string"); + if (s[i] == 'J') + { + ++i; + unsigned n; + i = read_unsigned(s, i, 3, n, "Expected to find the Julian day [1, 365]"); + if (!(1 <= n && n <= 365)) + throw_invalid(s, i-1, "Expected Julian day to be in the range [1, 365]"); + r.mode_ = rule::J; + r.n_ = n; + } + else if (s[i] == 'M') + { + ++i; + unsigned m; + i = read_unsigned(s, i, 2, m, "Expected to find month [1, 12]"); + if (!(1 <= m && m <= 12)) + throw_invalid(s, i-1, "Expected month to be in the range [1, 12]"); + if (i == s.size() || s[i] != '.') + throw_invalid(s, i, "Expected '.' after month"); + ++i; + unsigned n; + i = read_unsigned(s, i, 1, n, "Expected to find week number [1, 5]"); + if (!(1 <= n && n <= 5)) + throw_invalid(s, i-1, "Expected week number to be in the range [1, 5]"); + if (i == s.size() || s[i] != '.') + throw_invalid(s, i, "Expected '.' after weekday index"); + ++i; + unsigned wd; + i = read_unsigned(s, i, 1, wd, "Expected to find day of week [0, 6]"); + if (wd > 6) + throw_invalid(s, i-1, "Expected day of week to be in the range [0, 6]"); + r.mode_ = rule::M; + r.m_ = month{m}; + r.wd_ = weekday{wd}; + r.n_ = n; + } + else if (std::isdigit(s[i])) + { + unsigned n; + i = read_unsigned(s, i, 3, n); + if (n > 365) + throw_invalid(s, i-1, "Expected Julian day to be in the range [0, 365]"); + r.mode_ = rule::N; + r.n_ = n; + } + else + throw_invalid(s, i, "Expected 'J', 'M', or a digit to start rule"); + if (i != s.size() && s[i] == '/') + { + ++i; + std::chrono::seconds t; + i = read_unsigned_time(s, i, t); + r.time_ = t; + } + return i; +} + +inline +unsigned +read_name(const string_t& s, unsigned i, std::string& name) +{ + if (i == s.size()) + throw_invalid(s, i, "Expected a name but found end of string"); + if (s[i] == '<') + { + ++i; + while (true) + { + if (i == s.size()) + throw_invalid(s, i, + "Expected to find closing '>', but found end of string"); + if (s[i] == '>') + break; + name.push_back(s[i]); + ++i; + } + ++i; + } + else + { + while (i != s.size() && std::isalpha(s[i])) + { + name.push_back(s[i]); + ++i; + } + } + return i; +} + +inline +unsigned +read_signed_time(const string_t& s, unsigned i, + std::chrono::seconds& t) +{ + if (i == s.size()) + throw_invalid(s, i, "Expected to read signed time, but found end of string"); + bool negative = false; + if (s[i] == '-') + { + negative = true; + ++i; + } + else if (s[i] == '+') + ++i; + i = read_unsigned_time(s, i, t); + if (negative) + t = -t; + return i; +} + +inline +unsigned +read_unsigned_time(const string_t& s, unsigned i, std::chrono::seconds& t) +{ + using std::chrono::seconds; + using std::chrono::minutes; + using std::chrono::hours; + if (i == s.size()) + throw_invalid(s, i, "Expected to read unsigned time, but found end of string"); + unsigned x; + i = read_unsigned(s, i, 2, x, "Expected to find hours [0, 24]"); + if (x > 24) + throw_invalid(s, i-1, "Expected hours to be in the range [0, 24]"); + t = hours{x}; + if (i != s.size() && s[i] == ':') + { + ++i; + i = read_unsigned(s, i, 2, x, "Expected to find minutes [0, 59]"); + if (x > 59) + throw_invalid(s, i-1, "Expected minutes to be in the range [0, 59]"); + t += minutes{x}; + if (i != s.size() && s[i] == ':') + { + ++i; + i = read_unsigned(s, i, 2, x, "Expected to find seconds [0, 59]"); + if (x > 59) + throw_invalid(s, i-1, "Expected seconds to be in the range [0, 59]"); + t += seconds{x}; + } + } + return i; +} + +inline +unsigned +read_unsigned(const string_t& s, unsigned i, unsigned limit, unsigned& u, + const string_t& message) +{ + if (i == s.size() || !std::isdigit(s[i])) + throw_invalid(s, i, message); + u = static_cast(s[i] - '0'); + unsigned count = 1; + for (++i; count < limit && i != s.size() && std::isdigit(s[i]); ++i, ++count) + u = u * 10 + static_cast(s[i] - '0'); + return i; +} + +} // namespace detail + +} // namespace Posix + +#if HAS_CHRONO_20 +namespace std::chrono +#else +namespace date +#endif +{ + +template <> +struct zoned_traits +{ + +#if HAS_STRING_VIEW + + static + Posix::time_zone + locate_zone(std::string_view name) + { + return Posix::time_zone{name}; + } + +#else // !HAS_STRING_VIEW + + static + Posix::time_zone + locate_zone(const std::string& name) + { + return Posix::time_zone{name}; + } + + static + Posix::time_zone + locate_zone(const char* name) + { + return Posix::time_zone{name}; + } + +#endif // !HAS_STRING_VIEW + +}; + +} // namespace chr + +#endif // PTZ_H diff --git a/vendor/date/solar_hijri.h b/vendor/date/solar_hijri.h new file mode 100644 index 000000000..2f97f6037 --- /dev/null +++ b/vendor/date/solar_hijri.h @@ -0,0 +1,3151 @@ +#ifndef SOLAR_HIJRI_H +#define SOLAR_HIJRI_H + +// The MIT License (MIT) +// +// Copyright (c) 2016 Howard Hinnant +// Copyright (c) 2019 Asad. Gharighi +// +// Calculations are based on: +// https://www.timeanddate.com/calendar/persian-calendar.html +// and follow style +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// Our apologies. When the previous paragraph was written, lowercase had not yet +// been invented (that would involve another several millennia of evolution). +// We did not mean to shout. + +#include "date.h" + +namespace solar_hijri +{ + +namespace internal +{ +static const auto epoch = static_cast(2121446); +static const auto days_in_era = static_cast(1029983); +static const auto years_in_era = static_cast(2820); +static const auto unix_time_shift = static_cast(2440588); +auto const years_in_first_cycle = static_cast(29); +auto const years_in_other_cycles = static_cast(33); +auto const years_in_period = static_cast(128); // 29 + 3*33 +auto const days_in_first_cycle = static_cast(10592); // 28/4 + 29*365 +auto const days_in_other_cycles = static_cast(12053); // 32/4 + 33*365 +auto const days_in_period = static_cast(46751); // days_in_first_cycle + 3*days_in_other_cycles; +} + +// durations + +using days = date::days; + +using weeks = date::weeks; + +using years = std::chrono::duration + , days::period>>; + +using months = std::chrono::duration + >>; + +// time_point + +using sys_days = date::sys_days; +using local_days = date::local_days; + +// types + +struct last_spec +{ + explicit last_spec() = default; +}; + +class day; +class month; +class year; + +class weekday; +class weekday_indexed; +class weekday_last; + +class month_day; +class month_day_last; +class month_weekday; +class month_weekday_last; + +class year_month; + +class year_month_day; +class year_month_day_last; +class year_month_weekday; +class year_month_weekday_last; + +// date composition operators + +CONSTCD11 year_month operator/(const year& y, const month& m) NOEXCEPT; +CONSTCD11 year_month operator/(const year& y, int m) NOEXCEPT; + +CONSTCD11 month_day operator/(const day& d, const month& m) NOEXCEPT; +CONSTCD11 month_day operator/(const day& d, int m) NOEXCEPT; +CONSTCD11 month_day operator/(const month& m, const day& d) NOEXCEPT; +CONSTCD11 month_day operator/(const month& m, int d) NOEXCEPT; +CONSTCD11 month_day operator/(int m, const day& d) NOEXCEPT; + +CONSTCD11 month_day_last operator/(const month& m, last_spec) NOEXCEPT; +CONSTCD11 month_day_last operator/(int m, last_spec) NOEXCEPT; +CONSTCD11 month_day_last operator/(last_spec, const month& m) NOEXCEPT; +CONSTCD11 month_day_last operator/(last_spec, int m) NOEXCEPT; + +CONSTCD11 month_weekday operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT; +CONSTCD11 month_weekday operator/(int m, const weekday_indexed& wdi) NOEXCEPT; +CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT; +CONSTCD11 month_weekday operator/(const weekday_indexed& wdi, int m) NOEXCEPT; + +CONSTCD11 month_weekday_last operator/(const month& m, const weekday_last& wdl) NOEXCEPT; +CONSTCD11 month_weekday_last operator/(int m, const weekday_last& wdl) NOEXCEPT; +CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, const month& m) NOEXCEPT; +CONSTCD11 month_weekday_last operator/(const weekday_last& wdl, int m) NOEXCEPT; + +CONSTCD11 year_month_day operator/(const year_month& ym, const day& d) NOEXCEPT; +CONSTCD11 year_month_day operator/(const year_month& ym, int d) NOEXCEPT; +CONSTCD11 year_month_day operator/(const year& y, const month_day& md) NOEXCEPT; +CONSTCD11 year_month_day operator/(int y, const month_day& md) NOEXCEPT; +CONSTCD11 year_month_day operator/(const month_day& md, const year& y) NOEXCEPT; +CONSTCD11 year_month_day operator/(const month_day& md, int y) NOEXCEPT; + +CONSTCD11 + year_month_day_last operator/(const year_month& ym, last_spec) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(const year& y, const month_day_last& mdl) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(int y, const month_day_last& mdl) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(const month_day_last& mdl, const year& y) NOEXCEPT; +CONSTCD11 + year_month_day_last operator/(const month_day_last& mdl, int y) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const year& y, const month_weekday& mwd) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(int y, const month_weekday& mwd) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const month_weekday& mwd, const year& y) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator/(const month_weekday& mwd, int y) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(int y, const month_weekday_last& mwdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator/(const month_weekday_last& mwdl, int y) NOEXCEPT; + +// Detailed interface + +// day + +class day +{ + unsigned char d_; + +public: + day() = default; + explicit CONSTCD11 day(unsigned d) NOEXCEPT; + + CONSTCD14 day& operator++() NOEXCEPT; + CONSTCD14 day operator++(int) NOEXCEPT; + CONSTCD14 day& operator--() NOEXCEPT; + CONSTCD14 day operator--(int) NOEXCEPT; + + CONSTCD14 day& operator+=(const days& d) NOEXCEPT; + CONSTCD14 day& operator-=(const days& d) NOEXCEPT; + + CONSTCD11 explicit operator unsigned() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator!=(const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator< (const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator> (const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator<=(const day& x, const day& y) NOEXCEPT; +CONSTCD11 bool operator>=(const day& x, const day& y) NOEXCEPT; + +CONSTCD11 day operator+(const day& x, const days& y) NOEXCEPT; +CONSTCD11 day operator+(const days& x, const day& y) NOEXCEPT; +CONSTCD11 day operator-(const day& x, const days& y) NOEXCEPT; +CONSTCD11 days operator-(const day& x, const day& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const day& d); + +// month + +class month +{ + unsigned char m_; + +public: + month() = default; + explicit CONSTCD11 month(unsigned m) NOEXCEPT; + + CONSTCD14 month& operator++() NOEXCEPT; + CONSTCD14 month operator++(int) NOEXCEPT; + CONSTCD14 month& operator--() NOEXCEPT; + CONSTCD14 month operator--(int) NOEXCEPT; + + CONSTCD14 month& operator+=(const months& m) NOEXCEPT; + CONSTCD14 month& operator-=(const months& m) NOEXCEPT; + + CONSTCD11 explicit operator unsigned() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator< (const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator> (const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator<=(const month& x, const month& y) NOEXCEPT; +CONSTCD11 bool operator>=(const month& x, const month& y) NOEXCEPT; + +CONSTCD14 month operator+(const month& x, const months& y) NOEXCEPT; +CONSTCD14 month operator+(const months& x, const month& y) NOEXCEPT; +CONSTCD14 month operator-(const month& x, const months& y) NOEXCEPT; +CONSTCD14 months operator-(const month& x, const month& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month& m); + +// year + +class year +{ + short y_; + +public: + year() = default; + explicit CONSTCD11 year(int y) NOEXCEPT; + + CONSTCD14 year& operator++() NOEXCEPT; + CONSTCD14 year operator++(int) NOEXCEPT; + CONSTCD14 year& operator--() NOEXCEPT; + CONSTCD14 year operator--(int) NOEXCEPT; + + CONSTCD14 year& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year& operator-=(const years& y) NOEXCEPT; + + CONSTCD14 bool is_leap() const NOEXCEPT; + + CONSTCD11 explicit operator int() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; + + static CONSTCD11 year min() NOEXCEPT; + static CONSTCD11 year max() NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator< (const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator> (const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year& x, const year& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year& x, const year& y) NOEXCEPT; + +CONSTCD11 year operator+(const year& x, const years& y) NOEXCEPT; +CONSTCD11 year operator+(const years& x, const year& y) NOEXCEPT; +CONSTCD11 year operator-(const year& x, const years& y) NOEXCEPT; +CONSTCD11 years operator-(const year& x, const year& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year& y); + +// weekday + +class weekday +{ + unsigned char wd_; +public: + weekday() = default; + explicit CONSTCD11 weekday(unsigned wd) NOEXCEPT; + explicit weekday(int) = delete; + CONSTCD11 weekday(const sys_days& dp) NOEXCEPT; + CONSTCD11 explicit weekday(const local_days& dp) NOEXCEPT; + + CONSTCD14 weekday& operator++() NOEXCEPT; + CONSTCD14 weekday operator++(int) NOEXCEPT; + CONSTCD14 weekday& operator--() NOEXCEPT; + CONSTCD14 weekday operator--(int) NOEXCEPT; + + CONSTCD14 weekday& operator+=(const days& d) NOEXCEPT; + CONSTCD14 weekday& operator-=(const days& d) NOEXCEPT; + + CONSTCD11 explicit operator unsigned() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; + + CONSTCD11 weekday_indexed operator[](unsigned index) const NOEXCEPT; + CONSTCD11 weekday_last operator[](last_spec) const NOEXCEPT; + +private: + static CONSTCD11 unsigned char weekday_from_days(int z) NOEXCEPT; +}; + +CONSTCD11 bool operator==(const weekday& x, const weekday& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weekday& x, const weekday& y) NOEXCEPT; + +CONSTCD14 weekday operator+(const weekday& x, const days& y) NOEXCEPT; +CONSTCD14 weekday operator+(const days& x, const weekday& y) NOEXCEPT; +CONSTCD14 weekday operator-(const weekday& x, const days& y) NOEXCEPT; +CONSTCD14 days operator-(const weekday& x, const weekday& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday& wd); + +// weekday_indexed + +class weekday_indexed +{ + unsigned char wd_ : 4; + unsigned char index_ : 4; + +public: + weekday_indexed() = default; + CONSTCD11 weekday_indexed(const solar_hijri::weekday& wd, unsigned index) NOEXCEPT; + + CONSTCD11 solar_hijri::weekday weekday() const NOEXCEPT; + CONSTCD11 unsigned index() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_indexed& wdi); + +// weekday_last + +class weekday_last +{ + solar_hijri::weekday wd_; + +public: + weekday_last() = default; + explicit CONSTCD11 weekday_last(const solar_hijri::weekday& wd) NOEXCEPT; + + CONSTCD11 solar_hijri::weekday weekday() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT; +CONSTCD11 bool operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_last& wdl); + +// year_month + +class year_month +{ + solar_hijri::year y_; + solar_hijri::month m_; + +public: + year_month() = default; + CONSTCD11 year_month(const solar_hijri::year& y, const solar_hijri::month& m) NOEXCEPT; + + CONSTCD11 solar_hijri::year year() const NOEXCEPT; + CONSTCD11 solar_hijri::month month() const NOEXCEPT; + + CONSTCD14 year_month& operator+=(const months& dm) NOEXCEPT; + CONSTCD14 year_month& operator-=(const months& dm) NOEXCEPT; + CONSTCD14 year_month& operator+=(const years& dy) NOEXCEPT; + CONSTCD14 year_month& operator-=(const years& dy) NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator< (const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator> (const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year_month& x, const year_month& y) NOEXCEPT; + +CONSTCD14 year_month operator+(const year_month& ym, const months& dm) NOEXCEPT; +CONSTCD14 year_month operator+(const months& dm, const year_month& ym) NOEXCEPT; +CONSTCD14 year_month operator-(const year_month& ym, const months& dm) NOEXCEPT; + +CONSTCD11 months operator-(const year_month& x, const year_month& y) NOEXCEPT; +CONSTCD11 year_month operator+(const year_month& ym, const years& dy) NOEXCEPT; +CONSTCD11 year_month operator+(const years& dy, const year_month& ym) NOEXCEPT; +CONSTCD11 year_month operator-(const year_month& ym, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month& ym); + +// month_day + +class month_day +{ + solar_hijri::month m_; + solar_hijri::day d_; + +public: + month_day() = default; + CONSTCD11 month_day(const solar_hijri::month& m, const solar_hijri::day& d) NOEXCEPT; + + CONSTCD11 solar_hijri::month month() const NOEXCEPT; + CONSTCD11 solar_hijri::day day() const NOEXCEPT; + + CONSTCD14 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator< (const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator> (const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator<=(const month_day& x, const month_day& y) NOEXCEPT; +CONSTCD11 bool operator>=(const month_day& x, const month_day& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day& md); + +// month_day_last + +class month_day_last +{ + solar_hijri::month m_; + +public: + month_day_last() = default; + CONSTCD11 explicit month_day_last(const solar_hijri::month& m) NOEXCEPT; + + CONSTCD11 solar_hijri::month month() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator< (const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator> (const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT; +CONSTCD11 bool operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day_last& mdl); + +// month_weekday + +class month_weekday +{ + solar_hijri::month m_; + solar_hijri::weekday_indexed wdi_; +public: + month_weekday() = default; + CONSTCD11 month_weekday(const solar_hijri::month& m, + const solar_hijri::weekday_indexed& wdi) NOEXCEPT; + + CONSTCD11 solar_hijri::month month() const NOEXCEPT; + CONSTCD11 solar_hijri::weekday_indexed weekday_indexed() const NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT; +CONSTCD11 bool operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday& mwd); + +// month_weekday_last + +class month_weekday_last +{ + solar_hijri::month m_; + solar_hijri::weekday_last wdl_; + +public: + month_weekday_last() = default; + CONSTCD11 month_weekday_last(const solar_hijri::month& m, + const solar_hijri::weekday_last& wd) NOEXCEPT; + + CONSTCD11 solar_hijri::month month() const NOEXCEPT; + CONSTCD11 solar_hijri::weekday_last weekday_last() const NOEXCEPT; + + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 + bool operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT; +CONSTCD11 + bool operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday_last& mwdl); + +// class year_month_day + +class year_month_day +{ + solar_hijri::year y_; + solar_hijri::month m_; + solar_hijri::day d_; + +public: + year_month_day() = default; + CONSTCD11 year_month_day(const solar_hijri::year& y, const solar_hijri::month& m, + const solar_hijri::day& d) NOEXCEPT; + CONSTCD14 year_month_day(const year_month_day_last& ymdl) NOEXCEPT; + + CONSTCD14 year_month_day(sys_days dp) NOEXCEPT; + CONSTCD14 explicit year_month_day(local_days dp) NOEXCEPT; + + CONSTCD14 year_month_day& operator+=(const months& m) NOEXCEPT; + CONSTCD14 year_month_day& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_day& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_day& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 solar_hijri::year year() const NOEXCEPT; + CONSTCD11 solar_hijri::month month() const NOEXCEPT; + CONSTCD11 solar_hijri::day day() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD14 bool ok() const NOEXCEPT; + +private: + static CONSTCD14 year_month_day from_days(days dp) NOEXCEPT; + CONSTCD14 days to_days() const NOEXCEPT; +}; + +CONSTCD11 bool operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator< (const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator> (const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT; +CONSTCD11 bool operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT; + +CONSTCD14 year_month_day operator+(const year_month_day& ymd, const months& dm) NOEXCEPT; +CONSTCD14 year_month_day operator+(const months& dm, const year_month_day& ymd) NOEXCEPT; +CONSTCD14 year_month_day operator-(const year_month_day& ymd, const months& dm) NOEXCEPT; +CONSTCD11 year_month_day operator+(const year_month_day& ymd, const years& dy) NOEXCEPT; +CONSTCD11 year_month_day operator+(const years& dy, const year_month_day& ymd) NOEXCEPT; +CONSTCD11 year_month_day operator-(const year_month_day& ymd, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day& ymd); + +// year_month_day_last + +class year_month_day_last +{ + solar_hijri::year y_; + solar_hijri::month_day_last mdl_; + +public: + year_month_day_last() = default; + CONSTCD11 year_month_day_last(const solar_hijri::year& y, + const solar_hijri::month_day_last& mdl) NOEXCEPT; + + CONSTCD14 year_month_day_last& operator+=(const months& m) NOEXCEPT; + CONSTCD14 year_month_day_last& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_day_last& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_day_last& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 solar_hijri::year year() const NOEXCEPT; + CONSTCD11 solar_hijri::month month() const NOEXCEPT; + CONSTCD11 solar_hijri::month_day_last month_day_last() const NOEXCEPT; + CONSTCD14 solar_hijri::day day() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; +}; + +CONSTCD11 + bool operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator< (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator> (const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; +CONSTCD11 + bool operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT; + +CONSTCD14 +year_month_day_last +operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT; + +CONSTCD14 +year_month_day_last +operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT; + +CONSTCD11 +year_month_day_last +operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT; + +CONSTCD11 +year_month_day_last +operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT; + +CONSTCD14 +year_month_day_last +operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT; + +CONSTCD11 +year_month_day_last +operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day_last& ymdl); + +// year_month_weekday + +class year_month_weekday +{ + solar_hijri::year y_; + solar_hijri::month m_; + solar_hijri::weekday_indexed wdi_; + +public: + year_month_weekday() = default; + CONSTCD11 year_month_weekday(const solar_hijri::year& y, const solar_hijri::month& m, + const solar_hijri::weekday_indexed& wdi) NOEXCEPT; + CONSTCD14 year_month_weekday(const sys_days& dp) NOEXCEPT; + CONSTCD14 explicit year_month_weekday(const local_days& dp) NOEXCEPT; + + CONSTCD14 year_month_weekday& operator+=(const months& m) NOEXCEPT; + CONSTCD14 year_month_weekday& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_weekday& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_weekday& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 solar_hijri::year year() const NOEXCEPT; + CONSTCD11 solar_hijri::month month() const NOEXCEPT; + CONSTCD11 solar_hijri::weekday weekday() const NOEXCEPT; + CONSTCD11 unsigned index() const NOEXCEPT; + CONSTCD11 solar_hijri::weekday_indexed weekday_indexed() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD14 bool ok() const NOEXCEPT; + +private: + static CONSTCD14 year_month_weekday from_days(days dp) NOEXCEPT; + CONSTCD14 days to_days() const NOEXCEPT; +}; + +CONSTCD11 + bool operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT; +CONSTCD11 + bool operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT; + +CONSTCD14 +year_month_weekday +operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT; + +CONSTCD14 +year_month_weekday +operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT; + +CONSTCD14 +year_month_weekday +operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT; + +CONSTCD11 +year_month_weekday +operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday& ymwdi); + +// year_month_weekday_last + +class year_month_weekday_last +{ + solar_hijri::year y_; + solar_hijri::month m_; + solar_hijri::weekday_last wdl_; + +public: + year_month_weekday_last() = default; + CONSTCD11 year_month_weekday_last(const solar_hijri::year& y, const solar_hijri::month& m, + const solar_hijri::weekday_last& wdl) NOEXCEPT; + + CONSTCD14 year_month_weekday_last& operator+=(const months& m) NOEXCEPT; + CONSTCD14 year_month_weekday_last& operator-=(const months& m) NOEXCEPT; + CONSTCD14 year_month_weekday_last& operator+=(const years& y) NOEXCEPT; + CONSTCD14 year_month_weekday_last& operator-=(const years& y) NOEXCEPT; + + CONSTCD11 solar_hijri::year year() const NOEXCEPT; + CONSTCD11 solar_hijri::month month() const NOEXCEPT; + CONSTCD11 solar_hijri::weekday weekday() const NOEXCEPT; + CONSTCD11 solar_hijri::weekday_last weekday_last() const NOEXCEPT; + + CONSTCD14 operator sys_days() const NOEXCEPT; + CONSTCD14 explicit operator local_days() const NOEXCEPT; + CONSTCD11 bool ok() const NOEXCEPT; + +private: + CONSTCD14 days to_days() const NOEXCEPT; +}; + +CONSTCD11 +bool +operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT; + +CONSTCD11 +bool +operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT; + +CONSTCD14 +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT; + +CONSTCD14 +year_month_weekday_last +operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT; + +CONSTCD14 +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT; + +CONSTCD11 +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday_last& ymwdl); + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +inline namespace literals +{ + +CONSTCD11 solar_hijri::day operator ""_d(unsigned long long d) NOEXCEPT; +CONSTCD11 solar_hijri::year operator ""_y(unsigned long long y) NOEXCEPT; + +} // inline namespace literals +#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900) + +//----------------+ +// Implementation | +//----------------+ + +// day + +CONSTCD11 inline day::day(unsigned d) NOEXCEPT : d_(static_cast(d)) {} +CONSTCD14 inline day& day::operator++() NOEXCEPT {++d_; return *this;} +CONSTCD14 inline day day::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline day& day::operator--() NOEXCEPT {--d_; return *this;} +CONSTCD14 inline day day::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} +CONSTCD14 inline day& day::operator+=(const days& d) NOEXCEPT {*this = *this + d; return *this;} +CONSTCD14 inline day& day::operator-=(const days& d) NOEXCEPT {*this = *this - d; return *this;} +CONSTCD11 inline day::operator unsigned() const NOEXCEPT {return d_;} +CONSTCD11 inline bool day::ok() const NOEXCEPT {return 1 <= d_ && d_ <= 30;} + +CONSTCD11 +inline +bool +operator==(const day& x, const day& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const day& x, const day& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const day& x, const day& y) NOEXCEPT +{ + return static_cast(x) < static_cast(y); +} + +CONSTCD11 +inline +bool +operator>(const day& x, const day& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const day& x, const day& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const day& x, const day& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD11 +inline +days +operator-(const day& x, const day& y) NOEXCEPT +{ + return days{static_cast(static_cast(x) + - static_cast(y))}; +} + +CONSTCD11 +inline +day +operator+(const day& x, const days& y) NOEXCEPT +{ + return day{static_cast(x) + static_cast(y.count())}; +} + +CONSTCD11 +inline +day +operator+(const days& x, const day& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD11 +inline +day +operator-(const day& x, const days& y) NOEXCEPT +{ + return x + -y; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const day& d) +{ + date::detail::save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os.width(2); + os << static_cast(d); + return os; +} + +// month + +CONSTCD11 inline month::month(unsigned m) NOEXCEPT : m_(static_cast(m)) {} +CONSTCD14 inline month& month::operator++() NOEXCEPT {if (++m_ == 13) m_ = 1; return *this;} +CONSTCD14 inline month month::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline month& month::operator--() NOEXCEPT {if (--m_ == 0) m_ = 12; return *this;} +CONSTCD14 inline month month::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} + +CONSTCD14 +inline +month& +month::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +month& +month::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD11 inline month::operator unsigned() const NOEXCEPT {return m_;} +CONSTCD11 inline bool month::ok() const NOEXCEPT {return 1 <= m_ && m_ <= 12;} + +CONSTCD11 +inline +bool +operator==(const month& x, const month& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const month& x, const month& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const month& x, const month& y) NOEXCEPT +{ + return static_cast(x) < static_cast(y); +} + +CONSTCD11 +inline +bool +operator>(const month& x, const month& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const month& x, const month& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const month& x, const month& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD14 +inline +months +operator-(const month& x, const month& y) NOEXCEPT +{ + auto const d = static_cast(x) - static_cast(y); + return months(d <= 11 ? d : d + 12); +} + +CONSTCD14 +inline +month +operator+(const month& x, const months& y) NOEXCEPT +{ + auto const mu = static_cast(static_cast(x)) - 1 + y.count(); + auto const yr = (mu >= 0 ? mu : mu-11) / 12; + return month{static_cast(mu - yr * 12 + 1)}; +} + +CONSTCD14 +inline +month +operator+(const months& x, const month& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD14 +inline +month +operator-(const month& x, const months& y) NOEXCEPT +{ + return x + -y; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month& m) +{ + switch (static_cast(m)) + { + case 1: + os << "Farvardin"; + break; + case 2: + os << "Ordibehesht"; + break; + case 3: + os << "Khordad"; + break; + case 4: + os << "Tir"; + break; + case 5: + os << "Mordad"; + break; + case 6: + os << "Shahrivar"; + break; + case 7: + os << "Mehr"; + break; + case 8: + os << "Aban"; + break; + case 9: + os << "Azar"; + break; + case 10: + os << "Dey"; + break; + case 11: + os << "Bahman"; + break; + case 12: + os << "Esfand"; + break; + default: + os << static_cast(m) << " is not a valid month"; + break; + } + return os; +} + +// year + +CONSTCD11 inline year::year(int y) NOEXCEPT : y_(static_cast(y)) {} +CONSTCD14 inline year& year::operator++() NOEXCEPT {++y_; return *this;} +CONSTCD14 inline year year::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline year& year::operator--() NOEXCEPT {--y_; return *this;} +CONSTCD14 inline year year::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} +CONSTCD14 inline year& year::operator+=(const years& y) NOEXCEPT {*this = *this + y; return *this;} +CONSTCD14 inline year& year::operator-=(const years& y) NOEXCEPT {*this = *this - y; return *this;} + +CONSTCD14 +inline +bool +year::is_leap() const NOEXCEPT +{ + using namespace internal; + auto const y = static_cast(y_)-475; + auto const era_d = static_cast(y >= 0 ? y : y-years_in_era+1) / static_cast(years_in_era); + auto const era = static_cast(era_d); + auto const yoe = static_cast(y - era * years_in_era); + + // Reference: https://www.timeanddate.com/date/iran-leap-year.html + // 29 + 33 + 33 + 33 = 128 + // 22 * 128 + 4 + auto const yoc = (yoe < (22 * 128)) ? ((yoe%128) < 29 ? yoe%128 : (yoe%128 - 29)%33) : yoe - (22 * 128) + 33; + return (yoc != 0 && (yoc%4)==0); +} + +CONSTCD11 inline year::operator int() const NOEXCEPT {return y_;} +CONSTCD11 inline bool year::ok() const NOEXCEPT {return true;} + +CONSTCD11 +inline +year +year::min() NOEXCEPT +{ + return year{std::numeric_limits::min()}; +} + +CONSTCD11 +inline +year +year::max() NOEXCEPT +{ + return year{std::numeric_limits::max()}; +} + +CONSTCD11 +inline +bool +operator==(const year& x, const year& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const year& x, const year& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year& x, const year& y) NOEXCEPT +{ + return static_cast(x) < static_cast(y); +} + +CONSTCD11 +inline +bool +operator>(const year& x, const year& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year& x, const year& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year& x, const year& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD11 +inline +years +operator-(const year& x, const year& y) NOEXCEPT +{ + return years{static_cast(x) - static_cast(y)}; +} + +CONSTCD11 +inline +year +operator+(const year& x, const years& y) NOEXCEPT +{ + return year{static_cast(x) + y.count()}; +} + +CONSTCD11 +inline +year +operator+(const years& x, const year& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD11 +inline +year +operator-(const year& x, const years& y) NOEXCEPT +{ + return year{static_cast(x) - y.count()}; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year& y) +{ + date::detail::save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::internal); + os.width(4 + (y < year{0})); + os << static_cast(y); + return os; +} + +// weekday + +CONSTCD11 +inline +unsigned char +weekday::weekday_from_days(int z) NOEXCEPT +{ + auto u = static_cast(z); + return static_cast(z >= -4 ? (u+4) % 7 : u % 7); +} + +CONSTCD11 +inline +weekday::weekday(unsigned wd) NOEXCEPT + : wd_(static_cast(wd != 7 ? wd : 0)) + {} + +CONSTCD11 +inline +weekday::weekday(const sys_days& dp) NOEXCEPT + : wd_(weekday_from_days(dp.time_since_epoch().count())) + {} + +CONSTCD11 +inline +weekday::weekday(const local_days& dp) NOEXCEPT + : wd_(weekday_from_days(dp.time_since_epoch().count())) + {} + +CONSTCD14 inline weekday& weekday::operator++() NOEXCEPT {if (++wd_ == 7) wd_ = 0; return *this;} +CONSTCD14 inline weekday weekday::operator++(int) NOEXCEPT {auto tmp(*this); ++(*this); return tmp;} +CONSTCD14 inline weekday& weekday::operator--() NOEXCEPT {if (wd_-- == 0) wd_ = 6; return *this;} +CONSTCD14 inline weekday weekday::operator--(int) NOEXCEPT {auto tmp(*this); --(*this); return tmp;} + +CONSTCD14 +inline +weekday& +weekday::operator+=(const days& d) NOEXCEPT +{ + *this = *this + d; + return *this; +} + +CONSTCD14 +inline +weekday& +weekday::operator-=(const days& d) NOEXCEPT +{ + *this = *this - d; + return *this; +} + +CONSTCD11 +inline +weekday::operator unsigned() const NOEXCEPT +{ + return static_cast(wd_); +} + +CONSTCD11 inline bool weekday::ok() const NOEXCEPT {return wd_ <= 6;} + +CONSTCD11 +inline +bool +operator==(const weekday& x, const weekday& y) NOEXCEPT +{ + return static_cast(x) == static_cast(y); +} + +CONSTCD11 +inline +bool +operator!=(const weekday& x, const weekday& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD14 +inline +days +operator-(const weekday& x, const weekday& y) NOEXCEPT +{ + auto const diff = static_cast(x) - static_cast(y); + return days{diff <= 6 ? diff : diff + 7}; +} + +CONSTCD14 +inline +weekday +operator+(const weekday& x, const days& y) NOEXCEPT +{ + auto const wdu = static_cast(static_cast(x)) + y.count(); + auto const wk = (wdu >= 0 ? wdu : wdu-6) / 7; + return weekday{static_cast(wdu - wk * 7)}; +} + +CONSTCD14 +inline +weekday +operator+(const days& x, const weekday& y) NOEXCEPT +{ + return y + x; +} + +CONSTCD14 +inline +weekday +operator-(const weekday& x, const days& y) NOEXCEPT +{ + return x + -y; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday& wd) +{ + switch (static_cast(wd)) + { + case 0: + os << "Yekshanbe"; + break; + case 1: + os << "Doshanbe"; + break; + case 2: + os << "Seshanbe"; + break; + case 3: + os << "Chaharshanbe"; + break; + case 4: + os << "Panjshanbe"; + break; + case 5: + os << "Adine"; + break; + case 6: + os << "Shanbe"; + break; + default: + os << static_cast(wd) << " is not a valid weekday"; + break; + } + return os; +} + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +inline namespace literals +{ + +CONSTCD11 +inline +solar_hijri::day +operator ""_d(unsigned long long d) NOEXCEPT +{ + return solar_hijri::day{static_cast(d)}; +} + +CONSTCD11 +inline +solar_hijri::year +operator ""_y(unsigned long long y) NOEXCEPT +{ + return solar_hijri::year(static_cast(y)); +} +#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900) + +CONSTDATA solar_hijri::last_spec last{}; + +CONSTDATA solar_hijri::month far {1}; +CONSTDATA solar_hijri::month ord {2}; +CONSTDATA solar_hijri::month kho {3}; +CONSTDATA solar_hijri::month tir {4}; +CONSTDATA solar_hijri::month mor {5}; +CONSTDATA solar_hijri::month sha {6}; +CONSTDATA solar_hijri::month meh {7}; +CONSTDATA solar_hijri::month aba {8}; +CONSTDATA solar_hijri::month aza {9}; +CONSTDATA solar_hijri::month dey {10}; +CONSTDATA solar_hijri::month bah {11}; +CONSTDATA solar_hijri::month esf {12}; + +CONSTDATA solar_hijri::month Farvardin {1}; +CONSTDATA solar_hijri::month Ordibehesht {2}; +CONSTDATA solar_hijri::month Khordad {3}; +CONSTDATA solar_hijri::month Tir {4}; +CONSTDATA solar_hijri::month Mordad {5}; +CONSTDATA solar_hijri::month Shahrivar {6}; +CONSTDATA solar_hijri::month Mehr {7}; +CONSTDATA solar_hijri::month Aban {8}; +CONSTDATA solar_hijri::month Azar {9}; +CONSTDATA solar_hijri::month Dey {10}; +CONSTDATA solar_hijri::month Bahman {11}; +CONSTDATA solar_hijri::month Esfand {12}; + +CONSTDATA solar_hijri::weekday yek {0u}; +CONSTDATA solar_hijri::weekday dos {1u}; +CONSTDATA solar_hijri::weekday ses {2u}; +CONSTDATA solar_hijri::weekday cha {3u}; +CONSTDATA solar_hijri::weekday pan {4u}; +CONSTDATA solar_hijri::weekday adi {5u}; +CONSTDATA solar_hijri::weekday shn {6u}; + +CONSTDATA solar_hijri::weekday Yekshanbe {0u}; +CONSTDATA solar_hijri::weekday Doshanbe {1u}; +CONSTDATA solar_hijri::weekday Seshanbe {2u}; +CONSTDATA solar_hijri::weekday Chaharshanbe {3u}; +CONSTDATA solar_hijri::weekday Panjshanbe {4u}; +CONSTDATA solar_hijri::weekday Adine {5u}; +CONSTDATA solar_hijri::weekday Shanbe {6u}; + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +} // inline namespace literals +#endif + +// weekday_indexed + +CONSTCD11 +inline +weekday +weekday_indexed::weekday() const NOEXCEPT +{ + return solar_hijri::weekday{static_cast(wd_)}; +} + +CONSTCD11 inline unsigned weekday_indexed::index() const NOEXCEPT {return index_;} + +CONSTCD11 +inline +bool +weekday_indexed::ok() const NOEXCEPT +{ + return weekday().ok() && 1 <= index_ && index_ <= 5; +} + +CONSTCD11 +inline +weekday_indexed::weekday_indexed(const solar_hijri::weekday& wd, unsigned index) NOEXCEPT + : wd_(static_cast(static_cast(wd))) + , index_(static_cast(index)) + {} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_indexed& wdi) +{ + return os << wdi.weekday() << '[' << wdi.index() << ']'; +} + +CONSTCD11 +inline +weekday_indexed +weekday::operator[](unsigned index) const NOEXCEPT +{ + return {*this, index}; +} + +CONSTCD11 +inline +bool +operator==(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT +{ + return x.weekday() == y.weekday() && x.index() == y.index(); +} + +CONSTCD11 +inline +bool +operator!=(const weekday_indexed& x, const weekday_indexed& y) NOEXCEPT +{ + return !(x == y); +} + +// weekday_last + +CONSTCD11 inline solar_hijri::weekday weekday_last::weekday() const NOEXCEPT {return wd_;} +CONSTCD11 inline bool weekday_last::ok() const NOEXCEPT {return wd_.ok();} +CONSTCD11 inline weekday_last::weekday_last(const solar_hijri::weekday& wd) NOEXCEPT : wd_(wd) {} + +CONSTCD11 +inline +bool +operator==(const weekday_last& x, const weekday_last& y) NOEXCEPT +{ + return x.weekday() == y.weekday(); +} + +CONSTCD11 +inline +bool +operator!=(const weekday_last& x, const weekday_last& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const weekday_last& wdl) +{ + return os << wdl.weekday() << "[last]"; +} + +CONSTCD11 +inline +weekday_last +weekday::operator[](last_spec) const NOEXCEPT +{ + return weekday_last{*this}; +} + +// year_month + +CONSTCD11 +inline +year_month::year_month(const solar_hijri::year& y, const solar_hijri::month& m) NOEXCEPT + : y_(y) + , m_(m) + {} + +CONSTCD11 inline year year_month::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month::month() const NOEXCEPT {return m_;} +CONSTCD11 inline bool year_month::ok() const NOEXCEPT {return y_.ok() && m_.ok();} + +CONSTCD14 +inline +year_month& +year_month::operator+=(const months& dm) NOEXCEPT +{ + *this = *this + dm; + return *this; +} + +CONSTCD14 +inline +year_month& +year_month::operator-=(const months& dm) NOEXCEPT +{ + *this = *this - dm; + return *this; +} + +CONSTCD14 +inline +year_month& +year_month::operator+=(const years& dy) NOEXCEPT +{ + *this = *this + dy; + return *this; +} + +CONSTCD14 +inline +year_month& +year_month::operator-=(const years& dy) NOEXCEPT +{ + *this = *this - dy; + return *this; +} + +CONSTCD11 +inline +bool +operator==(const year_month& x, const year_month& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month& x, const year_month& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_month& x, const year_month& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (x.month() < y.month())); +} + +CONSTCD11 +inline +bool +operator>(const year_month& x, const year_month& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_month& x, const year_month& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_month& x, const year_month& y) NOEXCEPT +{ + return !(x < y); +} + +CONSTCD14 +inline +year_month +operator+(const year_month& ym, const months& dm) NOEXCEPT +{ + auto dmi = static_cast(static_cast(ym.month())) - 1 + dm.count(); + auto dy = (dmi >= 0 ? dmi : dmi-11) / 12; + dmi = dmi - dy * 12 + 1; + return (ym.year() + years(dy)) / month(static_cast(dmi)); +} + +CONSTCD14 +inline +year_month +operator+(const months& dm, const year_month& ym) NOEXCEPT +{ + return ym + dm; +} + +CONSTCD14 +inline +year_month +operator-(const year_month& ym, const months& dm) NOEXCEPT +{ + return ym + -dm; +} + +CONSTCD11 +inline +months +operator-(const year_month& x, const year_month& y) NOEXCEPT +{ + return (x.year() - y.year()) + + months(static_cast(x.month()) - static_cast(y.month())); +} + +CONSTCD11 +inline +year_month +operator+(const year_month& ym, const years& dy) NOEXCEPT +{ + return (ym.year() + dy) / ym.month(); +} + +CONSTCD11 +inline +year_month +operator+(const years& dy, const year_month& ym) NOEXCEPT +{ + return ym + dy; +} + +CONSTCD11 +inline +year_month +operator-(const year_month& ym, const years& dy) NOEXCEPT +{ + return ym + -dy; +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month& ym) +{ + return os << ym.year() << '/' << ym.month(); +} + +// month_day + +CONSTCD11 +inline +month_day::month_day(const solar_hijri::month& m, const solar_hijri::day& d) NOEXCEPT + : m_(m) + , d_(d) + {} + +CONSTCD11 inline solar_hijri::month month_day::month() const NOEXCEPT {return m_;} +CONSTCD11 inline solar_hijri::day month_day::day() const NOEXCEPT {return d_;} + +CONSTCD14 +inline +bool +month_day::ok() const NOEXCEPT +{ + CONSTDATA solar_hijri::day d[] = { + solar_hijri::day(31), solar_hijri::day(31), solar_hijri::day(31), + solar_hijri::day(31), solar_hijri::day(31), solar_hijri::day(31), + solar_hijri::day(30), solar_hijri::day(30), solar_hijri::day(30), + solar_hijri::day(30), solar_hijri::day(30), solar_hijri::day(30) + }; + return m_.ok() && solar_hijri::day(1) <= d_ && d_ <= d[static_cast(m_)-1]; +} + +CONSTCD11 +inline +bool +operator==(const month_day& x, const month_day& y) NOEXCEPT +{ + return x.month() == y.month() && x.day() == y.day(); +} + +CONSTCD11 +inline +bool +operator!=(const month_day& x, const month_day& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const month_day& x, const month_day& y) NOEXCEPT +{ + return x.month() < y.month() ? true + : (x.month() > y.month() ? false + : (x.day() < y.day())); +} + +CONSTCD11 +inline +bool +operator>(const month_day& x, const month_day& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const month_day& x, const month_day& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const month_day& x, const month_day& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day& md) +{ + return os << md.month() << '/' << md.day(); +} + +// month_day_last + +CONSTCD11 inline month month_day_last::month() const NOEXCEPT {return m_;} +CONSTCD11 inline bool month_day_last::ok() const NOEXCEPT {return m_.ok();} +CONSTCD11 inline month_day_last::month_day_last(const solar_hijri::month& m) NOEXCEPT : m_(m) {} + +CONSTCD11 +inline +bool +operator==(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return x.month() == y.month(); +} + +CONSTCD11 +inline +bool +operator!=(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return x.month() < y.month(); +} + +CONSTCD11 +inline +bool +operator>(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const month_day_last& x, const month_day_last& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_day_last& mdl) +{ + return os << mdl.month() << "/last"; +} + +// month_weekday + +CONSTCD11 +inline +month_weekday::month_weekday(const solar_hijri::month& m, + const solar_hijri::weekday_indexed& wdi) NOEXCEPT + : m_(m) + , wdi_(wdi) + {} + +CONSTCD11 inline month month_weekday::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday_indexed +month_weekday::weekday_indexed() const NOEXCEPT +{ + return wdi_; +} + +CONSTCD11 +inline +bool +month_weekday::ok() const NOEXCEPT +{ + return m_.ok() && wdi_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const month_weekday& x, const month_weekday& y) NOEXCEPT +{ + return x.month() == y.month() && x.weekday_indexed() == y.weekday_indexed(); +} + +CONSTCD11 +inline +bool +operator!=(const month_weekday& x, const month_weekday& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday& mwd) +{ + return os << mwd.month() << '/' << mwd.weekday_indexed(); +} + +// month_weekday_last + +CONSTCD11 +inline +month_weekday_last::month_weekday_last(const solar_hijri::month& m, + const solar_hijri::weekday_last& wdl) NOEXCEPT + : m_(m) + , wdl_(wdl) + {} + +CONSTCD11 inline month month_weekday_last::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday_last +month_weekday_last::weekday_last() const NOEXCEPT +{ + return wdl_; +} + +CONSTCD11 +inline +bool +month_weekday_last::ok() const NOEXCEPT +{ + return m_.ok() && wdl_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT +{ + return x.month() == y.month() && x.weekday_last() == y.weekday_last(); +} + +CONSTCD11 +inline +bool +operator!=(const month_weekday_last& x, const month_weekday_last& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const month_weekday_last& mwdl) +{ + return os << mwdl.month() << '/' << mwdl.weekday_last(); +} + +// year_month_day_last + +CONSTCD11 +inline +year_month_day_last::year_month_day_last(const solar_hijri::year& y, + const solar_hijri::month_day_last& mdl) NOEXCEPT + : y_(y) + , mdl_(mdl) + {} + +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_day_last& +year_month_day_last::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline year year_month_day_last::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_day_last::month() const NOEXCEPT {return mdl_.month();} + +CONSTCD11 +inline +month_day_last +year_month_day_last::month_day_last() const NOEXCEPT +{ + return mdl_; +} + +CONSTCD14 +inline +day +year_month_day_last::day() const NOEXCEPT +{ + CONSTDATA solar_hijri::day d[] = { + solar_hijri::day(31), solar_hijri::day(31), solar_hijri::day(31), + solar_hijri::day(31), solar_hijri::day(31), solar_hijri::day(31), + solar_hijri::day(30), solar_hijri::day(30), solar_hijri::day(30), + solar_hijri::day(30), solar_hijri::day(30), solar_hijri::day(29) + }; + return month() != esf || !y_.is_leap() ? + d[static_cast(month()) - 1] : solar_hijri::day(30); +} + +CONSTCD14 +inline +year_month_day_last::operator sys_days() const NOEXCEPT +{ + return sys_days(year()/month()/day()); +} + +CONSTCD14 +inline +year_month_day_last::operator local_days() const NOEXCEPT +{ + return local_days(year()/month()/day()); +} + +CONSTCD11 +inline +bool +year_month_day_last::ok() const NOEXCEPT +{ + return y_.ok() && mdl_.ok(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return x.year() == y.year() && x.month_day_last() == y.month_day_last(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (x.month_day_last() < y.month_day_last())); +} + +CONSTCD11 +inline +bool +operator>(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_month_day_last& x, const year_month_day_last& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day_last& ymdl) +{ + return os << ymdl.year() << '/' << ymdl.month_day_last(); +} + +CONSTCD14 +inline +year_month_day_last +operator+(const year_month_day_last& ymdl, const months& dm) NOEXCEPT +{ + return (ymdl.year() / ymdl.month() + dm) / last; +} + +CONSTCD14 +inline +year_month_day_last +operator+(const months& dm, const year_month_day_last& ymdl) NOEXCEPT +{ + return ymdl + dm; +} + +CONSTCD14 +inline +year_month_day_last +operator-(const year_month_day_last& ymdl, const months& dm) NOEXCEPT +{ + return ymdl + (-dm); +} + +CONSTCD11 +inline +year_month_day_last +operator+(const year_month_day_last& ymdl, const years& dy) NOEXCEPT +{ + return {ymdl.year()+dy, ymdl.month_day_last()}; +} + +CONSTCD11 +inline +year_month_day_last +operator+(const years& dy, const year_month_day_last& ymdl) NOEXCEPT +{ + return ymdl + dy; +} + +CONSTCD11 +inline +year_month_day_last +operator-(const year_month_day_last& ymdl, const years& dy) NOEXCEPT +{ + return ymdl + (-dy); +} + +// year_month_day + +CONSTCD11 +inline +year_month_day::year_month_day(const solar_hijri::year& y, const solar_hijri::month& m, + const solar_hijri::day& d) NOEXCEPT + : y_(y) + , m_(m) + , d_(d) + {} + +CONSTCD14 +inline +year_month_day::year_month_day(const year_month_day_last& ymdl) NOEXCEPT + : y_(ymdl.year()) + , m_(ymdl.month()) + , d_(ymdl.day()) + {} + +CONSTCD14 +inline +year_month_day::year_month_day(sys_days dp) NOEXCEPT + : year_month_day(from_days(dp.time_since_epoch())) + {} + +CONSTCD14 +inline +year_month_day::year_month_day(local_days dp) NOEXCEPT + : year_month_day(from_days(dp.time_since_epoch())) + {} + +CONSTCD11 inline year year_month_day::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_day::month() const NOEXCEPT {return m_;} +CONSTCD11 inline day year_month_day::day() const NOEXCEPT {return d_;} + +CONSTCD14 +inline +year_month_day& +year_month_day::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +year_month_day& +year_month_day::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_day& +year_month_day::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_day& +year_month_day::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD14 +inline +days +year_month_day::to_days() const NOEXCEPT +{ + static_assert(std::numeric_limits::digits >= 18, + "This algorithm has not been ported to a 16 bit unsigned integer"); + static_assert(std::numeric_limits::digits >= 20, + "This algorithm has not been ported to a 16 bit signed integer"); + + using namespace internal; + auto const y = static_cast(y_) - 475; + auto const m = static_cast(m_); + auto const d = static_cast(d_); + auto const era_d = static_cast(y >= 0 ? y : y-years_in_era+1) / static_cast(years_in_era); + auto const era = static_cast(era_d); + auto const fdoe = static_cast(epoch + era * days_in_era); + auto const yoe = static_cast(y - era * years_in_era); + + auto const period_d = static_cast(yoe/years_in_period); + auto const period = static_cast(period_d); + auto const yop = yoe%years_in_period; + auto const fdop = period*days_in_period; + auto const cycle = yop < 29 ? 0 : static_cast((yop-29)/years_in_other_cycles + 1); + auto const yoc = yop < 29 ? yop : (yop-29)%years_in_other_cycles; + auto const fdoc = cycle > 0 ? days_in_first_cycle + (cycle-1)*days_in_other_cycles : 0; + auto const group = yoc < 1 ? 0 : static_cast((yoc-1) / 4); + auto const yog = static_cast(yoc < 1 ? -1 : (yoc-1) % 4); + auto const fdoyog = group*1461 + (yog+1)*365; + auto const fdoyoe = fdop + fdoc + fdoyog; + + auto const doy = 30*(m-1) + ((m > 6) ? 6 : m-1) + d-1; // [0, 365] + auto const doe = fdoe + fdoyoe + doy; + return days{doe - unix_time_shift}; +} + +CONSTCD14 +inline +year_month_day::operator sys_days() const NOEXCEPT +{ + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_day::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; +} + +CONSTCD14 +inline +bool +year_month_day::ok() const NOEXCEPT +{ + if (!(y_.ok() && m_.ok())) + return false; + return solar_hijri::day(1) <= d_ && d_ <= (y_/m_/last).day(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month() && x.day() == y.day(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return !(x == y); +} + +CONSTCD11 +inline +bool +operator<(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return x.year() < y.year() ? true + : (x.year() > y.year() ? false + : (x.month() < y.month() ? true + : (x.month() > y.month() ? false + : (x.day() < y.day())))); +} + +CONSTCD11 +inline +bool +operator>(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return y < x; +} + +CONSTCD11 +inline +bool +operator<=(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return !(y < x); +} + +CONSTCD11 +inline +bool +operator>=(const year_month_day& x, const year_month_day& y) NOEXCEPT +{ + return !(x < y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_day& ymd) +{ + date::detail::save_ostream _(os); + os.fill('0'); + os.flags(std::ios::dec | std::ios::right); + os << ymd.year() << '-'; + os.width(2); + os << static_cast(ymd.month()) << '-'; + os << ymd.day(); + return os; +} + +CONSTCD14 +inline +year_month_day +year_month_day::from_days(days dp) NOEXCEPT +{ + static_assert(std::numeric_limits::digits >= 18, + "This algorithm has not been ported to a 16 bit unsigned integer"); + static_assert(std::numeric_limits::digits >= 20, + "This algorithm has not been ported to a 16 bit signed integer"); + + using namespace internal; + auto const z = dp.count() + unix_time_shift; + auto const delta = static_cast(z - epoch); + auto const era = static_cast(delta >= 0 ? delta : delta-days_in_era+1) / static_cast(days_in_era); + auto const era_i = static_cast(era); + auto const fdoe = static_cast(epoch + static_cast(era_i * days_in_era)); + + auto const doe_fdoe = z - fdoe; + auto const period = static_cast(doe_fdoe < 22*days_in_period ? doe_fdoe / days_in_period : 22); + auto const dop = doe_fdoe % days_in_period; + auto const cycle = dop < days_in_first_cycle ? 0 : (dop-days_in_first_cycle) / days_in_other_cycles + 1; + auto const doc = dop < days_in_first_cycle ? dop : (dop-days_in_first_cycle) % days_in_other_cycles; + auto const group = doc < 365 && period != 22 ? -1 : static_cast(((doc < 365 ? 365 : doc)-365)/1461); + auto const yog = doc < 365 && period != 22 ? -1 : static_cast( (period != 22 ? ((doc-365 )%1461) : doc)/365); + auto const yoc = group == -1 ? 0 : (period != 22 ? 1 : 0) + group*4 + (yog == 4 ? 3 : yog); + auto const doy = group == -1 ? doc : (period != 22 ? ((yoc-1)%4 == 0 ? (group >= 0 ? (doe_fdoe - + (period*days_in_period) - + (cycle > 0 ? days_in_first_cycle + (cycle-1)*days_in_other_cycles : 0) - + (group*1461 + ((yog == 4 ? 3 : yog)+1)*365)) + : 365) + : doe_fdoe - + (period*days_in_period) - + (cycle > 0 ? days_in_first_cycle + (cycle-1)*days_in_other_cycles : 0) - + (group*1461 + ((yog == 4 ? 3 : yog)+1)*365)) + : (yog == 4 ? 365 : doe_fdoe - (period*days_in_period) - yog*365)); + auto const yoe = period != 22 ? period*years_in_period + + (cycle > 0 ? years_in_first_cycle + + (cycle-1)*years_in_other_cycles + : 0) + + yoc + : 22*years_in_period + ((yog == 4) ? 3 : yog); + auto const y = static_cast(static_cast(yoe) + 475 + era_i * years_in_era); + auto const m = doy < 186 ? doy/31 + 1 : (doy-186)/30 + 7; // [1, 12] + auto const d = doy - (30*(m-1) + ((m > 6) ? 6 : m-1) - 1); // [1, 31] + + return year_month_day{solar_hijri::year(y), solar_hijri::month(m), solar_hijri::day(d)}; +} + +CONSTCD14 +inline +year_month_day +operator+(const year_month_day& ymd, const months& dm) NOEXCEPT +{ + return (ymd.year() / ymd.month() + dm) / ymd.day(); +} + +CONSTCD14 +inline +year_month_day +operator+(const months& dm, const year_month_day& ymd) NOEXCEPT +{ + return ymd + dm; +} + +CONSTCD14 +inline +year_month_day +operator-(const year_month_day& ymd, const months& dm) NOEXCEPT +{ + return ymd + (-dm); +} + +CONSTCD11 +inline +year_month_day +operator+(const year_month_day& ymd, const years& dy) NOEXCEPT +{ + return (ymd.year() + dy) / ymd.month() / ymd.day(); +} + +CONSTCD11 +inline +year_month_day +operator+(const years& dy, const year_month_day& ymd) NOEXCEPT +{ + return ymd + dy; +} + +CONSTCD11 +inline +year_month_day +operator-(const year_month_day& ymd, const years& dy) NOEXCEPT +{ + return ymd + (-dy); +} + +// year_month_weekday + +CONSTCD11 +inline +year_month_weekday::year_month_weekday(const solar_hijri::year& y, const solar_hijri::month& m, + const solar_hijri::weekday_indexed& wdi) + NOEXCEPT + : y_(y) + , m_(m) + , wdi_(wdi) + {} + +CONSTCD14 +inline +year_month_weekday::year_month_weekday(const sys_days& dp) NOEXCEPT + : year_month_weekday(from_days(dp.time_since_epoch())) + {} + +CONSTCD14 +inline +year_month_weekday::year_month_weekday(const local_days& dp) NOEXCEPT + : year_month_weekday(from_days(dp.time_since_epoch())) + {} + +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_weekday& +year_month_weekday::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline year year_month_weekday::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_weekday::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday +year_month_weekday::weekday() const NOEXCEPT +{ + return wdi_.weekday(); +} + +CONSTCD11 +inline +unsigned +year_month_weekday::index() const NOEXCEPT +{ + return wdi_.index(); +} + +CONSTCD11 +inline +weekday_indexed +year_month_weekday::weekday_indexed() const NOEXCEPT +{ + return wdi_; +} + +CONSTCD14 +inline +year_month_weekday::operator sys_days() const NOEXCEPT +{ + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_weekday::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; +} + +CONSTCD14 +inline +bool +year_month_weekday::ok() const NOEXCEPT +{ + if (!y_.ok() || !m_.ok() || !wdi_.weekday().ok() || wdi_.index() < 1) + return false; + if (wdi_.index() <= 4) + return true; + auto d2 = wdi_.weekday() - solar_hijri::weekday(y_/m_/1) + days((wdi_.index()-1)*7 + 1); + return static_cast(d2.count()) <= static_cast((y_/m_/last).day()); +} + +CONSTCD14 +inline +year_month_weekday +year_month_weekday::from_days(days d) NOEXCEPT +{ + sys_days dp{d}; + auto const wd = solar_hijri::weekday(dp); + auto const ymd = year_month_day(dp); + return {ymd.year(), ymd.month(), wd[(static_cast(ymd.day())-1)/7+1]}; +} + +CONSTCD14 +inline +days +year_month_weekday::to_days() const NOEXCEPT +{ + auto d = sys_days(y_/m_/1); + return (d + (wdi_.weekday() - solar_hijri::weekday(d) + days{(wdi_.index()-1)*7}) + ).time_since_epoch(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month() && + x.weekday_indexed() == y.weekday_indexed(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_weekday& x, const year_month_weekday& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday& ymwdi) +{ + return os << ymwdi.year() << '/' << ymwdi.month() + << '/' << ymwdi.weekday_indexed(); +} + +CONSTCD14 +inline +year_month_weekday +operator+(const year_month_weekday& ymwd, const months& dm) NOEXCEPT +{ + return (ymwd.year() / ymwd.month() + dm) / ymwd.weekday_indexed(); +} + +CONSTCD14 +inline +year_month_weekday +operator+(const months& dm, const year_month_weekday& ymwd) NOEXCEPT +{ + return ymwd + dm; +} + +CONSTCD14 +inline +year_month_weekday +operator-(const year_month_weekday& ymwd, const months& dm) NOEXCEPT +{ + return ymwd + (-dm); +} + +CONSTCD11 +inline +year_month_weekday +operator+(const year_month_weekday& ymwd, const years& dy) NOEXCEPT +{ + return {ymwd.year()+dy, ymwd.month(), ymwd.weekday_indexed()}; +} + +CONSTCD11 +inline +year_month_weekday +operator+(const years& dy, const year_month_weekday& ymwd) NOEXCEPT +{ + return ymwd + dy; +} + +CONSTCD11 +inline +year_month_weekday +operator-(const year_month_weekday& ymwd, const years& dy) NOEXCEPT +{ + return ymwd + (-dy); +} + +// year_month_weekday_last + +CONSTCD11 +inline +year_month_weekday_last::year_month_weekday_last(const solar_hijri::year& y, + const solar_hijri::month& m, + const solar_hijri::weekday_last& wdl) NOEXCEPT + : y_(y) + , m_(m) + , wdl_(wdl) + {} + +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator+=(const months& m) NOEXCEPT +{ + *this = *this + m; + return *this; +} + +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator-=(const months& m) NOEXCEPT +{ + *this = *this - m; + return *this; +} + +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator+=(const years& y) NOEXCEPT +{ + *this = *this + y; + return *this; +} + +CONSTCD14 +inline +year_month_weekday_last& +year_month_weekday_last::operator-=(const years& y) NOEXCEPT +{ + *this = *this - y; + return *this; +} + +CONSTCD11 inline year year_month_weekday_last::year() const NOEXCEPT {return y_;} +CONSTCD11 inline month year_month_weekday_last::month() const NOEXCEPT {return m_;} + +CONSTCD11 +inline +weekday +year_month_weekday_last::weekday() const NOEXCEPT +{ + return wdl_.weekday(); +} + +CONSTCD11 +inline +weekday_last +year_month_weekday_last::weekday_last() const NOEXCEPT +{ + return wdl_; +} + +CONSTCD14 +inline +year_month_weekday_last::operator sys_days() const NOEXCEPT +{ + return sys_days{to_days()}; +} + +CONSTCD14 +inline +year_month_weekday_last::operator local_days() const NOEXCEPT +{ + return local_days{to_days()}; +} + +CONSTCD11 +inline +bool +year_month_weekday_last::ok() const NOEXCEPT +{ + return y_.ok() && m_.ok() && wdl_.ok(); +} + +CONSTCD14 +inline +days +year_month_weekday_last::to_days() const NOEXCEPT +{ + auto const d = sys_days(y_/m_/last); + return (d - (solar_hijri::weekday{d} - wdl_.weekday())).time_since_epoch(); +} + +CONSTCD11 +inline +bool +operator==(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT +{ + return x.year() == y.year() && x.month() == y.month() && + x.weekday_last() == y.weekday_last(); +} + +CONSTCD11 +inline +bool +operator!=(const year_month_weekday_last& x, const year_month_weekday_last& y) NOEXCEPT +{ + return !(x == y); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const year_month_weekday_last& ymwdl) +{ + return os << ymwdl.year() << '/' << ymwdl.month() << '/' << ymwdl.weekday_last(); +} + +CONSTCD14 +inline +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT +{ + return (ymwdl.year() / ymwdl.month() + dm) / ymwdl.weekday_last(); +} + +CONSTCD14 +inline +year_month_weekday_last +operator+(const months& dm, const year_month_weekday_last& ymwdl) NOEXCEPT +{ + return ymwdl + dm; +} + +CONSTCD14 +inline +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const months& dm) NOEXCEPT +{ + return ymwdl + (-dm); +} + +CONSTCD11 +inline +year_month_weekday_last +operator+(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT +{ + return {ymwdl.year()+dy, ymwdl.month(), ymwdl.weekday_last()}; +} + +CONSTCD11 +inline +year_month_weekday_last +operator+(const years& dy, const year_month_weekday_last& ymwdl) NOEXCEPT +{ + return ymwdl + dy; +} + +CONSTCD11 +inline +year_month_weekday_last +operator-(const year_month_weekday_last& ymwdl, const years& dy) NOEXCEPT +{ + return ymwdl + (-dy); +} + +// year_month from operator/() + +CONSTCD11 +inline +year_month +operator/(const year& y, const month& m) NOEXCEPT +{ + return {y, m}; +} + +CONSTCD11 +inline +year_month +operator/(const year& y, int m) NOEXCEPT +{ + return y / month(static_cast(m)); +} + +// month_day from operator/() + +CONSTCD11 +inline +month_day +operator/(const month& m, const day& d) NOEXCEPT +{ + return {m, d}; +} + +CONSTCD11 +inline +month_day +operator/(const day& d, const month& m) NOEXCEPT +{ + return m / d; +} + +CONSTCD11 +inline +month_day +operator/(const month& m, int d) NOEXCEPT +{ + return m / day(static_cast(d)); +} + +CONSTCD11 +inline +month_day +operator/(int m, const day& d) NOEXCEPT +{ + return month(static_cast(m)) / d; +} + +CONSTCD11 inline month_day operator/(const day& d, int m) NOEXCEPT {return m / d;} + +// month_day_last from operator/() + +CONSTCD11 +inline +month_day_last +operator/(const month& m, last_spec) NOEXCEPT +{ + return month_day_last{m}; +} + +CONSTCD11 +inline +month_day_last +operator/(last_spec, const month& m) NOEXCEPT +{ + return m/last; +} + +CONSTCD11 +inline +month_day_last +operator/(int m, last_spec) NOEXCEPT +{ + return month(static_cast(m))/last; +} + +CONSTCD11 +inline +month_day_last +operator/(last_spec, int m) NOEXCEPT +{ + return m/last; +} + +// month_weekday from operator/() + +CONSTCD11 +inline +month_weekday +operator/(const month& m, const weekday_indexed& wdi) NOEXCEPT +{ + return {m, wdi}; +} + +CONSTCD11 +inline +month_weekday +operator/(const weekday_indexed& wdi, const month& m) NOEXCEPT +{ + return m / wdi; +} + +CONSTCD11 +inline +month_weekday +operator/(int m, const weekday_indexed& wdi) NOEXCEPT +{ + return month(static_cast(m)) / wdi; +} + +CONSTCD11 +inline +month_weekday +operator/(const weekday_indexed& wdi, int m) NOEXCEPT +{ + return m / wdi; +} + +// month_weekday_last from operator/() + +CONSTCD11 +inline +month_weekday_last +operator/(const month& m, const weekday_last& wdl) NOEXCEPT +{ + return {m, wdl}; +} + +CONSTCD11 +inline +month_weekday_last +operator/(const weekday_last& wdl, const month& m) NOEXCEPT +{ + return m / wdl; +} + +CONSTCD11 +inline +month_weekday_last +operator/(int m, const weekday_last& wdl) NOEXCEPT +{ + return month(static_cast(m)) / wdl; +} + +CONSTCD11 +inline +month_weekday_last +operator/(const weekday_last& wdl, int m) NOEXCEPT +{ + return m / wdl; +} + +// year_month_day from operator/() + +CONSTCD11 +inline +year_month_day +operator/(const year_month& ym, const day& d) NOEXCEPT +{ + return {ym.year(), ym.month(), d}; +} + +CONSTCD11 +inline +year_month_day +operator/(const year_month& ym, int d) NOEXCEPT +{ + return ym / day(static_cast(d)); +} + +CONSTCD11 +inline +year_month_day +operator/(const year& y, const month_day& md) NOEXCEPT +{ + return y / md.month() / md.day(); +} + +CONSTCD11 +inline +year_month_day +operator/(int y, const month_day& md) NOEXCEPT +{ + return year(y) / md; +} + +CONSTCD11 +inline +year_month_day +operator/(const month_day& md, const year& y) NOEXCEPT +{ + return y / md; +} + +CONSTCD11 +inline +year_month_day +operator/(const month_day& md, int y) NOEXCEPT +{ + return year(y) / md; +} + +// year_month_day_last from operator/() + +CONSTCD11 +inline +year_month_day_last +operator/(const year_month& ym, last_spec) NOEXCEPT +{ + return {ym.year(), month_day_last{ym.month()}}; +} + +CONSTCD11 +inline +year_month_day_last +operator/(const year& y, const month_day_last& mdl) NOEXCEPT +{ + return {y, mdl}; +} + +CONSTCD11 +inline +year_month_day_last +operator/(int y, const month_day_last& mdl) NOEXCEPT +{ + return year(y) / mdl; +} + +CONSTCD11 +inline +year_month_day_last +operator/(const month_day_last& mdl, const year& y) NOEXCEPT +{ + return y / mdl; +} + +CONSTCD11 +inline +year_month_day_last +operator/(const month_day_last& mdl, int y) NOEXCEPT +{ + return year(y) / mdl; +} + +// year_month_weekday from operator/() + +CONSTCD11 +inline +year_month_weekday +operator/(const year_month& ym, const weekday_indexed& wdi) NOEXCEPT +{ + return {ym.year(), ym.month(), wdi}; +} + +CONSTCD11 +inline +year_month_weekday +operator/(const year& y, const month_weekday& mwd) NOEXCEPT +{ + return {y, mwd.month(), mwd.weekday_indexed()}; +} + +CONSTCD11 +inline +year_month_weekday +operator/(int y, const month_weekday& mwd) NOEXCEPT +{ + return year(y) / mwd; +} + +CONSTCD11 +inline +year_month_weekday +operator/(const month_weekday& mwd, const year& y) NOEXCEPT +{ + return y / mwd; +} + +CONSTCD11 +inline +year_month_weekday +operator/(const month_weekday& mwd, int y) NOEXCEPT +{ + return year(y) / mwd; +} + +// year_month_weekday_last from operator/() + +CONSTCD11 +inline +year_month_weekday_last +operator/(const year_month& ym, const weekday_last& wdl) NOEXCEPT +{ + return {ym.year(), ym.month(), wdl}; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(const year& y, const month_weekday_last& mwdl) NOEXCEPT +{ + return {y, mwdl.month(), mwdl.weekday_last()}; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(int y, const month_weekday_last& mwdl) NOEXCEPT +{ + return year(y) / mwdl; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(const month_weekday_last& mwdl, const year& y) NOEXCEPT +{ + return y / mwdl; +} + +CONSTCD11 +inline +year_month_weekday_last +operator/(const month_weekday_last& mwdl, int y) NOEXCEPT +{ + return year(y) / mwdl; +} + +} // namespace solar_hijri + +#endif // SOLAR_HIJRI_H diff --git a/vendor/date/tz.h b/vendor/date/tz.h new file mode 100644 index 000000000..e25a3eed5 --- /dev/null +++ b/vendor/date/tz.h @@ -0,0 +1,2809 @@ +#ifndef TZ_H +#define TZ_H + +// The MIT License (MIT) +// +// Copyright (c) 2015, 2016, 2017 Howard Hinnant +// Copyright (c) 2017 Jiangang Zhuang +// Copyright (c) 2017 Aaron Bishop +// Copyright (c) 2017 Tomasz Kamiński +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// Our apologies. When the previous paragraph was written, lowercase had not yet +// been invented (that would involve another several millennia of evolution). +// We did not mean to shout. + +// Get more recent database at http://www.iana.org/time-zones + +// The notion of "current timezone" is something the operating system is expected to "just +// know". How it knows this is system specific. It's often a value set by the user at OS +// installation time and recorded by the OS somewhere. On Linux and Mac systems the current +// timezone name is obtained by looking at the name or contents of a particular file on +// disk. On Windows the current timezone name comes from the registry. In either method, +// there is no guarantee that the "native" current timezone name obtained will match any +// of the "Standard" names in this library's "database". On Linux, the names usually do +// seem to match so mapping functions to map from native to "Standard" are typically not +// required. On Windows, the names are never "Standard" so mapping is always required. +// Technically any OS may use the mapping process but currently only Windows does use it. + +#ifndef USE_OS_TZDB +# define USE_OS_TZDB 0 +#endif + +#ifndef HAS_REMOTE_API +# if USE_OS_TZDB == 0 +# if defined _WIN32 || defined __ANDROID__ +# define HAS_REMOTE_API 0 +# else +# define HAS_REMOTE_API 1 +# endif +# else // HAS_REMOTE_API makes no sense when using the OS timezone database +# define HAS_REMOTE_API 0 +# endif +#endif + +#ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wconstant-logical-operand" +#endif + +static_assert(!(USE_OS_TZDB && HAS_REMOTE_API), + "USE_OS_TZDB and HAS_REMOTE_API can not be used together"); + +#ifdef __clang__ +# pragma clang diagnostic pop +#endif + +#ifndef AUTO_DOWNLOAD +# define AUTO_DOWNLOAD HAS_REMOTE_API +#endif + +static_assert(HAS_REMOTE_API == 0 ? AUTO_DOWNLOAD == 0 : true, + "AUTO_DOWNLOAD can not be turned on without HAS_REMOTE_API"); + +#ifndef USE_SHELL_API +# define USE_SHELL_API 1 +#endif + +#if USE_OS_TZDB +# ifdef _WIN32 +# error "USE_OS_TZDB can not be used on Windows" +# endif +#endif + +#ifndef HAS_DEDUCTION_GUIDES +# if __cplusplus >= 201703 +# define HAS_DEDUCTION_GUIDES 1 +# else +# define HAS_DEDUCTION_GUIDES 0 +# endif +#endif // HAS_DEDUCTION_GUIDES + +#include "date.h" + +#if defined(_MSC_VER) && (_MSC_VER < 1900) +#include "tz_private.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +# ifdef DATE_BUILD_DLL +# define DATE_API __declspec(dllexport) +# elif defined(DATE_USE_DLL) +# define DATE_API __declspec(dllimport) +# else +# define DATE_API +# endif +#else +# ifdef DATE_BUILD_DLL +# define DATE_API __attribute__ ((visibility ("default"))) +# else +# define DATE_API +# endif +#endif + +namespace date +{ + +enum class choose {earliest, latest}; + +#if defined(BUILD_TZ_LIB) +# if defined(ANDROID) || defined(__ANDROID__) +struct tzdb; +static std::unique_ptr init_tzdb(); +# endif // defined(ANDROID) || defined(__ANDROID__) +#endif // defined(BUILD_TZ_LIB) + +namespace detail +{ + struct undocumented; + + template + struct nodeduct + { + using type = T; + }; + + template + using nodeduct_t = typename nodeduct::type; +} + +struct sys_info +{ + sys_seconds begin; + sys_seconds end; + std::chrono::seconds offset; + std::chrono::minutes save; + std::string abbrev; +}; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const sys_info& r) +{ + os << r.begin << '\n'; + os << r.end << '\n'; + os << make_time(r.offset) << "\n"; + os << make_time(r.save) << "\n"; + os << r.abbrev << '\n'; + return os; +} + +struct local_info +{ + enum {unique, nonexistent, ambiguous} result; + sys_info first; + sys_info second; +}; + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const local_info& r) +{ + if (r.result == local_info::nonexistent) + os << "nonexistent between\n"; + else if (r.result == local_info::ambiguous) + os << "ambiguous between\n"; + os << r.first; + if (r.result != local_info::unique) + { + os << "and\n"; + os << r.second; + } + return os; +} + +class nonexistent_local_time + : public std::runtime_error +{ +public: + template + nonexistent_local_time(local_time tp, const local_info& i); + +private: + template + static + std::string + make_msg(local_time tp, const local_info& i); +}; + +template +inline +nonexistent_local_time::nonexistent_local_time(local_time tp, + const local_info& i) + : std::runtime_error(make_msg(tp, i)) +{ +} + +template +std::string +nonexistent_local_time::make_msg(local_time tp, const local_info& i) +{ + assert(i.result == local_info::nonexistent); + std::ostringstream os; + os << tp << " is in a gap between\n" + << local_seconds{i.first.end.time_since_epoch()} + i.first.offset << ' ' + << i.first.abbrev << " and\n" + << local_seconds{i.second.begin.time_since_epoch()} + i.second.offset << ' ' + << i.second.abbrev + << " which are both equivalent to\n"; + date::operator<<(os, i.first.end) << " UTC"; + return os.str(); +} + +class ambiguous_local_time + : public std::runtime_error +{ +public: + template + ambiguous_local_time(local_time tp, const local_info& i); + +private: + template + static + std::string + make_msg(local_time tp, const local_info& i); +}; + +template +inline +ambiguous_local_time::ambiguous_local_time(local_time tp, const local_info& i) + : std::runtime_error(make_msg(tp, i)) +{ +} + +template +std::string +ambiguous_local_time::make_msg(local_time tp, const local_info& i) +{ + assert(i.result == local_info::ambiguous); + std::ostringstream os; + os << tp << " is ambiguous. It could be\n" + << tp << ' ' << i.first.abbrev << " == " + << tp - i.first.offset << " UTC or\n" + << tp << ' ' << i.second.abbrev << " == " + << tp - i.second.offset << " UTC"; + return os.str(); +} + +class time_zone; + +#if HAS_STRING_VIEW +DATE_API const time_zone* locate_zone(std::string_view tz_name); +#else +DATE_API const time_zone* locate_zone(const std::string& tz_name); +#endif + +DATE_API const time_zone* current_zone(); + +template +struct zoned_traits +{ +}; + +template <> +struct zoned_traits +{ + static + const time_zone* + default_zone() + { + return date::locate_zone("Etc/UTC"); + } + +#if HAS_STRING_VIEW + + static + const time_zone* + locate_zone(std::string_view name) + { + return date::locate_zone(name); + } + +#else // !HAS_STRING_VIEW + + static + const time_zone* + locate_zone(const std::string& name) + { + return date::locate_zone(name); + } + + static + const time_zone* + locate_zone(const char* name) + { + return date::locate_zone(name); + } + +#endif // !HAS_STRING_VIEW +}; + +template +class zoned_time; + +template +bool +operator==(const zoned_time& x, + const zoned_time& y); + +template +class zoned_time +{ +public: + using duration = typename std::common_type::type; + +private: + TimeZonePtr zone_; + sys_time tp_; + +public: +#if !defined(_MSC_VER) || (_MSC_VER > 1916) + template ::default_zone())> +#endif + zoned_time(); + +#if !defined(_MSC_VER) || (_MSC_VER > 1916) + template ::default_zone())> +#endif + zoned_time(const sys_time& st); + explicit zoned_time(TimeZonePtr z); + +#if HAS_STRING_VIEW + template ::locate_zone(std::string_view())) + >::value + >::type> + explicit zoned_time(std::string_view name); +#else +# if !defined(_MSC_VER) || (_MSC_VER > 1916) + template ::locate_zone(std::string())) + >::value + >::type> +# endif + explicit zoned_time(const std::string& name); +#endif + + template , + sys_time>::value + >::type> + zoned_time(const zoned_time& zt) NOEXCEPT; + + zoned_time(TimeZonePtr z, const sys_time& st); + +#if !defined(_MSC_VER) || (_MSC_VER > 1916) + template ()->to_sys(local_time{})), + sys_time + >::value + >::type> +#endif + zoned_time(TimeZonePtr z, const local_time& tp); + +#if !defined(_MSC_VER) || (_MSC_VER > 1916) + template ()->to_sys(local_time{}, + choose::earliest)), + sys_time + >::value + >::type> +#endif + zoned_time(TimeZonePtr z, const local_time& tp, choose c); + + template , + sys_time>::value + >::type> + zoned_time(TimeZonePtr z, const zoned_time& zt); + + template , + sys_time>::value + >::type> + zoned_time(TimeZonePtr z, const zoned_time& zt, choose); + +#if HAS_STRING_VIEW + + template ::locate_zone(std::string_view())), + sys_time + >::value + >::type> + zoned_time(std::string_view name, detail::nodeduct_t&> st); + + template ::locate_zone(std::string_view())), + local_time + >::value + >::type> + zoned_time(std::string_view name, detail::nodeduct_t&> tp); + + template ::locate_zone(std::string_view())), + local_time, + choose + >::value + >::type> + zoned_time(std::string_view name, detail::nodeduct_t&> tp, choose c); + + template , + sys_time>::value && + std::is_constructible + < + zoned_time, + decltype(zoned_traits::locate_zone(std::string_view())), + zoned_time + >::value + >::type> + zoned_time(std::string_view name, const zoned_time& zt); + + template , + sys_time>::value && + std::is_constructible + < + zoned_time, + decltype(zoned_traits::locate_zone(std::string_view())), + zoned_time, + choose + >::value + >::type> + zoned_time(std::string_view name, const zoned_time& zt, choose); + +#else // !HAS_STRING_VIEW + +#if !defined(_MSC_VER) || (_MSC_VER > 1916) + template ::locate_zone(std::string())), + sys_time + >::value + >::type> +#endif + zoned_time(const std::string& name, const sys_time& st); + +#if !defined(_MSC_VER) || (_MSC_VER > 1916) + template ::locate_zone(std::string())), + sys_time + >::value + >::type> +#endif + zoned_time(const char* name, const sys_time& st); + +#if !defined(_MSC_VER) || (_MSC_VER > 1916) + template ::locate_zone(std::string())), + local_time + >::value + >::type> +#endif + zoned_time(const std::string& name, const local_time& tp); + +#if !defined(_MSC_VER) || (_MSC_VER > 1916) + template ::locate_zone(std::string())), + local_time + >::value + >::type> +#endif + zoned_time(const char* name, const local_time& tp); + +#if !defined(_MSC_VER) || (_MSC_VER > 1916) + template ::locate_zone(std::string())), + local_time, + choose + >::value + >::type> +#endif + zoned_time(const std::string& name, const local_time& tp, choose c); + +#if !defined(_MSC_VER) || (_MSC_VER > 1916) + template ::locate_zone(std::string())), + local_time, + choose + >::value + >::type> +#endif + zoned_time(const char* name, const local_time& tp, choose c); + +#if !defined(_MSC_VER) || (_MSC_VER > 1916) + template , + sys_time>::value && + std::is_constructible + < + zoned_time, + decltype(zoned_traits::locate_zone(std::string())), + zoned_time + >::value + >::type> +#else + template +#endif + zoned_time(const std::string& name, const zoned_time& zt); + +#if !defined(_MSC_VER) || (_MSC_VER > 1916) + template , + sys_time>::value && + std::is_constructible + < + zoned_time, + decltype(zoned_traits::locate_zone(std::string())), + zoned_time + >::value + >::type> +#else + template +#endif + zoned_time(const char* name, const zoned_time& zt); + +#if !defined(_MSC_VER) || (_MSC_VER > 1916) + template , + sys_time>::value && + std::is_constructible + < + zoned_time, + decltype(zoned_traits::locate_zone(std::string())), + zoned_time, + choose + >::value + >::type> +#else + template +#endif + zoned_time(const std::string& name, const zoned_time& zt, + choose); + +#if !defined(_MSC_VER) || (_MSC_VER > 1916) + template , + sys_time>::value && + std::is_constructible + < + zoned_time, + decltype(zoned_traits::locate_zone(std::string())), + zoned_time, + choose + >::value + >::type> +#else + template +#endif + zoned_time(const char* name, const zoned_time& zt, + choose); + +#endif // !HAS_STRING_VIEW + + zoned_time& operator=(const sys_time& st); + zoned_time& operator=(const local_time& ut); + + explicit operator sys_time() const; + explicit operator local_time() const; + + TimeZonePtr get_time_zone() const; + local_time get_local_time() const; + sys_time get_sys_time() const; + sys_info get_info() const; + + template + friend + bool + operator==(const zoned_time& x, + const zoned_time& y); + + template + friend + std::basic_ostream& + operator<<(std::basic_ostream& os, + const zoned_time& t); + +private: + template friend class zoned_time; + + template + static + TimeZonePtr2&& + check(TimeZonePtr2&& p); +}; + +using zoned_seconds = zoned_time; + +#if HAS_DEDUCTION_GUIDES + +namespace detail +{ + template + using time_zone_representation = + std::conditional_t + < + std::is_convertible::value, + time_zone const*, + std::remove_cv_t> + >; +} + +zoned_time() + -> zoned_time; + +template +zoned_time(sys_time) + -> zoned_time>; + +template +zoned_time(TimeZonePtrOrName&&) + -> zoned_time>; + +template +zoned_time(TimeZonePtrOrName&&, sys_time) + -> zoned_time, detail::time_zone_representation>; + +template +zoned_time(TimeZonePtrOrName&&, local_time, choose = choose::earliest) + -> zoned_time, detail::time_zone_representation>; + +template +zoned_time(TimeZonePtrOrName&&, zoned_time, choose = choose::earliest) + -> zoned_time, detail::time_zone_representation>; + +#endif // HAS_DEDUCTION_GUIDES + +template +inline +bool +operator==(const zoned_time& x, + const zoned_time& y) +{ + return x.zone_ == y.zone_ && x.tp_ == y.tp_; +} + +template +inline +bool +operator!=(const zoned_time& x, + const zoned_time& y) +{ + return !(x == y); +} + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) + +namespace detail +{ +# if USE_OS_TZDB + struct transition; + struct expanded_ttinfo; +# else // !USE_OS_TZDB + struct zonelet; + class Rule; +# endif // !USE_OS_TZDB +} + +#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900) + +class time_zone +{ +private: + std::string name_; +#if USE_OS_TZDB + std::vector transitions_; + std::vector ttinfos_; +#else // !USE_OS_TZDB + std::vector zonelets_; +#endif // !USE_OS_TZDB + std::unique_ptr adjusted_; + +public: +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) + time_zone(time_zone&&) = default; + time_zone& operator=(time_zone&&) = default; +#else // defined(_MSC_VER) && (_MSC_VER < 1900) + time_zone(time_zone&& src); + time_zone& operator=(time_zone&& src); +#endif // defined(_MSC_VER) && (_MSC_VER < 1900) + + DATE_API explicit time_zone(const std::string& s, detail::undocumented); + + const std::string& name() const NOEXCEPT; + + template sys_info get_info(sys_time st) const; + template local_info get_info(local_time tp) const; + + template + sys_time::type> + to_sys(local_time tp) const; + + template + sys_time::type> + to_sys(local_time tp, choose z) const; + + template + local_time::type> + to_local(sys_time tp) const; + + friend bool operator==(const time_zone& x, const time_zone& y) NOEXCEPT; + friend bool operator< (const time_zone& x, const time_zone& y) NOEXCEPT; + friend DATE_API std::ostream& operator<<(std::ostream& os, const time_zone& z); + +#if !USE_OS_TZDB + DATE_API void add(const std::string& s); +#else +# if defined(BUILD_TZ_LIB) +# if defined(ANDROID) || defined(__ANDROID__) + friend std::unique_ptr init_tzdb(); +# endif // defined(ANDROID) || defined(__ANDROID__) +# endif // defined(BUILD_TZ_LIB) +#endif // !USE_OS_TZDB + +private: + DATE_API sys_info get_info_impl(sys_seconds tp) const; + DATE_API local_info get_info_impl(local_seconds tp) const; + + template + sys_time::type> + to_sys_impl(local_time tp, choose z, std::false_type) const; + template + sys_time::type> + to_sys_impl(local_time tp, choose, std::true_type) const; + +#if USE_OS_TZDB + DATE_API void init() const; + DATE_API void init_impl(); + DATE_API sys_info + load_sys_info(std::vector::const_iterator i) const; + + template + DATE_API void + load_data(std::istream& inf, std::int32_t tzh_leapcnt, std::int32_t tzh_timecnt, + std::int32_t tzh_typecnt, std::int32_t tzh_charcnt); +# if defined(ANDROID) || defined(__ANDROID__) + void parse_from_android_tzdata(std::ifstream& inf, const std::size_t off); +# endif // defined(ANDROID) || defined(__ANDROID__) +#else // !USE_OS_TZDB + DATE_API sys_info get_info_impl(sys_seconds tp, int tz_int) const; + DATE_API void adjust_infos(const std::vector& rules); + DATE_API void parse_info(std::istream& in); +#endif // !USE_OS_TZDB +}; + +#if defined(_MSC_VER) && (_MSC_VER < 1900) + +inline +time_zone::time_zone(time_zone&& src) + : name_(std::move(src.name_)) + , zonelets_(std::move(src.zonelets_)) + , adjusted_(std::move(src.adjusted_)) + {} + +inline +time_zone& +time_zone::operator=(time_zone&& src) +{ + name_ = std::move(src.name_); + zonelets_ = std::move(src.zonelets_); + adjusted_ = std::move(src.adjusted_); + return *this; +} + +#endif // defined(_MSC_VER) && (_MSC_VER < 1900) + +inline +const std::string& +time_zone::name() const NOEXCEPT +{ + return name_; +} + +template +inline +sys_info +time_zone::get_info(sys_time st) const +{ + return get_info_impl(date::floor(st)); +} + +template +inline +local_info +time_zone::get_info(local_time tp) const +{ + return get_info_impl(date::floor(tp)); +} + +template +inline +sys_time::type> +time_zone::to_sys(local_time tp) const +{ + return to_sys_impl(tp, choose{}, std::true_type{}); +} + +template +inline +sys_time::type> +time_zone::to_sys(local_time tp, choose z) const +{ + return to_sys_impl(tp, z, std::false_type{}); +} + +template +inline +local_time::type> +time_zone::to_local(sys_time tp) const +{ + using LT = local_time::type>; + auto i = get_info(tp); + return LT{(tp + i.offset).time_since_epoch()}; +} + +inline bool operator==(const time_zone& x, const time_zone& y) NOEXCEPT {return x.name_ == y.name_;} +inline bool operator< (const time_zone& x, const time_zone& y) NOEXCEPT {return x.name_ < y.name_;} + +inline bool operator!=(const time_zone& x, const time_zone& y) NOEXCEPT {return !(x == y);} +inline bool operator> (const time_zone& x, const time_zone& y) NOEXCEPT {return y < x;} +inline bool operator<=(const time_zone& x, const time_zone& y) NOEXCEPT {return !(y < x);} +inline bool operator>=(const time_zone& x, const time_zone& y) NOEXCEPT {return !(x < y);} + +template +sys_time::type> +time_zone::to_sys_impl(local_time tp, choose z, std::false_type) const +{ + auto i = get_info(tp); + if (i.result == local_info::nonexistent) + { + return i.first.end; + } + else if (i.result == local_info::ambiguous) + { + if (z == choose::latest) + return sys_time{tp.time_since_epoch()} - i.second.offset; + } + return sys_time{tp.time_since_epoch()} - i.first.offset; +} + +template +sys_time::type> +time_zone::to_sys_impl(local_time tp, choose, std::true_type) const +{ + auto i = get_info(tp); + if (i.result == local_info::nonexistent) + throw nonexistent_local_time(tp, i); + else if (i.result == local_info::ambiguous) + throw ambiguous_local_time(tp, i); + return sys_time{tp.time_since_epoch()} - i.first.offset; +} + +#if !USE_OS_TZDB + +class time_zone_link +{ +private: + std::string name_; + std::string target_; +public: + DATE_API explicit time_zone_link(const std::string& s); + + const std::string& name() const {return name_;} + const std::string& target() const {return target_;} + + friend bool operator==(const time_zone_link& x, const time_zone_link& y) {return x.name_ == y.name_;} + friend bool operator< (const time_zone_link& x, const time_zone_link& y) {return x.name_ < y.name_;} + + friend DATE_API std::ostream& operator<<(std::ostream& os, const time_zone_link& x); +}; + +using link = time_zone_link; + +inline bool operator!=(const time_zone_link& x, const time_zone_link& y) {return !(x == y);} +inline bool operator> (const time_zone_link& x, const time_zone_link& y) {return y < x;} +inline bool operator<=(const time_zone_link& x, const time_zone_link& y) {return !(y < x);} +inline bool operator>=(const time_zone_link& x, const time_zone_link& y) {return !(x < y);} + +#endif // !USE_OS_TZDB + +class leap_second +{ +private: + sys_seconds date_; + +public: +#if USE_OS_TZDB + DATE_API explicit leap_second(const sys_seconds& s, detail::undocumented); +#else + DATE_API explicit leap_second(const std::string& s, detail::undocumented); +#endif + + constexpr sys_seconds date() const noexcept {return date_;} + constexpr std::chrono::seconds value() const noexcept {return std::chrono::seconds{1};} + + friend bool operator==(const leap_second& x, const leap_second& y) {return x.date_ == y.date_;} + friend bool operator< (const leap_second& x, const leap_second& y) {return x.date_ < y.date_;} + + template + friend + bool + operator==(const leap_second& x, const sys_time& y) + { + return x.date_ == y; + } + + template + friend + bool + operator< (const leap_second& x, const sys_time& y) + { + return x.date_ < y; + } + + template + friend + bool + operator< (const sys_time& x, const leap_second& y) + { + return x < y.date_; + } + + friend DATE_API std::ostream& operator<<(std::ostream& os, const leap_second& x); +}; + +inline bool operator!=(const leap_second& x, const leap_second& y) {return !(x == y);} +inline bool operator> (const leap_second& x, const leap_second& y) {return y < x;} +inline bool operator<=(const leap_second& x, const leap_second& y) {return !(y < x);} +inline bool operator>=(const leap_second& x, const leap_second& y) {return !(x < y);} + +template +inline +bool +operator==(const sys_time& x, const leap_second& y) +{ + return y == x; +} + +template +inline +bool +operator!=(const leap_second& x, const sys_time& y) +{ + return !(x == y); +} + +template +inline +bool +operator!=(const sys_time& x, const leap_second& y) +{ + return !(x == y); +} + +template +inline +bool +operator> (const leap_second& x, const sys_time& y) +{ + return y < x; +} + +template +inline +bool +operator> (const sys_time& x, const leap_second& y) +{ + return y < x; +} + +template +inline +bool +operator<=(const leap_second& x, const sys_time& y) +{ + return !(y < x); +} + +template +inline +bool +operator<=(const sys_time& x, const leap_second& y) +{ + return !(y < x); +} + +template +inline +bool +operator>=(const leap_second& x, const sys_time& y) +{ + return !(x < y); +} + +template +inline +bool +operator>=(const sys_time& x, const leap_second& y) +{ + return !(x < y); +} + +using leap = leap_second; + +#ifdef _WIN32 + +namespace detail +{ + +// The time zone mapping is modelled after this data file: +// http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml +// and the field names match the element names from the mapZone element +// of windowsZones.xml. +// The website displays this file here: +// http://www.unicode.org/cldr/charts/latest/supplemental/zone_tzid.html +// The html view is sorted before being displayed but is otherwise the same +// There is a mapping between the os centric view (in this case windows) +// the html displays uses and the generic view the xml file. +// That mapping is this: +// display column "windows" -> xml field "other". +// display column "region" -> xml field "territory". +// display column "tzid" -> xml field "type". +// This structure uses the generic terminology because it could be +// used to to support other os/native name conversions, not just windows, +// and using the same generic names helps retain the connection to the +// origin of the data that we are using. +struct timezone_mapping +{ + timezone_mapping(const char* other, const char* territory, const char* type) + : other(other), territory(territory), type(type) + { + } + timezone_mapping() = default; + std::string other; + std::string territory; + std::string type; +}; + +} // detail + +#endif // _WIN32 + +struct tzdb +{ + std::string version = "unknown"; + std::vector zones; +#if !USE_OS_TZDB + std::vector links; +#endif + std::vector leap_seconds; +#if !USE_OS_TZDB + std::vector rules; +#endif +#ifdef _WIN32 + std::vector mappings; +#endif + tzdb* next = nullptr; + + tzdb() = default; +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) + tzdb(tzdb&&) = default; + tzdb& operator=(tzdb&&) = default; +#else // defined(_MSC_VER) && (_MSC_VER < 1900) + tzdb(tzdb&& src) + : version(std::move(src.version)) + , zones(std::move(src.zones)) + , links(std::move(src.links)) + , leap_seconds(std::move(src.leap_seconds)) + , rules(std::move(src.rules)) + , mappings(std::move(src.mappings)) + {} + + tzdb& operator=(tzdb&& src) + { + version = std::move(src.version); + zones = std::move(src.zones); + links = std::move(src.links); + leap_seconds = std::move(src.leap_seconds); + rules = std::move(src.rules); + mappings = std::move(src.mappings); + return *this; + } +#endif // defined(_MSC_VER) && (_MSC_VER < 1900) + +#if HAS_STRING_VIEW + DATE_API const time_zone* locate_zone(std::string_view tz_name) const; +#else + DATE_API const time_zone* locate_zone(const std::string& tz_name) const; +#endif + DATE_API const time_zone* current_zone() const; +}; + +using TZ_DB = tzdb; + +DATE_API std::ostream& +operator<<(std::ostream& os, const tzdb& db); + +DATE_API const tzdb& get_tzdb(); + +class tzdb_list +{ + std::atomic head_{nullptr}; + +public: + DATE_API ~tzdb_list(); + tzdb_list() = default; + DATE_API tzdb_list(tzdb_list&& x) NOEXCEPT; + + const tzdb& front() const NOEXCEPT {return *head_;} + tzdb& front() NOEXCEPT {return *head_;} + + class const_iterator; + + const_iterator begin() const NOEXCEPT; + const_iterator end() const NOEXCEPT; + + const_iterator cbegin() const NOEXCEPT; + const_iterator cend() const NOEXCEPT; + + DATE_API const_iterator erase_after(const_iterator p) NOEXCEPT; + + struct undocumented_helper; +private: + void push_front(tzdb* tzdb) NOEXCEPT; +}; + +class tzdb_list::const_iterator +{ + tzdb* p_ = nullptr; + + explicit const_iterator(tzdb* p) NOEXCEPT : p_{p} {} +public: + const_iterator() = default; + + using iterator_category = std::forward_iterator_tag; + using value_type = tzdb; + using reference = const value_type&; + using pointer = const value_type*; + using difference_type = std::ptrdiff_t; + + reference operator*() const NOEXCEPT {return *p_;} + pointer operator->() const NOEXCEPT {return p_;} + + const_iterator& operator++() NOEXCEPT {p_ = p_->next; return *this;} + const_iterator operator++(int) NOEXCEPT {auto t = *this; ++(*this); return t;} + + friend + bool + operator==(const const_iterator& x, const const_iterator& y) NOEXCEPT + {return x.p_ == y.p_;} + + friend + bool + operator!=(const const_iterator& x, const const_iterator& y) NOEXCEPT + {return !(x == y);} + + friend class tzdb_list; +}; + +inline +tzdb_list::const_iterator +tzdb_list::begin() const NOEXCEPT +{ + return const_iterator{head_}; +} + +inline +tzdb_list::const_iterator +tzdb_list::end() const NOEXCEPT +{ + return const_iterator{nullptr}; +} + +inline +tzdb_list::const_iterator +tzdb_list::cbegin() const NOEXCEPT +{ + return begin(); +} + +inline +tzdb_list::const_iterator +tzdb_list::cend() const NOEXCEPT +{ + return end(); +} + +DATE_API tzdb_list& get_tzdb_list(); + +#if !USE_OS_TZDB + +DATE_API const tzdb& reload_tzdb(); +DATE_API void set_install(const std::string& install); + +#endif // !USE_OS_TZDB + +#if HAS_REMOTE_API + +DATE_API std::string remote_version(); +// if provided error_buffer size should be at least CURL_ERROR_SIZE +DATE_API bool remote_download(const std::string& version, char* error_buffer = nullptr); +DATE_API bool remote_install(const std::string& version); + +#endif + +// zoned_time + +namespace detail +{ + +template +inline +T* +to_raw_pointer(T* p) NOEXCEPT +{ + return p; +} + +template +inline +auto +to_raw_pointer(Pointer p) NOEXCEPT + -> decltype(detail::to_raw_pointer(p.operator->())) +{ + return detail::to_raw_pointer(p.operator->()); +} + +} // namespace detail + +template +template +inline +TimeZonePtr2&& +zoned_time::check(TimeZonePtr2&& p) +{ + if (detail::to_raw_pointer(p) == nullptr) + throw std::runtime_error( + "zoned_time constructed with a time zone pointer == nullptr"); + return std::forward(p); +} + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#endif +inline +zoned_time::zoned_time() + : zone_(check(zoned_traits::default_zone())) + {} + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#endif +inline +zoned_time::zoned_time(const sys_time& st) + : zone_(check(zoned_traits::default_zone())) + , tp_(st) + {} + +template +inline +zoned_time::zoned_time(TimeZonePtr z) + : zone_(check(std::move(z))) + {} + +#if HAS_STRING_VIEW + +template +template +inline +zoned_time::zoned_time(std::string_view name) + : zoned_time(zoned_traits::locate_zone(name)) + {} + +#else // !HAS_STRING_VIEW + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#endif +inline +zoned_time::zoned_time(const std::string& name) + : zoned_time(zoned_traits::locate_zone(name)) + {} + +#endif // !HAS_STRING_VIEW + +template +template +inline +zoned_time::zoned_time(const zoned_time& zt) NOEXCEPT + : zone_(zt.zone_) + , tp_(zt.tp_) + {} + +template +inline +zoned_time::zoned_time(TimeZonePtr z, const sys_time& st) + : zone_(check(std::move(z))) + , tp_(st) + {} + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#endif +inline +zoned_time::zoned_time(TimeZonePtr z, const local_time& t) + : zone_(check(std::move(z))) + , tp_(zone_->to_sys(t)) + {} + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#endif +inline +zoned_time::zoned_time(TimeZonePtr z, const local_time& t, + choose c) + : zone_(check(std::move(z))) + , tp_(zone_->to_sys(t, c)) + {} + +template +template +inline +zoned_time::zoned_time(TimeZonePtr z, + const zoned_time& zt) + : zone_(check(std::move(z))) + , tp_(zt.tp_) + {} + +template +template +inline +zoned_time::zoned_time(TimeZonePtr z, + const zoned_time& zt, choose) + : zoned_time(std::move(z), zt) + {} + +#if HAS_STRING_VIEW + +template +template +inline +zoned_time::zoned_time(std::string_view name, + detail::nodeduct_t&> st) + : zoned_time(zoned_traits::locate_zone(name), st) + {} + +template +template +inline +zoned_time::zoned_time(std::string_view name, + detail::nodeduct_t&> t) + : zoned_time(zoned_traits::locate_zone(name), t) + {} + +template +template +inline +zoned_time::zoned_time(std::string_view name, + detail::nodeduct_t&> t, choose c) + : zoned_time(zoned_traits::locate_zone(name), t, c) + {} + +template +template +inline +zoned_time::zoned_time(std::string_view name, + const zoned_time& zt) + : zoned_time(zoned_traits::locate_zone(name), zt) + {} + +template +template +inline +zoned_time::zoned_time(std::string_view name, + const zoned_time& zt, + choose c) + : zoned_time(zoned_traits::locate_zone(name), zt, c) + {} + +#else // !HAS_STRING_VIEW + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#endif +inline +zoned_time::zoned_time(const std::string& name, + const sys_time& st) + : zoned_time(zoned_traits::locate_zone(name), st) + {} + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#endif +inline +zoned_time::zoned_time(const char* name, + const sys_time& st) + : zoned_time(zoned_traits::locate_zone(name), st) + {} + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#endif +inline +zoned_time::zoned_time(const std::string& name, + const local_time& t) + : zoned_time(zoned_traits::locate_zone(name), t) + {} + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#endif +inline +zoned_time::zoned_time(const char* name, + const local_time& t) + : zoned_time(zoned_traits::locate_zone(name), t) + {} + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#endif +inline +zoned_time::zoned_time(const std::string& name, + const local_time& t, choose c) + : zoned_time(zoned_traits::locate_zone(name), t, c) + {} + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#endif +inline +zoned_time::zoned_time(const char* name, + const local_time& t, choose c) + : zoned_time(zoned_traits::locate_zone(name), t, c) + {} + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#else +template +#endif +inline +zoned_time::zoned_time(const std::string& name, + const zoned_time& zt) + : zoned_time(zoned_traits::locate_zone(name), zt) + {} + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#else +template +#endif +inline +zoned_time::zoned_time(const char* name, + const zoned_time& zt) + : zoned_time(zoned_traits::locate_zone(name), zt) + {} + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#else +template +#endif +inline +zoned_time::zoned_time(const std::string& name, + const zoned_time& zt, + choose c) + : zoned_time(zoned_traits::locate_zone(name), zt, c) + {} + +template +#if !defined(_MSC_VER) || (_MSC_VER > 1916) +template +#else +template +#endif +inline +zoned_time::zoned_time(const char* name, + const zoned_time& zt, + choose c) + : zoned_time(zoned_traits::locate_zone(name), zt, c) + {} + +#endif // HAS_STRING_VIEW + +template +inline +zoned_time& +zoned_time::operator=(const sys_time& st) +{ + tp_ = st; + return *this; +} + +template +inline +zoned_time& +zoned_time::operator=(const local_time& ut) +{ + tp_ = zone_->to_sys(ut); + return *this; +} + +template +inline +zoned_time::operator local_time::duration>() const +{ + return get_local_time(); +} + +template +inline +zoned_time::operator sys_time::duration>() const +{ + return get_sys_time(); +} + +template +inline +TimeZonePtr +zoned_time::get_time_zone() const +{ + return zone_; +} + +template +inline +local_time::duration> +zoned_time::get_local_time() const +{ + return zone_->to_local(tp_); +} + +template +inline +sys_time::duration> +zoned_time::get_sys_time() const +{ + return tp_; +} + +template +inline +sys_info +zoned_time::get_info() const +{ + return zone_->get_info(tp_); +} + +// make_zoned_time + +inline +zoned_time +make_zoned() +{ + return zoned_time(); +} + +template +inline +zoned_time::type> +make_zoned(const sys_time& tp) +{ + return zoned_time::type>(tp); +} + +template 1916) +#if !defined(__INTEL_COMPILER) || (__INTEL_COMPILER > 1600) + , class = typename std::enable_if + < + std::is_class + < + typename std::decay + < + decltype(*detail::to_raw_pointer(std::declval())) + >::type + >{} + >::type +#endif +#endif + > +inline +zoned_time +make_zoned(TimeZonePtr z) +{ + return zoned_time(std::move(z)); +} + +inline +zoned_seconds +make_zoned(const std::string& name) +{ + return zoned_seconds(name); +} + +template 1916) +#if !defined(__INTEL_COMPILER) || (__INTEL_COMPILER > 1600) + , class = typename std::enable_if + < + std::is_class())>::type>{} + >::type +#endif +#endif + > +inline +zoned_time::type, TimeZonePtr> +make_zoned(TimeZonePtr zone, const local_time& tp) +{ + return zoned_time::type, + TimeZonePtr>(std::move(zone), tp); +} + +template 1916) +#if !defined(__INTEL_COMPILER) || (__INTEL_COMPILER > 1600) + , class = typename std::enable_if + < + std::is_class())>::type>{} + >::type +#endif +#endif + > +inline +zoned_time::type, TimeZonePtr> +make_zoned(TimeZonePtr zone, const local_time& tp, choose c) +{ + return zoned_time::type, + TimeZonePtr>(std::move(zone), tp, c); +} + +template +inline +zoned_time::type> +make_zoned(const std::string& name, const local_time& tp) +{ + return zoned_time::type>(name, tp); +} + +template +inline +zoned_time::type> +make_zoned(const std::string& name, const local_time& tp, choose c) +{ + return zoned_time::type>(name, tp, c); +} + +template +inline +zoned_time +make_zoned(TimeZonePtr zone, const zoned_time& zt) +{ + return zoned_time(std::move(zone), zt); +} + +template +inline +zoned_time +make_zoned(const std::string& name, const zoned_time& zt) +{ + return zoned_time(name, zt); +} + +template +inline +zoned_time +make_zoned(TimeZonePtr zone, const zoned_time& zt, choose c) +{ + return zoned_time(std::move(zone), zt, c); +} + +template +inline +zoned_time +make_zoned(const std::string& name, const zoned_time& zt, choose c) +{ + return zoned_time(name, zt, c); +} + +template 1916) +#if !defined(__INTEL_COMPILER) || (__INTEL_COMPILER > 1600) + , class = typename std::enable_if + < + std::is_class())>::type>{} + >::type +#endif +#endif + > +inline +zoned_time::type, TimeZonePtr> +make_zoned(TimeZonePtr zone, const sys_time& st) +{ + return zoned_time::type, + TimeZonePtr>(std::move(zone), st); +} + +template +inline +zoned_time::type> +make_zoned(const std::string& name, const sys_time& st) +{ + return zoned_time::type>(name, st); +} + +template +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, + const zoned_time& tp) +{ + using duration = typename zoned_time::duration; + using LT = local_time; + auto const st = tp.get_sys_time(); + auto const info = tp.get_time_zone()->get_info(st); + return to_stream(os, fmt, LT{(st+info.offset).time_since_epoch()}, + &info.abbrev, &info.offset); +} + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& os, const zoned_time& t) +{ + const CharT fmt[] = {'%', 'F', ' ', '%', 'T', ' ', '%', 'Z', CharT{}}; + return to_stream(os, fmt, t); +} + +class utc_clock +{ +public: + using duration = std::chrono::system_clock::duration; + using rep = duration::rep; + using period = duration::period; + using time_point = std::chrono::time_point; + static CONSTDATA bool is_steady = false; + + static time_point now(); + + template + static + std::chrono::time_point::type> + to_sys(const std::chrono::time_point&); + + template + static + std::chrono::time_point::type> + from_sys(const std::chrono::time_point&); + + template + static + std::chrono::time_point::type> + to_local(const std::chrono::time_point&); + + template + static + std::chrono::time_point::type> + from_local(const std::chrono::time_point&); +}; + +template + using utc_time = std::chrono::time_point; + +using utc_seconds = utc_time; + +template +utc_time::type> +utc_clock::from_sys(const sys_time& st) +{ + using std::chrono::seconds; + using CD = typename std::common_type::type; + auto const& leaps = get_tzdb().leap_seconds; + auto const lt = std::upper_bound(leaps.begin(), leaps.end(), st); + return utc_time{st.time_since_epoch() + seconds{lt-leaps.begin()}}; +} + +// Return pair +// first is true if ut is during a leap second insertion, otherwise false. +// If ut is during a leap second insertion, that leap second is included in the count +template +std::pair +is_leap_second(date::utc_time const& ut) +{ + using std::chrono::seconds; + using duration = typename std::common_type::type; + auto const& leaps = get_tzdb().leap_seconds; + auto tp = sys_time{ut.time_since_epoch()}; + auto const lt = std::upper_bound(leaps.begin(), leaps.end(), tp); + auto ds = seconds{lt-leaps.begin()}; + tp -= ds; + auto ls = false; + if (lt > leaps.begin()) + { + if (tp < lt[-1]) + { + if (tp >= lt[-1].date() - seconds{1}) + ls = true; + else + --ds; + } + } + return {ls, ds}; +} + +struct leap_second_info +{ + bool is_leap_second; + std::chrono::seconds elapsed; +}; + +template +leap_second_info +get_leap_second_info(date::utc_time const& ut) +{ + auto p = is_leap_second(ut); + return {p.first, p.second}; +} + +template +sys_time::type> +utc_clock::to_sys(const utc_time& ut) +{ + using std::chrono::seconds; + using CD = typename std::common_type::type; + auto ls = is_leap_second(ut); + auto tp = sys_time{ut.time_since_epoch() - ls.second}; + if (ls.first) + tp = floor(tp) + seconds{1} - CD{1}; + return tp; +} + +inline +utc_clock::time_point +utc_clock::now() +{ + return from_sys(std::chrono::system_clock::now()); +} + +template +utc_time::type> +utc_clock::from_local(const local_time& st) +{ + return from_sys(sys_time{st.time_since_epoch()}); +} + +template +local_time::type> +utc_clock::to_local(const utc_time& ut) +{ + using CD = typename std::common_type::type; + return local_time{to_sys(ut).time_since_epoch()}; +} + +template +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, + const utc_time& t) +{ + using std::chrono::seconds; + using CT = typename std::common_type::type; + const std::string abbrev("UTC"); + CONSTDATA seconds offset{0}; + auto ls = is_leap_second(t); + auto tp = sys_time{t.time_since_epoch() - ls.second}; + auto const sd = floor(tp); + year_month_day ymd = sd; + auto time = make_time(tp - sys_seconds{sd}); + time.seconds(detail::undocumented{}) += seconds{ls.first}; + fields fds{ymd, time}; + return to_stream(os, fmt, fds, &abbrev, &offset); +} + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const utc_time& t) +{ + const CharT fmt[] = {'%', 'F', ' ', '%', 'T', CharT{}}; + return to_stream(os, fmt, t); +} + +template > +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, + utc_time& tp, std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) +{ + using std::chrono::seconds; + using std::chrono::minutes; + using CT = typename std::common_type::type; + minutes offset_local{}; + auto offptr = offset ? offset : &offset_local; + fields fds{}; + fds.has_tod = true; + from_stream(is, fmt, fds, abbrev, offptr); + if (!fds.ymd.ok()) + is.setstate(std::ios::failbit); + if (!is.fail()) + { + bool is_60_sec = fds.tod.seconds() == seconds{60}; + if (is_60_sec) + fds.tod.seconds(detail::undocumented{}) -= seconds{1}; + auto tmp = utc_clock::from_sys(sys_days(fds.ymd) - *offptr + fds.tod.to_duration()); + if (is_60_sec) + tmp += seconds{1}; + if (is_60_sec != is_leap_second(tmp).first || !fds.tod.in_conventional_range()) + { + is.setstate(std::ios::failbit); + return is; + } + tp = std::chrono::time_point_cast(tmp); + } + return is; +} + +// tai_clock + +class tai_clock +{ +public: + using duration = std::chrono::system_clock::duration; + using rep = duration::rep; + using period = duration::period; + using time_point = std::chrono::time_point; + static const bool is_steady = false; + + static time_point now(); + + template + static + std::chrono::time_point::type> + to_utc(const std::chrono::time_point&) NOEXCEPT; + + template + static + std::chrono::time_point::type> + from_utc(const std::chrono::time_point&) NOEXCEPT; + + template + static + std::chrono::time_point::type> + to_local(const std::chrono::time_point&) NOEXCEPT; + + template + static + std::chrono::time_point::type> + from_local(const std::chrono::time_point&) NOEXCEPT; +}; + +template + using tai_time = std::chrono::time_point; + +using tai_seconds = tai_time; + +template +inline +utc_time::type> +tai_clock::to_utc(const tai_time& t) NOEXCEPT +{ + using std::chrono::seconds; + using CD = typename std::common_type::type; + return utc_time{t.time_since_epoch()} - + (sys_days(year{1970}/January/1) - sys_days(year{1958}/January/1) + seconds{10}); +} + +template +inline +tai_time::type> +tai_clock::from_utc(const utc_time& t) NOEXCEPT +{ + using std::chrono::seconds; + using CD = typename std::common_type::type; + return tai_time{t.time_since_epoch()} + + (sys_days(year{1970}/January/1) - sys_days(year{1958}/January/1) + seconds{10}); +} + +inline +tai_clock::time_point +tai_clock::now() +{ + return from_utc(utc_clock::now()); +} + +template +inline +local_time::type> +tai_clock::to_local(const tai_time& t) NOEXCEPT +{ + using CD = typename std::common_type::type; + return local_time{t.time_since_epoch()} - + (local_days(year{1970}/January/1) - local_days(year{1958}/January/1)); +} + +template +inline +tai_time::type> +tai_clock::from_local(const local_time& t) NOEXCEPT +{ + using CD = typename std::common_type::type; + return tai_time{t.time_since_epoch()} + + (local_days(year{1970}/January/1) - local_days(year{1958}/January/1)); +} + +template +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, + const tai_time& t) +{ + const std::string abbrev("TAI"); + CONSTDATA std::chrono::seconds offset{0}; + return to_stream(os, fmt, tai_clock::to_local(t), &abbrev, &offset); +} + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const tai_time& t) +{ + const CharT fmt[] = {'%', 'F', ' ', '%', 'T', CharT{}}; + return to_stream(os, fmt, t); +} + +template > +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, + tai_time& tp, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) +{ + local_time lp; + from_stream(is, fmt, lp, abbrev, offset); + if (!is.fail()) + tp = tai_clock::from_local(lp); + return is; +} + +// gps_clock + +class gps_clock +{ +public: + using duration = std::chrono::system_clock::duration; + using rep = duration::rep; + using period = duration::period; + using time_point = std::chrono::time_point; + static const bool is_steady = false; + + static time_point now(); + + template + static + std::chrono::time_point::type> + to_utc(const std::chrono::time_point&) NOEXCEPT; + + template + static + std::chrono::time_point::type> + from_utc(const std::chrono::time_point&) NOEXCEPT; + + template + static + std::chrono::time_point::type> + to_local(const std::chrono::time_point&) NOEXCEPT; + + template + static + std::chrono::time_point::type> + from_local(const std::chrono::time_point&) NOEXCEPT; +}; + +template + using gps_time = std::chrono::time_point; + +using gps_seconds = gps_time; + +template +inline +utc_time::type> +gps_clock::to_utc(const gps_time& t) NOEXCEPT +{ + using std::chrono::seconds; + using CD = typename std::common_type::type; + return utc_time{t.time_since_epoch()} + + (sys_days(year{1980}/January/Sunday[1]) - sys_days(year{1970}/January/1) + + seconds{9}); +} + +template +inline +gps_time::type> +gps_clock::from_utc(const utc_time& t) NOEXCEPT +{ + using std::chrono::seconds; + using CD = typename std::common_type::type; + return gps_time{t.time_since_epoch()} - + (sys_days(year{1980}/January/Sunday[1]) - sys_days(year{1970}/January/1) + + seconds{9}); +} + +inline +gps_clock::time_point +gps_clock::now() +{ + return from_utc(utc_clock::now()); +} + +template +inline +local_time::type> +gps_clock::to_local(const gps_time& t) NOEXCEPT +{ + using CD = typename std::common_type::type; + return local_time{t.time_since_epoch()} + + (local_days(year{1980}/January/Sunday[1]) - local_days(year{1970}/January/1)); +} + +template +inline +gps_time::type> +gps_clock::from_local(const local_time& t) NOEXCEPT +{ + using CD = typename std::common_type::type; + return gps_time{t.time_since_epoch()} - + (local_days(year{1980}/January/Sunday[1]) - local_days(year{1970}/January/1)); +} + + +template +std::basic_ostream& +to_stream(std::basic_ostream& os, const CharT* fmt, + const gps_time& t) +{ + const std::string abbrev("GPS"); + CONSTDATA std::chrono::seconds offset{0}; + return to_stream(os, fmt, gps_clock::to_local(t), &abbrev, &offset); +} + +template +std::basic_ostream& +operator<<(std::basic_ostream& os, const gps_time& t) +{ + const CharT fmt[] = {'%', 'F', ' ', '%', 'T', CharT{}}; + return to_stream(os, fmt, t); +} + +template > +std::basic_istream& +from_stream(std::basic_istream& is, const CharT* fmt, + gps_time& tp, + std::basic_string* abbrev = nullptr, + std::chrono::minutes* offset = nullptr) +{ + local_time lp; + from_stream(is, fmt, lp, abbrev, offset); + if (!is.fail()) + tp = gps_clock::from_local(lp); + return is; +} + +// clock_time_conversion + +template +struct clock_time_conversion +{}; + +template <> +struct clock_time_conversion +{ + template + CONSTCD14 + sys_time + operator()(const sys_time& st) const + { + return st; + } +}; + +template <> +struct clock_time_conversion +{ + template + CONSTCD14 + utc_time + operator()(const utc_time& ut) const + { + return ut; + } +}; + +template<> +struct clock_time_conversion +{ + template + CONSTCD14 + local_time + operator()(const local_time& lt) const + { + return lt; + } +}; + +template <> +struct clock_time_conversion +{ + template + utc_time::type> + operator()(const sys_time& st) const + { + return utc_clock::from_sys(st); + } +}; + +template <> +struct clock_time_conversion +{ + template + sys_time::type> + operator()(const utc_time& ut) const + { + return utc_clock::to_sys(ut); + } +}; + +template<> +struct clock_time_conversion +{ + template + CONSTCD14 + local_time + operator()(const sys_time& st) const + { + return local_time{st.time_since_epoch()}; + } +}; + +template<> +struct clock_time_conversion +{ + template + CONSTCD14 + sys_time + operator()(const local_time& lt) const + { + return sys_time{lt.time_since_epoch()}; + } +}; + +template<> +struct clock_time_conversion +{ + template + utc_time::type> + operator()(const local_time& lt) const + { + return utc_clock::from_local(lt); + } +}; + +template<> +struct clock_time_conversion +{ + template + local_time::type> + operator()(const utc_time& ut) const + { + return utc_clock::to_local(ut); + } +}; + +template +struct clock_time_conversion +{ + template + CONSTCD14 + std::chrono::time_point + operator()(const std::chrono::time_point& tp) const + { + return tp; + } +}; + +namespace ctc_detail +{ + +template + using time_point = std::chrono::time_point; + +using std::declval; +using std::chrono::system_clock; + +//Check if TimePoint is time for given clock, +//if not emits hard error +template +struct return_clock_time +{ + using clock_time_point = time_point; + using type = TimePoint; + + static_assert(std::is_same::value, + "time point with appropariate clock shall be returned"); +}; + +// Check if Clock has to_sys method accepting TimePoint with given duration const& and +// returning sys_time. If so has nested type member equal to return type to_sys. +template +struct return_to_sys +{}; + +template +struct return_to_sys + < + Clock, Duration, + decltype(Clock::to_sys(declval const&>()), void()) + > + : return_clock_time + < + system_clock, + decltype(Clock::to_sys(declval const&>())) + > +{}; + +// Similiar to above +template +struct return_from_sys +{}; + +template +struct return_from_sys + < + Clock, Duration, + decltype(Clock::from_sys(declval const&>()), + void()) + > + : return_clock_time + < + Clock, + decltype(Clock::from_sys(declval const&>())) + > +{}; + +// Similiar to above +template +struct return_to_utc +{}; + +template +struct return_to_utc + < + Clock, Duration, + decltype(Clock::to_utc(declval const&>()), void()) + > + : return_clock_time + < + utc_clock, + decltype(Clock::to_utc(declval const&>()))> +{}; + +// Similiar to above +template +struct return_from_utc +{}; + +template +struct return_from_utc + < + Clock, Duration, + decltype(Clock::from_utc(declval const&>()), + void()) + > + : return_clock_time + < + Clock, + decltype(Clock::from_utc(declval const&>())) + > +{}; + +// Similiar to above +template +struct return_to_local +{}; + +template +struct return_to_local + < + Clock, Duration, + decltype(Clock::to_local(declval const&>()), + void()) + > + : return_clock_time + < + local_t, + decltype(Clock::to_local(declval const&>())) + > +{}; + +// Similiar to above +template +struct return_from_local +{}; + +template +struct return_from_local + < + Clock, Duration, + decltype(Clock::from_local(declval const&>()), + void()) + > + : return_clock_time + < + Clock, + decltype(Clock::from_local(declval const&>())) + > +{}; + +} // namespace ctc_detail + +template +struct clock_time_conversion +{ + template + CONSTCD14 + typename ctc_detail::return_to_sys::type + operator()(const std::chrono::time_point& tp) const + { + return SrcClock::to_sys(tp); + } +}; + +template +struct clock_time_conversion +{ + template + CONSTCD14 + typename ctc_detail::return_from_sys::type + operator()(const sys_time& st) const + { + return DstClock::from_sys(st); + } +}; + +template +struct clock_time_conversion +{ + template + CONSTCD14 + typename ctc_detail::return_to_utc::type + operator()(const std::chrono::time_point& tp) const + { + return SrcClock::to_utc(tp); + } +}; + +template +struct clock_time_conversion +{ + template + CONSTCD14 + typename ctc_detail::return_from_utc::type + operator()(const utc_time& ut) const + { + return DstClock::from_utc(ut); + } +}; + +template +struct clock_time_conversion +{ + template + CONSTCD14 + typename ctc_detail::return_to_local::type + operator()(const std::chrono::time_point& tp) const + { + return SrcClock::to_local(tp); + } +}; + +template +struct clock_time_conversion +{ + template + CONSTCD14 + typename ctc_detail::return_from_local::type + operator()(const local_time& lt) const + { + return DstClock::from_local(lt); + } +}; + +namespace clock_cast_detail +{ + +template + using time_point = std::chrono::time_point; +using std::chrono::system_clock; + +template +CONSTCD14 +auto +conv_clock(const time_point& t) + -> decltype(std::declval>()(t)) +{ + return clock_time_conversion{}(t); +} + +//direct trait conversion, 1st candidate +template +CONSTCD14 +auto +cc_impl(const time_point& t, const time_point*) + -> decltype(conv_clock(t)) +{ + return conv_clock(t); +} + +//conversion through sys, 2nd candidate +template +CONSTCD14 +auto +cc_impl(const time_point& t, const void*) + -> decltype(conv_clock(conv_clock(t))) +{ + return conv_clock(conv_clock(t)); +} + +//conversion through utc, 2nd candidate +template +CONSTCD14 +auto +cc_impl(const time_point& t, const void*) + -> decltype(0, // MSVC_WORKAROUND + conv_clock(conv_clock(t))) +{ + return conv_clock(conv_clock(t)); +} + +//conversion through sys and utc, 3rd candidate +template +CONSTCD14 +auto +cc_impl(const time_point& t, ...) + -> decltype(conv_clock(conv_clock(conv_clock(t)))) +{ + return conv_clock(conv_clock(conv_clock(t))); +} + +//conversion through utc and sys, 3rd candidate +template +CONSTCD14 +auto +cc_impl(const time_point& t, ...) + -> decltype(0, // MSVC_WORKAROUND + conv_clock(conv_clock(conv_clock(t)))) +{ + return conv_clock(conv_clock(conv_clock(t))); +} + +} // namespace clock_cast_detail + +template +CONSTCD14 +auto +clock_cast(const std::chrono::time_point& tp) + -> decltype(clock_cast_detail::cc_impl(tp, &tp)) +{ + return clock_cast_detail::cc_impl(tp, &tp); +} + +// Deprecated API + +template +inline +sys_time::type> +to_sys_time(const utc_time& t) +{ + return utc_clock::to_sys(t); +} + +template +inline +sys_time::type> +to_sys_time(const tai_time& t) +{ + return utc_clock::to_sys(tai_clock::to_utc(t)); +} + +template +inline +sys_time::type> +to_sys_time(const gps_time& t) +{ + return utc_clock::to_sys(gps_clock::to_utc(t)); +} + + +template +inline +utc_time::type> +to_utc_time(const sys_time& t) +{ + return utc_clock::from_sys(t); +} + +template +inline +utc_time::type> +to_utc_time(const tai_time& t) +{ + return tai_clock::to_utc(t); +} + +template +inline +utc_time::type> +to_utc_time(const gps_time& t) +{ + return gps_clock::to_utc(t); +} + + +template +inline +tai_time::type> +to_tai_time(const sys_time& t) +{ + return tai_clock::from_utc(utc_clock::from_sys(t)); +} + +template +inline +tai_time::type> +to_tai_time(const utc_time& t) +{ + return tai_clock::from_utc(t); +} + +template +inline +tai_time::type> +to_tai_time(const gps_time& t) +{ + return tai_clock::from_utc(gps_clock::to_utc(t)); +} + + +template +inline +gps_time::type> +to_gps_time(const sys_time& t) +{ + return gps_clock::from_utc(utc_clock::from_sys(t)); +} + +template +inline +gps_time::type> +to_gps_time(const utc_time& t) +{ + return gps_clock::from_utc(t); +} + +template +inline +gps_time::type> +to_gps_time(const tai_time& t) +{ + return gps_clock::from_utc(tai_clock::to_utc(t)); +} + +} // namespace date + +#endif // TZ_H diff --git a/vendor/date/tz_private.h b/vendor/date/tz_private.h new file mode 100644 index 000000000..1a01f176e --- /dev/null +++ b/vendor/date/tz_private.h @@ -0,0 +1,315 @@ +#ifndef TZ_PRIVATE_H +#define TZ_PRIVATE_H + +// The MIT License (MIT) +// +// Copyright (c) 2015, 2016 Howard Hinnant +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// Our apologies. When the previous paragraph was written, lowercase had not yet +// been invented (that would involve another several millennia of evolution). +// We did not mean to shout. + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +#include "tz.h" +#else +#include "date.h" +#include +#endif + +namespace date +{ + +namespace detail +{ + +#if !USE_OS_TZDB + +enum class tz {utc, local, standard}; + +//forward declare to avoid warnings in gcc 6.2 +class MonthDayTime; +std::istream& operator>>(std::istream& is, MonthDayTime& x); +std::ostream& operator<<(std::ostream& os, const MonthDayTime& x); + + +class MonthDayTime +{ +private: + struct pair + { +#if defined(_MSC_VER) && (_MSC_VER < 1900) + pair() : month_day_(date::jan / 1), weekday_(0U) {} + + pair(const date::month_day& month_day, const date::weekday& weekday) + : month_day_(month_day), weekday_(weekday) {} +#endif + + date::month_day month_day_; + date::weekday weekday_; + }; + + enum Type {month_day, month_last_dow, lteq, gteq}; + + Type type_{month_day}; + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) + union U +#else + struct U +#endif + { + date::month_day month_day_; + date::month_weekday_last month_weekday_last_; + pair month_day_weekday_; + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) + U() : month_day_{date::jan/1} {} +#else + U() : + month_day_(date::jan/1), + month_weekday_last_(date::month(0U), date::weekday_last(date::weekday(0U))) + {} + +#endif // !defined(_MSC_VER) || (_MSC_VER >= 1900) + + U& operator=(const date::month_day& x); + U& operator=(const date::month_weekday_last& x); + U& operator=(const pair& x); + } u; + + std::chrono::hours h_{0}; + std::chrono::minutes m_{0}; + std::chrono::seconds s_{0}; + tz zone_{tz::local}; + +public: + MonthDayTime() = default; + MonthDayTime(local_seconds tp, tz timezone); + MonthDayTime(const date::month_day& md, tz timezone); + + date::day day() const; + date::month month() const; + tz zone() const {return zone_;} + + void canonicalize(date::year y); + + sys_seconds + to_sys(date::year y, std::chrono::seconds offset, std::chrono::seconds save) const; + sys_days to_sys_days(date::year y) const; + + sys_seconds to_time_point(date::year y) const; + int compare(date::year y, const MonthDayTime& x, date::year yx, + std::chrono::seconds offset, std::chrono::minutes prev_save) const; + + friend std::istream& operator>>(std::istream& is, MonthDayTime& x); + friend std::ostream& operator<<(std::ostream& os, const MonthDayTime& x); +}; + +// A Rule specifies one or more set of datetimes without using an offset. +// Multiple dates are specified with multiple years. The years in effect +// go from starting_year_ to ending_year_, inclusive. starting_year_ <= +// ending_year_. save_ is in effect for times from the specified time +// onward, including the specified time. When the specified time is +// local, it uses the save_ from the chronologically previous Rule, or if +// there is none, 0. + +//forward declare to avoid warnings in gcc 6.2 +class Rule; +bool operator==(const Rule& x, const Rule& y); +bool operator<(const Rule& x, const Rule& y); +bool operator==(const Rule& x, const date::year& y); +bool operator<(const Rule& x, const date::year& y); +bool operator==(const date::year& x, const Rule& y); +bool operator<(const date::year& x, const Rule& y); +bool operator==(const Rule& x, const std::string& y); +bool operator<(const Rule& x, const std::string& y); +bool operator==(const std::string& x, const Rule& y); +bool operator<(const std::string& x, const Rule& y); +std::ostream& operator<<(std::ostream& os, const Rule& r); + +class Rule +{ +private: + std::string name_; + date::year starting_year_{0}; + date::year ending_year_{0}; + MonthDayTime starting_at_; + std::chrono::minutes save_{0}; + std::string abbrev_; + +public: + Rule() = default; + explicit Rule(const std::string& s); + Rule(const Rule& r, date::year starting_year, date::year ending_year); + + const std::string& name() const {return name_;} + const std::string& abbrev() const {return abbrev_;} + + const MonthDayTime& mdt() const {return starting_at_;} + const date::year& starting_year() const {return starting_year_;} + const date::year& ending_year() const {return ending_year_;} + const std::chrono::minutes& save() const {return save_;} + + static void split_overlaps(std::vector& rules); + + friend bool operator==(const Rule& x, const Rule& y); + friend bool operator<(const Rule& x, const Rule& y); + friend bool operator==(const Rule& x, const date::year& y); + friend bool operator<(const Rule& x, const date::year& y); + friend bool operator==(const date::year& x, const Rule& y); + friend bool operator<(const date::year& x, const Rule& y); + friend bool operator==(const Rule& x, const std::string& y); + friend bool operator<(const Rule& x, const std::string& y); + friend bool operator==(const std::string& x, const Rule& y); + friend bool operator<(const std::string& x, const Rule& y); + + friend std::ostream& operator<<(std::ostream& os, const Rule& r); + +private: + date::day day() const; + date::month month() const; + static void split_overlaps(std::vector& rules, std::size_t i, std::size_t& e); + static bool overlaps(const Rule& x, const Rule& y); + static void split(std::vector& rules, std::size_t i, std::size_t k, + std::size_t& e); +}; + +inline bool operator!=(const Rule& x, const Rule& y) {return !(x == y);} +inline bool operator> (const Rule& x, const Rule& y) {return y < x;} +inline bool operator<=(const Rule& x, const Rule& y) {return !(y < x);} +inline bool operator>=(const Rule& x, const Rule& y) {return !(x < y);} + +inline bool operator!=(const Rule& x, const date::year& y) {return !(x == y);} +inline bool operator> (const Rule& x, const date::year& y) {return y < x;} +inline bool operator<=(const Rule& x, const date::year& y) {return !(y < x);} +inline bool operator>=(const Rule& x, const date::year& y) {return !(x < y);} + +inline bool operator!=(const date::year& x, const Rule& y) {return !(x == y);} +inline bool operator> (const date::year& x, const Rule& y) {return y < x;} +inline bool operator<=(const date::year& x, const Rule& y) {return !(y < x);} +inline bool operator>=(const date::year& x, const Rule& y) {return !(x < y);} + +inline bool operator!=(const Rule& x, const std::string& y) {return !(x == y);} +inline bool operator> (const Rule& x, const std::string& y) {return y < x;} +inline bool operator<=(const Rule& x, const std::string& y) {return !(y < x);} +inline bool operator>=(const Rule& x, const std::string& y) {return !(x < y);} + +inline bool operator!=(const std::string& x, const Rule& y) {return !(x == y);} +inline bool operator> (const std::string& x, const Rule& y) {return y < x;} +inline bool operator<=(const std::string& x, const Rule& y) {return !(y < x);} +inline bool operator>=(const std::string& x, const Rule& y) {return !(x < y);} + +struct zonelet +{ + enum tag {has_rule, has_save, is_empty}; + + std::chrono::seconds gmtoff_; + tag tag_ = has_rule; + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) + union U +#else + struct U +#endif + { + std::string rule_; + std::chrono::minutes save_; + + ~U() {} + U() {} + U(const U&) {} + U& operator=(const U&) = delete; + } u; + + std::string format_; + date::year until_year_{0}; + MonthDayTime until_date_; + sys_seconds until_utc_; + local_seconds until_std_; + local_seconds until_loc_; + std::chrono::minutes initial_save_{0}; + std::string initial_abbrev_; + std::pair first_rule_{nullptr, date::year::min()}; + std::pair last_rule_{nullptr, date::year::max()}; + + ~zonelet(); + zonelet(); + zonelet(const zonelet& i); + zonelet& operator=(const zonelet&) = delete; +}; + +#else // USE_OS_TZDB + +struct ttinfo +{ + std::int32_t tt_gmtoff; + unsigned char tt_isdst; + unsigned char tt_abbrind; + unsigned char pad[2]; +}; + +static_assert(sizeof(ttinfo) == 8, ""); + +struct expanded_ttinfo +{ + std::chrono::seconds offset; + std::string abbrev; + bool is_dst; +}; + +struct transition +{ + sys_seconds timepoint; + const expanded_ttinfo* info; + + transition(sys_seconds tp, const expanded_ttinfo* i = nullptr) + : timepoint(tp) + , info(i) + {} + + friend + std::ostream& + operator<<(std::ostream& os, const transition& t) + { + date::operator<<(os, t.timepoint) << "Z "; + if (t.info->offset >= std::chrono::seconds{0}) + os << '+'; + os << make_time(t.info->offset); + if (t.info->is_dst > 0) + os << " daylight "; + else + os << " standard "; + os << t.info->abbrev; + return os; + } +}; + +#endif // USE_OS_TZDB + +} // namespace detail + +} // namespace date + +#if defined(_MSC_VER) && (_MSC_VER < 1900) +#include "tz.h" +#endif + +#endif // TZ_PRIVATE_H diff --git a/vendor/tl/expected.hpp b/vendor/tl/expected.hpp new file mode 100644 index 000000000..79b541677 --- /dev/null +++ b/vendor/tl/expected.hpp @@ -0,0 +1,2475 @@ +/// +// expected - An implementation of std::expected with extensions +// Written in 2017 by Sy Brand (tartanllama@gmail.com, @TartanLlama) +// +// Documentation available at http://tl.tartanllama.xyz/ +// +// To the extent possible under law, the author(s) have dedicated all +// copyright and related and neighboring rights to this software to the +// public domain worldwide. This software is distributed without any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication +// along with this software. If not, see +// . +/// + +#ifndef TL_EXPECTED_HPP +#define TL_EXPECTED_HPP + +#define TL_EXPECTED_VERSION_MAJOR 1 +#define TL_EXPECTED_VERSION_MINOR 3 +#define TL_EXPECTED_VERSION_PATCH 1 + +#include +#include +#include +#include + +#if defined(__EXCEPTIONS) || defined(_CPPUNWIND) +#define TL_EXPECTED_EXCEPTIONS_ENABLED +#endif + +#if (defined(_MSC_VER) && _MSC_VER == 1900) +#define TL_EXPECTED_MSVC2015 +#define TL_EXPECTED_MSVC2015_CONSTEXPR +#else +#define TL_EXPECTED_MSVC2015_CONSTEXPR constexpr +#endif + +#if (defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ <= 9 && \ + !defined(__clang__)) +#define TL_EXPECTED_GCC49 +#endif + +#if (defined(__GNUC__) && __GNUC__ == 5 && __GNUC_MINOR__ <= 4 && \ + !defined(__clang__)) +#define TL_EXPECTED_GCC54 +#endif + +#if (defined(__GNUC__) && __GNUC__ == 5 && __GNUC_MINOR__ <= 5 && \ + !defined(__clang__)) +#define TL_EXPECTED_GCC55 +#endif + +#ifdef _MSVC_LANG +#define TL_CPLUSPLUS _MSVC_LANG +#else +#define TL_CPLUSPLUS __cplusplus +#endif + +#if !defined(TL_ASSERT) +//can't have assert in constexpr in C++11 and GCC 4.9 has a compiler bug +#if (TL_CPLUSPLUS > 201103L) && !defined(TL_EXPECTED_GCC49) +#include +#define TL_ASSERT(x) assert(x) +#else +#define TL_ASSERT(x) +#endif +#endif + +#if (defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ <= 9 && \ + !defined(__clang__)) +// GCC < 5 doesn't support overloading on const&& for member functions + +#define TL_EXPECTED_NO_CONSTRR +// GCC < 5 doesn't support some standard C++11 type traits +#define TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T) \ + std::has_trivial_copy_constructor +#define TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(T) \ + std::has_trivial_copy_assign + +// This one will be different for GCC 5.7 if it's ever supported +#define TL_EXPECTED_IS_TRIVIALLY_DESTRUCTIBLE(T) \ + std::is_trivially_destructible + +// GCC 5 < v < 8 has a bug in is_trivially_copy_constructible which breaks +// std::vector for non-copyable types +#elif (defined(__GNUC__) && __GNUC__ < 8 && !defined(__clang__)) +#ifndef TL_GCC_LESS_8_TRIVIALLY_COPY_CONSTRUCTIBLE_MUTEX +#define TL_GCC_LESS_8_TRIVIALLY_COPY_CONSTRUCTIBLE_MUTEX +namespace tl { +namespace detail { +template +struct is_trivially_copy_constructible + : std::is_trivially_copy_constructible {}; +#ifdef _GLIBCXX_VECTOR +template +struct is_trivially_copy_constructible> : std::false_type {}; +#endif +} // namespace detail +} // namespace tl +#endif + +#define TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T) \ + tl::detail::is_trivially_copy_constructible +#define TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(T) \ + std::is_trivially_copy_assignable +#define TL_EXPECTED_IS_TRIVIALLY_DESTRUCTIBLE(T) \ + std::is_trivially_destructible +#else +#define TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(T) \ + std::is_trivially_copy_constructible +#define TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(T) \ + std::is_trivially_copy_assignable +#define TL_EXPECTED_IS_TRIVIALLY_DESTRUCTIBLE(T) \ + std::is_trivially_destructible +#endif + +#if TL_CPLUSPLUS > 201103L +#define TL_EXPECTED_CXX14 +#endif + +#ifdef TL_EXPECTED_GCC49 +#define TL_EXPECTED_GCC49_CONSTEXPR +#else +#define TL_EXPECTED_GCC49_CONSTEXPR constexpr +#endif + +#if (TL_CPLUSPLUS == 201103L || defined(TL_EXPECTED_MSVC2015) || \ + defined(TL_EXPECTED_GCC49)) +#define TL_EXPECTED_11_CONSTEXPR +#else +#define TL_EXPECTED_11_CONSTEXPR constexpr +#endif + +#if TL_CPLUSPLUS >= 201703L +#define TL_EXPECTED_NODISCARD [[nodiscard]] +#else +#define TL_EXPECTED_NODISCARD +#endif + +namespace tl { +template class TL_EXPECTED_NODISCARD expected; + +#ifndef TL_MONOSTATE_INPLACE_MUTEX +#define TL_MONOSTATE_INPLACE_MUTEX +class monostate {}; + +struct in_place_t { + explicit in_place_t() = default; +}; +static constexpr in_place_t in_place{}; +#endif + +template class unexpected { +public: + static_assert(!std::is_same::value, "E must not be void"); + + unexpected() = delete; + constexpr explicit unexpected(const E &e) : m_val(e) {} + + constexpr explicit unexpected(E &&e) : m_val(std::move(e)) {} + + template ::value>::type * = nullptr> + constexpr explicit unexpected(Args &&...args) + : m_val(std::forward(args)...) {} + template < + class U, class... Args, + typename std::enable_if &, Args &&...>::value>::type * = nullptr> + constexpr explicit unexpected(std::initializer_list l, Args &&...args) + : m_val(l, std::forward(args)...) {} + + constexpr const E &value() const & { return m_val; } + TL_EXPECTED_11_CONSTEXPR E &value() & { return m_val; } + TL_EXPECTED_11_CONSTEXPR E &&value() && { return std::move(m_val); } + constexpr const E &&value() const && { return std::move(m_val); } + +private: + E m_val; +}; + +#ifdef __cpp_deduction_guides +template unexpected(E) -> unexpected; +#endif + +template +constexpr bool operator==(const unexpected &lhs, const unexpected &rhs) { + return lhs.value() == rhs.value(); +} +template +constexpr bool operator!=(const unexpected &lhs, const unexpected &rhs) { + return lhs.value() != rhs.value(); +} +template +constexpr bool operator<(const unexpected &lhs, const unexpected &rhs) { + return lhs.value() < rhs.value(); +} +template +constexpr bool operator<=(const unexpected &lhs, const unexpected &rhs) { + return lhs.value() <= rhs.value(); +} +template +constexpr bool operator>(const unexpected &lhs, const unexpected &rhs) { + return lhs.value() > rhs.value(); +} +template +constexpr bool operator>=(const unexpected &lhs, const unexpected &rhs) { + return lhs.value() >= rhs.value(); +} + +template +unexpected::type> make_unexpected(E &&e) { + return unexpected::type>(std::forward(e)); +} + +struct unexpect_t { + unexpect_t() = default; +}; +static constexpr unexpect_t unexpect{}; + +#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED +#define TL_EXPECTED_THROW_EXCEPTION(e) throw((e)); +#else +#define TL_EXPECTED_THROW_EXCEPTION(e) std::terminate(); +#endif + +namespace detail { +#ifndef TL_TRAITS_MUTEX +#define TL_TRAITS_MUTEX +// C++14-style aliases for brevity +template using remove_const_t = typename std::remove_const::type; +template +using remove_reference_t = typename std::remove_reference::type; +template using decay_t = typename std::decay::type; +template +using enable_if_t = typename std::enable_if::type; +template +using conditional_t = typename std::conditional::type; + +// std::conjunction from C++17 +template struct conjunction : std::true_type {}; +template struct conjunction : B {}; +template +struct conjunction + : std::conditional, B>::type {}; + +#if defined(_LIBCPP_VERSION) && __cplusplus == 201103L +#define TL_TRAITS_LIBCXX_MEM_FN_WORKAROUND +#endif + +// In C++11 mode, there's an issue in libc++'s std::mem_fn +// which results in a hard-error when using it in a noexcept expression +// in some cases. This is a check to workaround the common failing case. +#ifdef TL_TRAITS_LIBCXX_MEM_FN_WORKAROUND +template +struct is_pointer_to_non_const_member_func : std::false_type {}; +template +struct is_pointer_to_non_const_member_func + : std::true_type {}; +template +struct is_pointer_to_non_const_member_func + : std::true_type {}; +template +struct is_pointer_to_non_const_member_func + : std::true_type {}; +template +struct is_pointer_to_non_const_member_func + : std::true_type {}; +template +struct is_pointer_to_non_const_member_func + : std::true_type {}; +template +struct is_pointer_to_non_const_member_func + : std::true_type {}; + +template struct is_const_or_const_ref : std::false_type {}; +template struct is_const_or_const_ref : std::true_type {}; +template struct is_const_or_const_ref : std::true_type {}; +#endif + +// std::invoke from C++17 +// https://stackoverflow.com/questions/38288042/c11-14-invoke-workaround +template < + typename Fn, typename... Args, +#ifdef TL_TRAITS_LIBCXX_MEM_FN_WORKAROUND + typename = enable_if_t::value && + is_const_or_const_ref::value)>, +#endif + typename = enable_if_t>::value>, int = 0> +constexpr auto invoke(Fn &&f, Args &&...args) noexcept( + noexcept(std::mem_fn(f)(std::forward(args)...))) + -> decltype(std::mem_fn(f)(std::forward(args)...)) { + return std::mem_fn(f)(std::forward(args)...); +} + +template >::value>> +constexpr auto invoke(Fn &&f, Args &&...args) noexcept( + noexcept(std::forward(f)(std::forward(args)...))) + -> decltype(std::forward(f)(std::forward(args)...)) { + return std::forward(f)(std::forward(args)...); +} + +// std::invoke_result from C++17 +template struct invoke_result_impl; + +template +struct invoke_result_impl< + F, + decltype(detail::invoke(std::declval(), std::declval()...), void()), + Us...> { + using type = + decltype(detail::invoke(std::declval(), std::declval()...)); +}; + +template +using invoke_result = invoke_result_impl; + +template +using invoke_result_t = typename invoke_result::type; + +#if defined(_MSC_VER) && _MSC_VER <= 1900 +// TODO make a version which works with MSVC 2015 +template struct is_swappable : std::true_type {}; + +template struct is_nothrow_swappable : std::true_type {}; +#else +// https://stackoverflow.com/questions/26744589/what-is-a-proper-way-to-implement-is-swappable-to-test-for-the-swappable-concept +namespace swap_adl_tests { +// if swap ADL finds this then it would call std::swap otherwise (same +// signature) +struct tag {}; + +template tag swap(T &, T &); +template tag swap(T (&a)[N], T (&b)[N]); + +// helper functions to test if an unqualified swap is possible, and if it +// becomes std::swap +template std::false_type can_swap(...) noexcept(false); +template (), std::declval()))> +std::true_type can_swap(int) noexcept(noexcept(swap(std::declval(), + std::declval()))); + +template std::false_type uses_std(...); +template +std::is_same(), std::declval())), tag> +uses_std(int); + +template +struct is_std_swap_noexcept + : std::integral_constant::value && + std::is_nothrow_move_assignable::value> {}; + +template +struct is_std_swap_noexcept : is_std_swap_noexcept {}; + +template +struct is_adl_swap_noexcept + : std::integral_constant(0))> {}; +} // namespace swap_adl_tests + +template +struct is_swappable + : std::integral_constant< + bool, + decltype(detail::swap_adl_tests::can_swap(0))::value && + (!decltype(detail::swap_adl_tests::uses_std(0))::value || + (std::is_move_assignable::value && + std::is_move_constructible::value))> {}; + +template +struct is_swappable + : std::integral_constant< + bool, + decltype(detail::swap_adl_tests::can_swap(0))::value && + (!decltype(detail::swap_adl_tests::uses_std( + 0))::value || + is_swappable::value)> {}; + +template +struct is_nothrow_swappable + : std::integral_constant< + bool, + is_swappable::value && + ((decltype(detail::swap_adl_tests::uses_std(0))::value && + detail::swap_adl_tests::is_std_swap_noexcept::value) || + (!decltype(detail::swap_adl_tests::uses_std(0))::value && + detail::swap_adl_tests::is_adl_swap_noexcept::value))> {}; +#endif +#endif + +// Trait for checking if a type is a tl::expected +template struct is_expected_impl : std::false_type {}; +template +struct is_expected_impl> : std::true_type {}; +template using is_expected = is_expected_impl>; + +template +using expected_enable_forward_value = detail::enable_if_t< + std::is_constructible::value && + !std::is_same, in_place_t>::value && + !std::is_same, detail::decay_t>::value && + !std::is_same, detail::decay_t>::value>; + +template +using expected_enable_from_other = detail::enable_if_t< + std::is_constructible::value && + std::is_constructible::value && + !std::is_constructible &>::value && + !std::is_constructible &&>::value && + !std::is_constructible &>::value && + !std::is_constructible &&>::value && + !std::is_convertible &, T>::value && + !std::is_convertible &&, T>::value && + !std::is_convertible &, T>::value && + !std::is_convertible &&, T>::value>; + +template +using is_void_or = conditional_t::value, std::true_type, U>; + +template +using is_copy_constructible_or_void = + is_void_or>; + +template +using is_move_constructible_or_void = + is_void_or>; + +template +using is_copy_assignable_or_void = is_void_or>; + +template +using is_move_assignable_or_void = is_void_or>; + +} // namespace detail + +namespace detail { +struct no_init_t {}; +static constexpr no_init_t no_init{}; + +// Implements the storage of the values, and ensures that the destructor is +// trivial if it can be. +// +// This specialization is for where neither `T` or `E` is trivially +// destructible, so the destructors must be called on destruction of the +// `expected` +template ::value, + bool = std::is_trivially_destructible::value> +struct expected_storage_base { + constexpr expected_storage_base() : m_val(T{}), m_has_val(true) {} + constexpr expected_storage_base(no_init_t) : m_no_init(), m_has_val(false) {} + + template ::value> * = + nullptr> + constexpr expected_storage_base(in_place_t, Args &&...args) + : m_val(std::forward(args)...), m_has_val(true) {} + + template &, Args &&...>::value> * = nullptr> + constexpr expected_storage_base(in_place_t, std::initializer_list il, + Args &&...args) + : m_val(il, std::forward(args)...), m_has_val(true) {} + template ::value> * = + nullptr> + constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + : m_unexpect(std::forward(args)...), m_has_val(false) {} + + template &, Args &&...>::value> * = nullptr> + constexpr explicit expected_storage_base(unexpect_t, + std::initializer_list il, + Args &&...args) + : m_unexpect(il, std::forward(args)...), m_has_val(false) {} + + ~expected_storage_base() { + if (m_has_val) { + m_val.~T(); + } else { + m_unexpect.~unexpected(); + } + } + union { + T m_val; + unexpected m_unexpect; + char m_no_init; + }; + bool m_has_val; +}; + +// This specialization is for when both `T` and `E` are trivially-destructible, +// so the destructor of the `expected` can be trivial. +template struct expected_storage_base { + constexpr expected_storage_base() : m_val(T{}), m_has_val(true) {} + constexpr expected_storage_base(no_init_t) : m_no_init(), m_has_val(false) {} + + template ::value> * = + nullptr> + constexpr expected_storage_base(in_place_t, Args &&...args) + : m_val(std::forward(args)...), m_has_val(true) {} + + template &, Args &&...>::value> * = nullptr> + constexpr expected_storage_base(in_place_t, std::initializer_list il, + Args &&...args) + : m_val(il, std::forward(args)...), m_has_val(true) {} + template ::value> * = + nullptr> + constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + : m_unexpect(std::forward(args)...), m_has_val(false) {} + + template &, Args &&...>::value> * = nullptr> + constexpr explicit expected_storage_base(unexpect_t, + std::initializer_list il, + Args &&...args) + : m_unexpect(il, std::forward(args)...), m_has_val(false) {} + + expected_storage_base(const expected_storage_base &) = default; + expected_storage_base(expected_storage_base &&) = default; + expected_storage_base &operator=(const expected_storage_base &) = default; + expected_storage_base &operator=(expected_storage_base &&) = default; + ~expected_storage_base() = default; + union { + T m_val; + unexpected m_unexpect; + char m_no_init; + }; + bool m_has_val; +}; + +// T is trivial, E is not. +template struct expected_storage_base { + constexpr expected_storage_base() : m_val(T{}), m_has_val(true) {} + TL_EXPECTED_MSVC2015_CONSTEXPR expected_storage_base(no_init_t) + : m_no_init(), m_has_val(false) {} + + template ::value> * = + nullptr> + constexpr expected_storage_base(in_place_t, Args &&...args) + : m_val(std::forward(args)...), m_has_val(true) {} + + template &, Args &&...>::value> * = nullptr> + constexpr expected_storage_base(in_place_t, std::initializer_list il, + Args &&...args) + : m_val(il, std::forward(args)...), m_has_val(true) {} + template ::value> * = + nullptr> + constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + : m_unexpect(std::forward(args)...), m_has_val(false) {} + + template &, Args &&...>::value> * = nullptr> + constexpr explicit expected_storage_base(unexpect_t, + std::initializer_list il, + Args &&...args) + : m_unexpect(il, std::forward(args)...), m_has_val(false) {} + + expected_storage_base(const expected_storage_base &) = default; + expected_storage_base(expected_storage_base &&) = default; + expected_storage_base &operator=(const expected_storage_base &) = default; + expected_storage_base &operator=(expected_storage_base &&) = default; + ~expected_storage_base() { + if (!m_has_val) { + m_unexpect.~unexpected(); + } + } + + union { + T m_val; + unexpected m_unexpect; + char m_no_init; + }; + bool m_has_val; +}; + +// E is trivial, T is not. +template struct expected_storage_base { + constexpr expected_storage_base() : m_val(T{}), m_has_val(true) {} + constexpr expected_storage_base(no_init_t) : m_no_init(), m_has_val(false) {} + + template ::value> * = + nullptr> + constexpr expected_storage_base(in_place_t, Args &&...args) + : m_val(std::forward(args)...), m_has_val(true) {} + + template &, Args &&...>::value> * = nullptr> + constexpr expected_storage_base(in_place_t, std::initializer_list il, + Args &&...args) + : m_val(il, std::forward(args)...), m_has_val(true) {} + template ::value> * = + nullptr> + constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + : m_unexpect(std::forward(args)...), m_has_val(false) {} + + template &, Args &&...>::value> * = nullptr> + constexpr explicit expected_storage_base(unexpect_t, + std::initializer_list il, + Args &&...args) + : m_unexpect(il, std::forward(args)...), m_has_val(false) {} + + expected_storage_base(const expected_storage_base &) = default; + expected_storage_base(expected_storage_base &&) = default; + expected_storage_base &operator=(const expected_storage_base &) = default; + expected_storage_base &operator=(expected_storage_base &&) = default; + ~expected_storage_base() { + if (m_has_val) { + m_val.~T(); + } + } + union { + T m_val; + unexpected m_unexpect; + char m_no_init; + }; + bool m_has_val; +}; + +// `T` is `void`, `E` is trivially-destructible +template struct expected_storage_base { + #if __GNUC__ <= 5 + //no constexpr for GCC 4/5 bug + #else + TL_EXPECTED_MSVC2015_CONSTEXPR + #endif + expected_storage_base() : m_has_val(true) {} + + constexpr expected_storage_base(no_init_t) : m_val(), m_has_val(false) {} + + constexpr expected_storage_base(in_place_t) : m_has_val(true) {} + + template ::value> * = + nullptr> + constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + : m_unexpect(std::forward(args)...), m_has_val(false) {} + + template &, Args &&...>::value> * = nullptr> + constexpr explicit expected_storage_base(unexpect_t, + std::initializer_list il, + Args &&...args) + : m_unexpect(il, std::forward(args)...), m_has_val(false) {} + + expected_storage_base(const expected_storage_base &) = default; + expected_storage_base(expected_storage_base &&) = default; + expected_storage_base &operator=(const expected_storage_base &) = default; + expected_storage_base &operator=(expected_storage_base &&) = default; + ~expected_storage_base() = default; + struct dummy {}; + union { + unexpected m_unexpect; + dummy m_val; + }; + bool m_has_val; +}; + +// `T` is `void`, `E` is not trivially-destructible +template struct expected_storage_base { + constexpr expected_storage_base() : m_dummy(), m_has_val(true) {} + constexpr expected_storage_base(no_init_t) : m_dummy(), m_has_val(false) {} + + constexpr expected_storage_base(in_place_t) : m_dummy(), m_has_val(true) {} + + template ::value> * = + nullptr> + constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + : m_unexpect(std::forward(args)...), m_has_val(false) {} + + template &, Args &&...>::value> * = nullptr> + constexpr explicit expected_storage_base(unexpect_t, + std::initializer_list il, + Args &&...args) + : m_unexpect(il, std::forward(args)...), m_has_val(false) {} + + expected_storage_base(const expected_storage_base &) = default; + expected_storage_base(expected_storage_base &&) = default; + expected_storage_base &operator=(const expected_storage_base &) = default; + expected_storage_base &operator=(expected_storage_base &&) = default; + ~expected_storage_base() { + if (!m_has_val) { + m_unexpect.~unexpected(); + } + } + + union { + unexpected m_unexpect; + char m_dummy; + }; + bool m_has_val; +}; + +// This base class provides some handy member functions which can be used in +// further derived classes +template +struct expected_operations_base : expected_storage_base { + using expected_storage_base::expected_storage_base; + + template void construct(Args &&...args) noexcept { + new (std::addressof(this->m_val)) T(std::forward(args)...); + this->m_has_val = true; + } + + template void construct_with(Rhs &&rhs) noexcept { + new (std::addressof(this->m_val)) T(std::forward(rhs).get()); + this->m_has_val = true; + } + + template void construct_error(Args &&...args) noexcept { + new (std::addressof(this->m_unexpect)) + unexpected(std::forward(args)...); + this->m_has_val = false; + } + +#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED + + // These assign overloads ensure that the most efficient assignment + // implementation is used while maintaining the strong exception guarantee. + // The problematic case is where rhs has a value, but *this does not. + // + // This overload handles the case where we can just copy-construct `T` + // directly into place without throwing. + template ::value> + * = nullptr> + void assign(const expected_operations_base &rhs) noexcept { + if (!this->m_has_val && rhs.m_has_val) { + geterr().~unexpected(); + construct(rhs.get()); + } else { + assign_common(rhs); + } + } + + // This overload handles the case where we can attempt to create a copy of + // `T`, then no-throw move it into place if the copy was successful. + template ::value && + std::is_nothrow_move_constructible::value> + * = nullptr> + void assign(const expected_operations_base &rhs) noexcept { + if (!this->m_has_val && rhs.m_has_val) { + T tmp = rhs.get(); + geterr().~unexpected(); + construct(std::move(tmp)); + } else { + assign_common(rhs); + } + } + + // This overload is the worst-case, where we have to move-construct the + // unexpected value into temporary storage, then try to copy the T into place. + // If the construction succeeds, then everything is fine, but if it throws, + // then we move the old unexpected value back into place before rethrowing the + // exception. + template ::value && + !std::is_nothrow_move_constructible::value> + * = nullptr> + void assign(const expected_operations_base &rhs) { + if (!this->m_has_val && rhs.m_has_val) { + auto tmp = std::move(geterr()); + geterr().~unexpected(); + +#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED + try { + construct(rhs.get()); + } catch (...) { + geterr() = std::move(tmp); + throw; + } +#else + construct(rhs.get()); +#endif + } else { + assign_common(rhs); + } + } + + // These overloads do the same as above, but for rvalues + template ::value> + * = nullptr> + void assign(expected_operations_base &&rhs) noexcept { + if (!this->m_has_val && rhs.m_has_val) { + geterr().~unexpected(); + construct(std::move(rhs).get()); + } else { + assign_common(std::move(rhs)); + } + } + + template ::value> + * = nullptr> + void assign(expected_operations_base &&rhs) { + if (!this->m_has_val && rhs.m_has_val) { + auto tmp = std::move(geterr()); + geterr().~unexpected(); +#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED + try { + construct(std::move(rhs).get()); + } catch (...) { + geterr() = std::move(tmp); + throw; + } +#else + construct(std::move(rhs).get()); +#endif + } else { + assign_common(std::move(rhs)); + } + } + +#else + + // If exceptions are disabled then we can just copy-construct + void assign(const expected_operations_base &rhs) noexcept { + if (!this->m_has_val && rhs.m_has_val) { + geterr().~unexpected(); + construct(rhs.get()); + } else { + assign_common(rhs); + } + } + + void assign(expected_operations_base &&rhs) noexcept { + if (!this->m_has_val && rhs.m_has_val) { + geterr().~unexpected(); + construct(std::move(rhs).get()); + } else { + assign_common(std::move(rhs)); + } + } + +#endif + + // The common part of move/copy assigning + template void assign_common(Rhs &&rhs) { + if (this->m_has_val) { + if (rhs.m_has_val) { + get() = std::forward(rhs).get(); + } else { + destroy_val(); + construct_error(std::forward(rhs).geterr()); + } + } else { + if (!rhs.m_has_val) { + geterr() = std::forward(rhs).geterr(); + } + } + } + + bool has_value() const { return this->m_has_val; } + + TL_EXPECTED_11_CONSTEXPR T &get() & { return this->m_val; } + constexpr const T &get() const & { return this->m_val; } + TL_EXPECTED_11_CONSTEXPR T &&get() && { return std::move(this->m_val); } +#ifndef TL_EXPECTED_NO_CONSTRR + constexpr const T &&get() const && { return std::move(this->m_val); } +#endif + + TL_EXPECTED_11_CONSTEXPR unexpected &geterr() & { + return this->m_unexpect; + } + constexpr const unexpected &geterr() const & { return this->m_unexpect; } + TL_EXPECTED_11_CONSTEXPR unexpected &&geterr() && { + return std::move(this->m_unexpect); + } +#ifndef TL_EXPECTED_NO_CONSTRR + constexpr const unexpected &&geterr() const && { + return std::move(this->m_unexpect); + } +#endif + + TL_EXPECTED_11_CONSTEXPR void destroy_val() { get().~T(); } +}; + +// This base class provides some handy member functions which can be used in +// further derived classes +template +struct expected_operations_base : expected_storage_base { + using expected_storage_base::expected_storage_base; + + template void construct() noexcept { this->m_has_val = true; } + + // This function doesn't use its argument, but needs it so that code in + // levels above this can work independently of whether T is void + template void construct_with(Rhs &&) noexcept { + this->m_has_val = true; + } + + template void construct_error(Args &&...args) noexcept { + new (std::addressof(this->m_unexpect)) + unexpected(std::forward(args)...); + this->m_has_val = false; + } + + template void assign(Rhs &&rhs) noexcept { + if (!this->m_has_val) { + if (rhs.m_has_val) { + geterr().~unexpected(); + construct(); + } else { + geterr() = std::forward(rhs).geterr(); + } + } else { + if (!rhs.m_has_val) { + construct_error(std::forward(rhs).geterr()); + } + } + } + + bool has_value() const { return this->m_has_val; } + + TL_EXPECTED_11_CONSTEXPR unexpected &geterr() & { + return this->m_unexpect; + } + constexpr const unexpected &geterr() const & { return this->m_unexpect; } + TL_EXPECTED_11_CONSTEXPR unexpected &&geterr() && { + return std::move(this->m_unexpect); + } +#ifndef TL_EXPECTED_NO_CONSTRR + constexpr const unexpected &&geterr() const && { + return std::move(this->m_unexpect); + } +#endif + + TL_EXPECTED_11_CONSTEXPR void destroy_val() { + // no-op + } +}; + +// This class manages conditionally having a trivial copy constructor +// This specialization is for when T and E are trivially copy constructible +template :: + value &&TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(E)::value, + bool = (is_copy_constructible_or_void::value && + std::is_copy_constructible::value)> +struct expected_copy_base : expected_operations_base { + using expected_operations_base::expected_operations_base; +}; + +// This specialization is for when T or E are non-trivially copy constructible +template +struct expected_copy_base : expected_operations_base { + using expected_operations_base::expected_operations_base; + + expected_copy_base() = default; + expected_copy_base(const expected_copy_base &rhs) + : expected_operations_base(no_init) { + if (rhs.has_value()) { + this->construct_with(rhs); + } else { + this->construct_error(rhs.geterr()); + } + } + + expected_copy_base(expected_copy_base &&rhs) = default; + expected_copy_base &operator=(const expected_copy_base &rhs) = default; + expected_copy_base &operator=(expected_copy_base &&rhs) = default; +}; + +// This class manages conditionally having a trivial move constructor +// Unfortunately there's no way to achieve this in GCC < 5 AFAIK, since it +// doesn't implement an analogue to std::is_trivially_move_constructible. We +// have to make do with a non-trivial move constructor even if T is trivially +// move constructible +#ifndef TL_EXPECTED_GCC49 +template >::value + &&std::is_trivially_move_constructible::value> +struct expected_move_base : expected_copy_base { + using expected_copy_base::expected_copy_base; +}; +#else +template struct expected_move_base; +#endif +template +struct expected_move_base : expected_copy_base { + using expected_copy_base::expected_copy_base; + + expected_move_base() = default; + expected_move_base(const expected_move_base &rhs) = default; + + expected_move_base(expected_move_base &&rhs) noexcept( + std::is_nothrow_move_constructible::value) + : expected_copy_base(no_init) { + if (rhs.has_value()) { + this->construct_with(std::move(rhs)); + } else { + this->construct_error(std::move(rhs.geterr())); + } + } + expected_move_base &operator=(const expected_move_base &rhs) = default; + expected_move_base &operator=(expected_move_base &&rhs) = default; +}; + +// This class manages conditionally having a trivial copy assignment operator +template >::value + &&TL_EXPECTED_IS_TRIVIALLY_COPY_ASSIGNABLE(E)::value + &&TL_EXPECTED_IS_TRIVIALLY_COPY_CONSTRUCTIBLE(E)::value + &&TL_EXPECTED_IS_TRIVIALLY_DESTRUCTIBLE(E)::value, + bool = (is_copy_constructible_or_void::value && + std::is_copy_constructible::value && + is_copy_assignable_or_void::value && + std::is_copy_assignable::value)> +struct expected_copy_assign_base : expected_move_base { + using expected_move_base::expected_move_base; +}; + +template +struct expected_copy_assign_base : expected_move_base { + using expected_move_base::expected_move_base; + + expected_copy_assign_base() = default; + expected_copy_assign_base(const expected_copy_assign_base &rhs) = default; + + expected_copy_assign_base(expected_copy_assign_base &&rhs) = default; + expected_copy_assign_base &operator=(const expected_copy_assign_base &rhs) { + this->assign(rhs); + return *this; + } + expected_copy_assign_base & + operator=(expected_copy_assign_base &&rhs) = default; +}; + +// This class manages conditionally having a trivial move assignment operator +// Unfortunately there's no way to achieve this in GCC < 5 AFAIK, since it +// doesn't implement an analogue to std::is_trivially_move_assignable. We have +// to make do with a non-trivial move assignment operator even if T is trivially +// move assignable +#ifndef TL_EXPECTED_GCC49 +template , + std::is_trivially_move_constructible, + std::is_trivially_move_assignable>>:: + value &&std::is_trivially_destructible::value + &&std::is_trivially_move_constructible::value + &&std::is_trivially_move_assignable::value> +struct expected_move_assign_base : expected_copy_assign_base { + using expected_copy_assign_base::expected_copy_assign_base; +}; +#else +template struct expected_move_assign_base; +#endif + +template +struct expected_move_assign_base + : expected_copy_assign_base { + using expected_copy_assign_base::expected_copy_assign_base; + + expected_move_assign_base() = default; + expected_move_assign_base(const expected_move_assign_base &rhs) = default; + + expected_move_assign_base(expected_move_assign_base &&rhs) = default; + + expected_move_assign_base & + operator=(const expected_move_assign_base &rhs) = default; + + expected_move_assign_base & + operator=(expected_move_assign_base &&rhs) noexcept( + std::is_nothrow_move_constructible::value + &&std::is_nothrow_move_assignable::value) { + this->assign(std::move(rhs)); + return *this; + } +}; + +// expected_delete_ctor_base will conditionally delete copy and move +// constructors depending on whether T is copy/move constructible +template ::value && + std::is_copy_constructible::value), + bool EnableMove = (is_move_constructible_or_void::value && + std::is_move_constructible::value)> +struct expected_delete_ctor_base { + expected_delete_ctor_base() = default; + expected_delete_ctor_base(const expected_delete_ctor_base &) = default; + expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept = default; + expected_delete_ctor_base & + operator=(const expected_delete_ctor_base &) = default; + expected_delete_ctor_base & + operator=(expected_delete_ctor_base &&) noexcept = default; +}; + +template +struct expected_delete_ctor_base { + expected_delete_ctor_base() = default; + expected_delete_ctor_base(const expected_delete_ctor_base &) = default; + expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept = delete; + expected_delete_ctor_base & + operator=(const expected_delete_ctor_base &) = default; + expected_delete_ctor_base & + operator=(expected_delete_ctor_base &&) noexcept = default; +}; + +template +struct expected_delete_ctor_base { + expected_delete_ctor_base() = default; + expected_delete_ctor_base(const expected_delete_ctor_base &) = delete; + expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept = default; + expected_delete_ctor_base & + operator=(const expected_delete_ctor_base &) = default; + expected_delete_ctor_base & + operator=(expected_delete_ctor_base &&) noexcept = default; +}; + +template +struct expected_delete_ctor_base { + expected_delete_ctor_base() = default; + expected_delete_ctor_base(const expected_delete_ctor_base &) = delete; + expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept = delete; + expected_delete_ctor_base & + operator=(const expected_delete_ctor_base &) = default; + expected_delete_ctor_base & + operator=(expected_delete_ctor_base &&) noexcept = default; +}; + +// expected_delete_assign_base will conditionally delete copy and move +// constructors depending on whether T and E are copy/move constructible + +// assignable +template ::value && + std::is_copy_constructible::value && + is_copy_assignable_or_void::value && + std::is_copy_assignable::value), + bool EnableMove = (is_move_constructible_or_void::value && + std::is_move_constructible::value && + is_move_assignable_or_void::value && + std::is_move_assignable::value)> +struct expected_delete_assign_base { + expected_delete_assign_base() = default; + expected_delete_assign_base(const expected_delete_assign_base &) = default; + expected_delete_assign_base(expected_delete_assign_base &&) noexcept = + default; + expected_delete_assign_base & + operator=(const expected_delete_assign_base &) = default; + expected_delete_assign_base & + operator=(expected_delete_assign_base &&) noexcept = default; +}; + +template +struct expected_delete_assign_base { + expected_delete_assign_base() = default; + expected_delete_assign_base(const expected_delete_assign_base &) = default; + expected_delete_assign_base(expected_delete_assign_base &&) noexcept = + default; + expected_delete_assign_base & + operator=(const expected_delete_assign_base &) = default; + expected_delete_assign_base & + operator=(expected_delete_assign_base &&) noexcept = delete; +}; + +template +struct expected_delete_assign_base { + expected_delete_assign_base() = default; + expected_delete_assign_base(const expected_delete_assign_base &) = default; + expected_delete_assign_base(expected_delete_assign_base &&) noexcept = + default; + expected_delete_assign_base & + operator=(const expected_delete_assign_base &) = delete; + expected_delete_assign_base & + operator=(expected_delete_assign_base &&) noexcept = default; +}; + +template +struct expected_delete_assign_base { + expected_delete_assign_base() = default; + expected_delete_assign_base(const expected_delete_assign_base &) = default; + expected_delete_assign_base(expected_delete_assign_base &&) noexcept = + default; + expected_delete_assign_base & + operator=(const expected_delete_assign_base &) = delete; + expected_delete_assign_base & + operator=(expected_delete_assign_base &&) noexcept = delete; +}; + +// This is needed to be able to construct the expected_default_ctor_base which +// follows, while still conditionally deleting the default constructor. +struct default_constructor_tag { + explicit constexpr default_constructor_tag() = default; +}; + +// expected_default_ctor_base will ensure that expected has a deleted default +// constructor if T is not default constructible. +// This specialization is for when T is default constructible +template ::value || std::is_void::value> +struct expected_default_ctor_base { + constexpr expected_default_ctor_base() noexcept = default; + constexpr expected_default_ctor_base( + expected_default_ctor_base const &) noexcept = default; + constexpr expected_default_ctor_base(expected_default_ctor_base &&) noexcept = + default; + expected_default_ctor_base & + operator=(expected_default_ctor_base const &) noexcept = default; + expected_default_ctor_base & + operator=(expected_default_ctor_base &&) noexcept = default; + + constexpr explicit expected_default_ctor_base(default_constructor_tag) {} +}; + +// This specialization is for when T is not default constructible +template struct expected_default_ctor_base { + constexpr expected_default_ctor_base() noexcept = delete; + constexpr expected_default_ctor_base( + expected_default_ctor_base const &) noexcept = default; + constexpr expected_default_ctor_base(expected_default_ctor_base &&) noexcept = + default; + expected_default_ctor_base & + operator=(expected_default_ctor_base const &) noexcept = default; + expected_default_ctor_base & + operator=(expected_default_ctor_base &&) noexcept = default; + + constexpr explicit expected_default_ctor_base(default_constructor_tag) {} +}; +} // namespace detail + +template class bad_expected_access : public std::exception { +public: + explicit bad_expected_access(E e) : m_val(std::move(e)) {} + + virtual const char *what() const noexcept override { + return "Bad expected access"; + } + + const E &error() const & { return m_val; } + E &error() & { return m_val; } + const E &&error() const && { return std::move(m_val); } + E &&error() && { return std::move(m_val); } + +private: + E m_val; +}; + +/// An `expected` object is an object that contains the storage for +/// another object and manages the lifetime of this contained object `T`. +/// Alternatively it could contain the storage for another unexpected object +/// `E`. The contained object may not be initialized after the expected object +/// has been initialized, and may not be destroyed before the expected object +/// has been destroyed. The initialization state of the contained object is +/// tracked by the expected object. +template +class TL_EXPECTED_NODISCARD expected : + private detail::expected_move_assign_base, + private detail::expected_delete_ctor_base, + private detail::expected_delete_assign_base, + private detail::expected_default_ctor_base { + static_assert(!std::is_reference::value, "T must not be a reference"); + static_assert(!std::is_same::type>::value, + "T must not be in_place_t"); + static_assert(!std::is_same::type>::value, + "T must not be unexpect_t"); + static_assert( + !std::is_same>::type>::value, + "T must not be unexpected"); + static_assert(!std::is_reference::value, "E must not be a reference"); + + T *valptr() { return std::addressof(this->m_val); } + const T *valptr() const { return std::addressof(this->m_val); } + unexpected *errptr() { return std::addressof(this->m_unexpect); } + const unexpected *errptr() const { + return std::addressof(this->m_unexpect); + } + + template ::value> * = nullptr> + TL_EXPECTED_11_CONSTEXPR U &val() { + return this->m_val; + } + TL_EXPECTED_11_CONSTEXPR unexpected &err() { return this->m_unexpect; } + + template ::value> * = nullptr> + constexpr const U &val() const { + return this->m_val; + } + constexpr const unexpected &err() const { return this->m_unexpect; } + + using impl_base = detail::expected_move_assign_base; + using ctor_base = detail::expected_default_ctor_base; + +public: + typedef T value_type; + typedef E error_type; + typedef unexpected unexpected_type; + +#if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ + !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) + template TL_EXPECTED_11_CONSTEXPR auto and_then(F &&f) & { + return and_then_impl(*this, std::forward(f)); + } + template TL_EXPECTED_11_CONSTEXPR auto and_then(F &&f) && { + return and_then_impl(std::move(*this), std::forward(f)); + } + template constexpr auto and_then(F &&f) const & { + return and_then_impl(*this, std::forward(f)); + } + +#ifndef TL_EXPECTED_NO_CONSTRR + template constexpr auto and_then(F &&f) const && { + return and_then_impl(std::move(*this), std::forward(f)); + } +#endif + +#else + template + TL_EXPECTED_11_CONSTEXPR auto + and_then(F &&f) & -> decltype(and_then_impl(std::declval(), + std::forward(f))) { + return and_then_impl(*this, std::forward(f)); + } + template + TL_EXPECTED_11_CONSTEXPR auto + and_then(F &&f) && -> decltype(and_then_impl(std::declval(), + std::forward(f))) { + return and_then_impl(std::move(*this), std::forward(f)); + } + template + constexpr auto and_then(F &&f) const & -> decltype(and_then_impl( + std::declval(), std::forward(f))) { + return and_then_impl(*this, std::forward(f)); + } + +#ifndef TL_EXPECTED_NO_CONSTRR + template + constexpr auto and_then(F &&f) const && -> decltype(and_then_impl( + std::declval(), std::forward(f))) { + return and_then_impl(std::move(*this), std::forward(f)); + } +#endif +#endif + +#if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ + !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) + template TL_EXPECTED_11_CONSTEXPR auto map(F &&f) & { + return expected_map_impl(*this, std::forward(f)); + } + template TL_EXPECTED_11_CONSTEXPR auto map(F &&f) && { + return expected_map_impl(std::move(*this), std::forward(f)); + } + template constexpr auto map(F &&f) const & { + return expected_map_impl(*this, std::forward(f)); + } + template constexpr auto map(F &&f) const && { + return expected_map_impl(std::move(*this), std::forward(f)); + } +#else + template + TL_EXPECTED_11_CONSTEXPR decltype(expected_map_impl( + std::declval(), std::declval())) + map(F &&f) & { + return expected_map_impl(*this, std::forward(f)); + } + template + TL_EXPECTED_11_CONSTEXPR decltype(expected_map_impl(std::declval(), + std::declval())) + map(F &&f) && { + return expected_map_impl(std::move(*this), std::forward(f)); + } + template + constexpr decltype(expected_map_impl(std::declval(), + std::declval())) + map(F &&f) const & { + return expected_map_impl(*this, std::forward(f)); + } + +#ifndef TL_EXPECTED_NO_CONSTRR + template + constexpr decltype(expected_map_impl(std::declval(), + std::declval())) + map(F &&f) const && { + return expected_map_impl(std::move(*this), std::forward(f)); + } +#endif +#endif + +#if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ + !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) + template TL_EXPECTED_11_CONSTEXPR auto transform(F &&f) & { + return expected_map_impl(*this, std::forward(f)); + } + template TL_EXPECTED_11_CONSTEXPR auto transform(F &&f) && { + return expected_map_impl(std::move(*this), std::forward(f)); + } + template constexpr auto transform(F &&f) const & { + return expected_map_impl(*this, std::forward(f)); + } + template constexpr auto transform(F &&f) const && { + return expected_map_impl(std::move(*this), std::forward(f)); + } +#else + template + TL_EXPECTED_11_CONSTEXPR decltype(expected_map_impl( + std::declval(), std::declval())) + transform(F &&f) & { + return expected_map_impl(*this, std::forward(f)); + } + template + TL_EXPECTED_11_CONSTEXPR decltype(expected_map_impl(std::declval(), + std::declval())) + transform(F &&f) && { + return expected_map_impl(std::move(*this), std::forward(f)); + } + template + constexpr decltype(expected_map_impl(std::declval(), + std::declval())) + transform(F &&f) const & { + return expected_map_impl(*this, std::forward(f)); + } + +#ifndef TL_EXPECTED_NO_CONSTRR + template + constexpr decltype(expected_map_impl(std::declval(), + std::declval())) + transform(F &&f) const && { + return expected_map_impl(std::move(*this), std::forward(f)); + } +#endif +#endif + +#if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ + !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) + template TL_EXPECTED_11_CONSTEXPR auto map_error(F &&f) & { + return map_error_impl(*this, std::forward(f)); + } + template TL_EXPECTED_11_CONSTEXPR auto map_error(F &&f) && { + return map_error_impl(std::move(*this), std::forward(f)); + } + template constexpr auto map_error(F &&f) const & { + return map_error_impl(*this, std::forward(f)); + } + template constexpr auto map_error(F &&f) const && { + return map_error_impl(std::move(*this), std::forward(f)); + } +#else + template + TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), + std::declval())) + map_error(F &&f) & { + return map_error_impl(*this, std::forward(f)); + } + template + TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), + std::declval())) + map_error(F &&f) && { + return map_error_impl(std::move(*this), std::forward(f)); + } + template + constexpr decltype(map_error_impl(std::declval(), + std::declval())) + map_error(F &&f) const & { + return map_error_impl(*this, std::forward(f)); + } + +#ifndef TL_EXPECTED_NO_CONSTRR + template + constexpr decltype(map_error_impl(std::declval(), + std::declval())) + map_error(F &&f) const && { + return map_error_impl(std::move(*this), std::forward(f)); + } +#endif +#endif +#if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ + !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) + template TL_EXPECTED_11_CONSTEXPR auto transform_error(F &&f) & { + return map_error_impl(*this, std::forward(f)); + } + template TL_EXPECTED_11_CONSTEXPR auto transform_error(F &&f) && { + return map_error_impl(std::move(*this), std::forward(f)); + } + template constexpr auto transform_error(F &&f) const & { + return map_error_impl(*this, std::forward(f)); + } + template constexpr auto transform_error(F &&f) const && { + return map_error_impl(std::move(*this), std::forward(f)); + } +#else + template + TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), + std::declval())) + transform_error(F &&f) & { + return map_error_impl(*this, std::forward(f)); + } + template + TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), + std::declval())) + transform_error(F &&f) && { + return map_error_impl(std::move(*this), std::forward(f)); + } + template + constexpr decltype(map_error_impl(std::declval(), + std::declval())) + transform_error(F &&f) const & { + return map_error_impl(*this, std::forward(f)); + } + +#ifndef TL_EXPECTED_NO_CONSTRR + template + constexpr decltype(map_error_impl(std::declval(), + std::declval())) + transform_error(F &&f) const && { + return map_error_impl(std::move(*this), std::forward(f)); + } +#endif +#endif + template expected TL_EXPECTED_11_CONSTEXPR or_else(F &&f) & { + return or_else_impl(*this, std::forward(f)); + } + + template expected TL_EXPECTED_11_CONSTEXPR or_else(F &&f) && { + return or_else_impl(std::move(*this), std::forward(f)); + } + + template expected constexpr or_else(F &&f) const & { + return or_else_impl(*this, std::forward(f)); + } + +#ifndef TL_EXPECTED_NO_CONSTRR + template expected constexpr or_else(F &&f) const && { + return or_else_impl(std::move(*this), std::forward(f)); + } +#endif + constexpr expected() = default; + constexpr expected(const expected &rhs) = default; + constexpr expected(expected &&rhs) = default; + expected &operator=(const expected &rhs) = default; + expected &operator=(expected &&rhs) = default; + + template ::value> * = + nullptr> + constexpr expected(in_place_t, Args &&...args) + : impl_base(in_place, std::forward(args)...), + ctor_base(detail::default_constructor_tag{}) {} + + template &, Args &&...>::value> * = nullptr> + constexpr expected(in_place_t, std::initializer_list il, Args &&...args) + : impl_base(in_place, il, std::forward(args)...), + ctor_base(detail::default_constructor_tag{}) {} + + template ::value> * = + nullptr, + detail::enable_if_t::value> * = + nullptr> + explicit constexpr expected(const unexpected &e) + : impl_base(unexpect, e.value()), + ctor_base(detail::default_constructor_tag{}) {} + + template < + class G = E, + detail::enable_if_t::value> * = + nullptr, + detail::enable_if_t::value> * = nullptr> + constexpr expected(unexpected const &e) + : impl_base(unexpect, e.value()), + ctor_base(detail::default_constructor_tag{}) {} + + template < + class G = E, + detail::enable_if_t::value> * = nullptr, + detail::enable_if_t::value> * = nullptr> + explicit constexpr expected(unexpected &&e) noexcept( + std::is_nothrow_constructible::value) + : impl_base(unexpect, std::move(e.value())), + ctor_base(detail::default_constructor_tag{}) {} + + template < + class G = E, + detail::enable_if_t::value> * = nullptr, + detail::enable_if_t::value> * = nullptr> + constexpr expected(unexpected &&e) noexcept( + std::is_nothrow_constructible::value) + : impl_base(unexpect, std::move(e.value())), + ctor_base(detail::default_constructor_tag{}) {} + + template ::value> * = + nullptr> + constexpr explicit expected(unexpect_t, Args &&...args) + : impl_base(unexpect, std::forward(args)...), + ctor_base(detail::default_constructor_tag{}) {} + + template &, Args &&...>::value> * = nullptr> + constexpr explicit expected(unexpect_t, std::initializer_list il, + Args &&...args) + : impl_base(unexpect, il, std::forward(args)...), + ctor_base(detail::default_constructor_tag{}) {} + + template ::value && + std::is_convertible::value)> * = + nullptr, + detail::expected_enable_from_other + * = nullptr> + explicit TL_EXPECTED_11_CONSTEXPR expected(const expected &rhs) + : ctor_base(detail::default_constructor_tag{}) { + if (rhs.has_value()) { + this->construct(*rhs); + } else { + this->construct_error(rhs.error()); + } + } + + template ::value && + std::is_convertible::value)> * = + nullptr, + detail::expected_enable_from_other + * = nullptr> + TL_EXPECTED_11_CONSTEXPR expected(const expected &rhs) + : ctor_base(detail::default_constructor_tag{}) { + if (rhs.has_value()) { + this->construct(*rhs); + } else { + this->construct_error(rhs.error()); + } + } + + template < + class U, class G, + detail::enable_if_t::value && + std::is_convertible::value)> * = nullptr, + detail::expected_enable_from_other * = nullptr> + explicit TL_EXPECTED_11_CONSTEXPR expected(expected &&rhs) + : ctor_base(detail::default_constructor_tag{}) { + if (rhs.has_value()) { + this->construct(std::move(*rhs)); + } else { + this->construct_error(std::move(rhs.error())); + } + } + + template < + class U, class G, + detail::enable_if_t<(std::is_convertible::value && + std::is_convertible::value)> * = nullptr, + detail::expected_enable_from_other * = nullptr> + TL_EXPECTED_11_CONSTEXPR expected(expected &&rhs) + : ctor_base(detail::default_constructor_tag{}) { + if (rhs.has_value()) { + this->construct(std::move(*rhs)); + } else { + this->construct_error(std::move(rhs.error())); + } + } + + template < + class U = T, + detail::enable_if_t::value> * = nullptr, + detail::expected_enable_forward_value * = nullptr> + explicit TL_EXPECTED_MSVC2015_CONSTEXPR expected(U &&v) + : expected(in_place, std::forward(v)) {} + + template < + class U = T, + detail::enable_if_t::value> * = nullptr, + detail::expected_enable_forward_value * = nullptr> + TL_EXPECTED_MSVC2015_CONSTEXPR expected(U &&v) + : expected(in_place, std::forward(v)) {} + + template < + class U = T, class G = T, + detail::enable_if_t::value> * = + nullptr, + detail::enable_if_t::value> * = nullptr, + detail::enable_if_t< + (!std::is_same, detail::decay_t>::value && + !detail::conjunction, + std::is_same>>::value && + std::is_constructible::value && + std::is_assignable::value && + std::is_nothrow_move_constructible::value)> * = nullptr> + expected &operator=(U &&v) { + if (has_value()) { + val() = std::forward(v); + } else { + err().~unexpected(); + ::new (valptr()) T(std::forward(v)); + this->m_has_val = true; + } + + return *this; + } + + template < + class U = T, class G = T, + detail::enable_if_t::value> * = + nullptr, + detail::enable_if_t::value> * = nullptr, + detail::enable_if_t< + (!std::is_same, detail::decay_t>::value && + !detail::conjunction, + std::is_same>>::value && + std::is_constructible::value && + std::is_assignable::value && + std::is_nothrow_move_constructible::value)> * = nullptr> + expected &operator=(U &&v) { + if (has_value()) { + val() = std::forward(v); + } else { + auto tmp = std::move(err()); + err().~unexpected(); + +#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED + try { + ::new (valptr()) T(std::forward(v)); + this->m_has_val = true; + } catch (...) { + err() = std::move(tmp); + throw; + } +#else + ::new (valptr()) T(std::forward(v)); + this->m_has_val = true; +#endif + } + + return *this; + } + + template ::value && + std::is_assignable::value> * = nullptr> + expected &operator=(const unexpected &rhs) { + if (!has_value()) { + err() = rhs; + } else { + this->destroy_val(); + ::new (errptr()) unexpected(rhs); + this->m_has_val = false; + } + + return *this; + } + + template ::value && + std::is_move_assignable::value> * = nullptr> + expected &operator=(unexpected &&rhs) noexcept { + if (!has_value()) { + err() = std::move(rhs); + } else { + this->destroy_val(); + ::new (errptr()) unexpected(std::move(rhs)); + this->m_has_val = false; + } + + return *this; + } + + template ::value> * = nullptr> + void emplace(Args &&...args) { + if (has_value()) { + val().~T(); + } else { + err().~unexpected(); + this->m_has_val = true; + } + ::new (valptr()) T(std::forward(args)...); + } + + template ::value> * = nullptr> + void emplace(Args &&...args) { + if (has_value()) { + val().~T(); + ::new (valptr()) T(std::forward(args)...); + } else { + auto tmp = std::move(err()); + err().~unexpected(); + +#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED + try { + ::new (valptr()) T(std::forward(args)...); + this->m_has_val = true; + } catch (...) { + err() = std::move(tmp); + throw; + } +#else + ::new (valptr()) T(std::forward(args)...); + this->m_has_val = true; +#endif + } + } + + template &, Args &&...>::value> * = nullptr> + void emplace(std::initializer_list il, Args &&...args) { + if (has_value()) { + T t(il, std::forward(args)...); + val() = std::move(t); + } else { + err().~unexpected(); + ::new (valptr()) T(il, std::forward(args)...); + this->m_has_val = true; + } + } + + template &, Args &&...>::value> * = nullptr> + void emplace(std::initializer_list il, Args &&...args) { + if (has_value()) { + T t(il, std::forward(args)...); + val() = std::move(t); + } else { + auto tmp = std::move(err()); + err().~unexpected(); + +#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED + try { + ::new (valptr()) T(il, std::forward(args)...); + this->m_has_val = true; + } catch (...) { + err() = std::move(tmp); + throw; + } +#else + ::new (valptr()) T(il, std::forward(args)...); + this->m_has_val = true; +#endif + } + } + +private: + using t_is_void = std::true_type; + using t_is_not_void = std::false_type; + using t_is_nothrow_move_constructible = std::true_type; + using move_constructing_t_can_throw = std::false_type; + using e_is_nothrow_move_constructible = std::true_type; + using move_constructing_e_can_throw = std::false_type; + + void swap_where_both_have_value(expected & /*rhs*/, t_is_void) noexcept { + // swapping void is a no-op + } + + void swap_where_both_have_value(expected &rhs, t_is_not_void) { + using std::swap; + swap(val(), rhs.val()); + } + + void swap_where_only_one_has_value(expected &rhs, t_is_void) noexcept( + std::is_nothrow_move_constructible::value) { + ::new (errptr()) unexpected_type(std::move(rhs.err())); + rhs.err().~unexpected_type(); + std::swap(this->m_has_val, rhs.m_has_val); + } + + void swap_where_only_one_has_value(expected &rhs, t_is_not_void) { + swap_where_only_one_has_value_and_t_is_not_void( + rhs, typename std::is_nothrow_move_constructible::type{}, + typename std::is_nothrow_move_constructible::type{}); + } + + void swap_where_only_one_has_value_and_t_is_not_void( + expected &rhs, t_is_nothrow_move_constructible, + e_is_nothrow_move_constructible) noexcept { + auto temp = std::move(val()); + val().~T(); + ::new (errptr()) unexpected_type(std::move(rhs.err())); + rhs.err().~unexpected_type(); + ::new (rhs.valptr()) T(std::move(temp)); + std::swap(this->m_has_val, rhs.m_has_val); + } + + void swap_where_only_one_has_value_and_t_is_not_void( + expected &rhs, t_is_nothrow_move_constructible, + move_constructing_e_can_throw) { + auto temp = std::move(val()); + val().~T(); +#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED + try { + ::new (errptr()) unexpected_type(std::move(rhs.err())); + rhs.err().~unexpected_type(); + ::new (rhs.valptr()) T(std::move(temp)); + std::swap(this->m_has_val, rhs.m_has_val); + } catch (...) { + val() = std::move(temp); + throw; + } +#else + ::new (errptr()) unexpected_type(std::move(rhs.err())); + rhs.err().~unexpected_type(); + ::new (rhs.valptr()) T(std::move(temp)); + std::swap(this->m_has_val, rhs.m_has_val); +#endif + } + + void swap_where_only_one_has_value_and_t_is_not_void( + expected &rhs, move_constructing_t_can_throw, + e_is_nothrow_move_constructible) { + auto temp = std::move(rhs.err()); + rhs.err().~unexpected_type(); +#ifdef TL_EXPECTED_EXCEPTIONS_ENABLED + try { + ::new (rhs.valptr()) T(std::move(val())); + val().~T(); + ::new (errptr()) unexpected_type(std::move(temp)); + std::swap(this->m_has_val, rhs.m_has_val); + } catch (...) { + rhs.err() = std::move(temp); + throw; + } +#else + ::new (rhs.valptr()) T(std::move(val())); + val().~T(); + ::new (errptr()) unexpected_type(std::move(temp)); + std::swap(this->m_has_val, rhs.m_has_val); +#endif + } + +public: + template + detail::enable_if_t::value && + detail::is_swappable::value && + (std::is_nothrow_move_constructible::value || + std::is_nothrow_move_constructible::value)> + swap(expected &rhs) noexcept( + std::is_nothrow_move_constructible::value + &&detail::is_nothrow_swappable::value + &&std::is_nothrow_move_constructible::value + &&detail::is_nothrow_swappable::value) { + if (has_value() && rhs.has_value()) { + swap_where_both_have_value(rhs, typename std::is_void::type{}); + } else if (!has_value() && rhs.has_value()) { + rhs.swap(*this); + } else if (has_value()) { + swap_where_only_one_has_value(rhs, typename std::is_void::type{}); + } else { + using std::swap; + swap(err(), rhs.err()); + } + } + + constexpr const T *operator->() const { + TL_ASSERT(has_value()); + return valptr(); + } + TL_EXPECTED_11_CONSTEXPR T *operator->() { + TL_ASSERT(has_value()); + return valptr(); + } + + template ::value> * = nullptr> + constexpr const U &operator*() const & { + TL_ASSERT(has_value()); + return val(); + } + template ::value> * = nullptr> + TL_EXPECTED_11_CONSTEXPR U &operator*() & { + TL_ASSERT(has_value()); + return val(); + } + template ::value> * = nullptr> + constexpr const U &&operator*() const && { + TL_ASSERT(has_value()); + return std::move(val()); + } + template ::value> * = nullptr> + TL_EXPECTED_11_CONSTEXPR U &&operator*() && { + TL_ASSERT(has_value()); + return std::move(val()); + } + + constexpr bool has_value() const noexcept { return this->m_has_val; } + constexpr explicit operator bool() const noexcept { return this->m_has_val; } + + template ::value> * = nullptr> + TL_EXPECTED_11_CONSTEXPR const U &value() const & { + if (!has_value()) + TL_EXPECTED_THROW_EXCEPTION(bad_expected_access(err().value())); + return val(); + } + template ::value> * = nullptr> + TL_EXPECTED_11_CONSTEXPR U &value() & { + if (!has_value()) + TL_EXPECTED_THROW_EXCEPTION(bad_expected_access(err().value())); + return val(); + } + template ::value> * = nullptr> + TL_EXPECTED_11_CONSTEXPR const U &&value() const && { + if (!has_value()) + TL_EXPECTED_THROW_EXCEPTION(bad_expected_access(std::move(err()).value())); + return std::move(val()); + } + template ::value> * = nullptr> + TL_EXPECTED_11_CONSTEXPR U &&value() && { + if (!has_value()) + TL_EXPECTED_THROW_EXCEPTION(bad_expected_access(std::move(err()).value())); + return std::move(val()); + } + + constexpr const E &error() const & { + TL_ASSERT(!has_value()); + return err().value(); + } + TL_EXPECTED_11_CONSTEXPR E &error() & { + TL_ASSERT(!has_value()); + return err().value(); + } + constexpr const E &&error() const && { + TL_ASSERT(!has_value()); + return std::move(err().value()); + } + TL_EXPECTED_11_CONSTEXPR E &&error() && { + TL_ASSERT(!has_value()); + return std::move(err().value()); + } + + template constexpr T value_or(U &&v) const & { + static_assert(std::is_copy_constructible::value && + std::is_convertible::value, + "T must be copy-constructible and convertible to from U&&"); + return bool(*this) ? **this : static_cast(std::forward(v)); + } + template TL_EXPECTED_11_CONSTEXPR T value_or(U &&v) && { + static_assert(std::is_move_constructible::value && + std::is_convertible::value, + "T must be move-constructible and convertible to from U&&"); + return bool(*this) ? std::move(**this) : static_cast(std::forward(v)); + } +}; + +namespace detail { +template using exp_t = typename detail::decay_t::value_type; +template using err_t = typename detail::decay_t::error_type; +template using ret_t = expected>; + +#ifdef TL_EXPECTED_CXX14 +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval(), + *std::declval()))> +constexpr auto and_then_impl(Exp &&exp, F &&f) { + static_assert(detail::is_expected::value, "F must return an expected"); + + return exp.has_value() + ? detail::invoke(std::forward(f), *std::forward(exp)) + : Ret(unexpect, std::forward(exp).error()); +} + +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval()))> +constexpr auto and_then_impl(Exp &&exp, F &&f) { + static_assert(detail::is_expected::value, "F must return an expected"); + + return exp.has_value() ? detail::invoke(std::forward(f)) + : Ret(unexpect, std::forward(exp).error()); +} +#else +template struct TC; +template (), + *std::declval())), + detail::enable_if_t>::value> * = nullptr> +auto and_then_impl(Exp &&exp, F &&f) -> Ret { + static_assert(detail::is_expected::value, "F must return an expected"); + + return exp.has_value() + ? detail::invoke(std::forward(f), *std::forward(exp)) + : Ret(unexpect, std::forward(exp).error()); +} + +template ())), + detail::enable_if_t>::value> * = nullptr> +constexpr auto and_then_impl(Exp &&exp, F &&f) -> Ret { + static_assert(detail::is_expected::value, "F must return an expected"); + + return exp.has_value() ? detail::invoke(std::forward(f)) + : Ret(unexpect, std::forward(exp).error()); +} +#endif + +#ifdef TL_EXPECTED_CXX14 +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval(), + *std::declval())), + detail::enable_if_t::value> * = nullptr> +constexpr auto expected_map_impl(Exp &&exp, F &&f) { + using result = ret_t>; + return exp.has_value() ? result(detail::invoke(std::forward(f), + *std::forward(exp))) + : result(unexpect, std::forward(exp).error()); +} + +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval(), + *std::declval())), + detail::enable_if_t::value> * = nullptr> +auto expected_map_impl(Exp &&exp, F &&f) { + using result = expected>; + if (exp.has_value()) { + detail::invoke(std::forward(f), *std::forward(exp)); + return result(); + } + + return result(unexpect, std::forward(exp).error()); +} + +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval())), + detail::enable_if_t::value> * = nullptr> +constexpr auto expected_map_impl(Exp &&exp, F &&f) { + using result = ret_t>; + return exp.has_value() ? result(detail::invoke(std::forward(f))) + : result(unexpect, std::forward(exp).error()); +} + +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval())), + detail::enable_if_t::value> * = nullptr> +auto expected_map_impl(Exp &&exp, F &&f) { + using result = expected>; + if (exp.has_value()) { + detail::invoke(std::forward(f)); + return result(); + } + + return result(unexpect, std::forward(exp).error()); +} +#else +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval(), + *std::declval())), + detail::enable_if_t::value> * = nullptr> + +constexpr auto expected_map_impl(Exp &&exp, F &&f) + -> ret_t> { + using result = ret_t>; + + return exp.has_value() ? result(detail::invoke(std::forward(f), + *std::forward(exp))) + : result(unexpect, std::forward(exp).error()); +} + +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval(), + *std::declval())), + detail::enable_if_t::value> * = nullptr> + +auto expected_map_impl(Exp &&exp, F &&f) -> expected> { + if (exp.has_value()) { + detail::invoke(std::forward(f), *std::forward(exp)); + return {}; + } + + return unexpected>(std::forward(exp).error()); +} + +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval())), + detail::enable_if_t::value> * = nullptr> + +constexpr auto expected_map_impl(Exp &&exp, F &&f) + -> ret_t> { + using result = ret_t>; + + return exp.has_value() ? result(detail::invoke(std::forward(f))) + : result(unexpect, std::forward(exp).error()); +} + +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval())), + detail::enable_if_t::value> * = nullptr> + +auto expected_map_impl(Exp &&exp, F &&f) -> expected> { + if (exp.has_value()) { + detail::invoke(std::forward(f)); + return {}; + } + + return unexpected>(std::forward(exp).error()); +} +#endif + +#if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ + !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval(), + std::declval().error())), + detail::enable_if_t::value> * = nullptr> +constexpr auto map_error_impl(Exp &&exp, F &&f) { + using result = expected, detail::decay_t>; + return exp.has_value() + ? result(*std::forward(exp)) + : result(unexpect, detail::invoke(std::forward(f), + std::forward(exp).error())); +} +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval(), + std::declval().error())), + detail::enable_if_t::value> * = nullptr> +auto map_error_impl(Exp &&exp, F &&f) { + using result = expected, monostate>; + if (exp.has_value()) { + return result(*std::forward(exp)); + } + + detail::invoke(std::forward(f), std::forward(exp).error()); + return result(unexpect, monostate{}); +} +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval(), + std::declval().error())), + detail::enable_if_t::value> * = nullptr> +constexpr auto map_error_impl(Exp &&exp, F &&f) { + using result = expected, detail::decay_t>; + return exp.has_value() + ? result() + : result(unexpect, detail::invoke(std::forward(f), + std::forward(exp).error())); +} +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval(), + std::declval().error())), + detail::enable_if_t::value> * = nullptr> +auto map_error_impl(Exp &&exp, F &&f) { + using result = expected, monostate>; + if (exp.has_value()) { + return result(); + } + + detail::invoke(std::forward(f), std::forward(exp).error()); + return result(unexpect, monostate{}); +} +#else +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval(), + std::declval().error())), + detail::enable_if_t::value> * = nullptr> +constexpr auto map_error_impl(Exp &&exp, F &&f) + -> expected, detail::decay_t> { + using result = expected, detail::decay_t>; + + return exp.has_value() + ? result(*std::forward(exp)) + : result(unexpect, detail::invoke(std::forward(f), + std::forward(exp).error())); +} + +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval(), + std::declval().error())), + detail::enable_if_t::value> * = nullptr> +auto map_error_impl(Exp &&exp, F &&f) -> expected, monostate> { + using result = expected, monostate>; + if (exp.has_value()) { + return result(*std::forward(exp)); + } + + detail::invoke(std::forward(f), std::forward(exp).error()); + return result(unexpect, monostate{}); +} + +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval(), + std::declval().error())), + detail::enable_if_t::value> * = nullptr> +constexpr auto map_error_impl(Exp &&exp, F &&f) + -> expected, detail::decay_t> { + using result = expected, detail::decay_t>; + + return exp.has_value() + ? result() + : result(unexpect, detail::invoke(std::forward(f), + std::forward(exp).error())); +} + +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval(), + std::declval().error())), + detail::enable_if_t::value> * = nullptr> +auto map_error_impl(Exp &&exp, F &&f) -> expected, monostate> { + using result = expected, monostate>; + if (exp.has_value()) { + return result(); + } + + detail::invoke(std::forward(f), std::forward(exp).error()); + return result(unexpect, monostate{}); +} +#endif + +#ifdef TL_EXPECTED_CXX14 +template (), + std::declval().error())), + detail::enable_if_t::value> * = nullptr> +constexpr auto or_else_impl(Exp &&exp, F &&f) { + static_assert(detail::is_expected::value, "F must return an expected"); + return exp.has_value() ? std::forward(exp) + : detail::invoke(std::forward(f), + std::forward(exp).error()); +} + +template (), + std::declval().error())), + detail::enable_if_t::value> * = nullptr> +detail::decay_t or_else_impl(Exp &&exp, F &&f) { + return exp.has_value() ? std::forward(exp) + : (detail::invoke(std::forward(f), + std::forward(exp).error()), + std::forward(exp)); +} +#else +template (), + std::declval().error())), + detail::enable_if_t::value> * = nullptr> +auto or_else_impl(Exp &&exp, F &&f) -> Ret { + static_assert(detail::is_expected::value, "F must return an expected"); + return exp.has_value() ? std::forward(exp) + : detail::invoke(std::forward(f), + std::forward(exp).error()); +} + +template (), + std::declval().error())), + detail::enable_if_t::value> * = nullptr> +detail::decay_t or_else_impl(Exp &&exp, F &&f) { + return exp.has_value() ? std::forward(exp) + : (detail::invoke(std::forward(f), + std::forward(exp).error()), + std::forward(exp)); +} +#endif +} // namespace detail + +template +constexpr bool operator==(const expected &lhs, + const expected &rhs) { + return (lhs.has_value() != rhs.has_value()) + ? false + : (!lhs.has_value() ? lhs.error() == rhs.error() : *lhs == *rhs); +} +template +constexpr bool operator!=(const expected &lhs, + const expected &rhs) { + return (lhs.has_value() != rhs.has_value()) + ? true + : (!lhs.has_value() ? lhs.error() != rhs.error() : *lhs != *rhs); +} +template +constexpr bool operator==(const expected &lhs, + const expected &rhs) { + return (lhs.has_value() != rhs.has_value()) + ? false + : (!lhs.has_value() ? lhs.error() == rhs.error() : true); +} +template +constexpr bool operator!=(const expected &lhs, + const expected &rhs) { + return (lhs.has_value() != rhs.has_value()) + ? true + : (!lhs.has_value() ? lhs.error() != rhs.error() : false); +} + +template +constexpr bool operator==(const expected &x, const U &v) { + return x.has_value() ? *x == v : false; +} +template +constexpr bool operator==(const U &v, const expected &x) { + return x.has_value() ? *x == v : false; +} +template +constexpr bool operator!=(const expected &x, const U &v) { + return x.has_value() ? *x != v : true; +} +template +constexpr bool operator!=(const U &v, const expected &x) { + return x.has_value() ? *x != v : true; +} + +template +constexpr bool operator==(const expected &x, const unexpected &e) { + return x.has_value() ? false : x.error() == e.value(); +} +template +constexpr bool operator==(const unexpected &e, const expected &x) { + return x.has_value() ? false : x.error() == e.value(); +} +template +constexpr bool operator!=(const expected &x, const unexpected &e) { + return x.has_value() ? true : x.error() != e.value(); +} +template +constexpr bool operator!=(const unexpected &e, const expected &x) { + return x.has_value() ? true : x.error() != e.value(); +} + +template ::value || + std::is_move_constructible::value) && + detail::is_swappable::value && + std::is_move_constructible::value && + detail::is_swappable::value> * = nullptr> +void swap(expected &lhs, + expected &rhs) noexcept(noexcept(lhs.swap(rhs))) { + lhs.swap(rhs); +} +} // namespace tl + +#endif \ No newline at end of file