From a3db63bdaaff2b618455dbd567aabababa7c6a19 Mon Sep 17 00:00:00 2001 From: Francesco Poluzzi <145541066+FrancescoPoluzzi@users.noreply.github.com> Date: Fri, 6 Sep 2024 09:20:07 +0200 Subject: [PATCH] Add example_data_procssing_from_flash (#568) --- .../gen_stimuly.py | 65 ++++++ .../example_data_processing_from_flash/main.c | 87 ++++++++ .../example_data_processing_from_flash/main.h | 42 ++++ .../matrices.h | 206 ++++++++++++++++++ 4 files changed, 400 insertions(+) create mode 100644 sw/applications/example_data_processing_from_flash/gen_stimuly.py create mode 100644 sw/applications/example_data_processing_from_flash/main.c create mode 100644 sw/applications/example_data_processing_from_flash/main.h create mode 100644 sw/applications/example_data_processing_from_flash/matrices.h diff --git a/sw/applications/example_data_processing_from_flash/gen_stimuly.py b/sw/applications/example_data_processing_from_flash/gen_stimuly.py new file mode 100644 index 000000000..5a4a6cd23 --- /dev/null +++ b/sw/applications/example_data_processing_from_flash/gen_stimuly.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +## Copyright 2024 EPFL +## Solderpad Hardware License, Version 2.1, see LICENSE.md for details. +## SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 + +# type " python gen_stimuly.py " in the terminal to generate the matrices.h file + +import sys +import random +import numpy as np + +def write_arr(f, name, arr, ctype, size): + f.write("const " + ctype + " " + name + "[] = {\n") + + for row in arr: + for elem in row[:-1]: + f.write('%d,' % (elem)) + f.write('%d,\n' % (row[-1])) + + f.write('};\n\n') + return + +def write_arr_flash_only(f, name, arr, ctype, size): + f.write( ctype + " __attribute__((section(\".xheep_data_flash_only\"))) __attribute__ ((aligned (16)))" + name + "[] = {\n") + + for row in arr: + for elem in row[:-1]: + f.write('%d,' % (elem)) + f.write('%d,\n' % (row[-1])) + + f.write('};\n\n') + return + + +################################################################################ +f = open('matrices.h', 'w') +f.write('#ifndef MATRICES_H_\n') +f.write('#define MATRICES_H_\n') +f.write('// This file is automatically generated\n') + + +SIZE = 64 +RANGE = 10 + +m_a = [] +m_b = [] +m_exp = [] + +# Generate random 8 bit integers from -RANGE to RANGE for A and B +A = np.random.randint(0, RANGE, size=(SIZE, SIZE), dtype=np.int32) +B = np.random.randint(0, RANGE, size=(SIZE, SIZE), dtype=np.int32) +C = np.zeros((SIZE, SIZE), dtype=np.int32) + +# Test the function with A and B +C = np.matmul(A,B) + +write_arr_flash_only(f, 'A', A, 'int32_t', SIZE) +write_arr(f, 'B', B, 'int32_t', SIZE) +write_arr(f, 'C', C, 'int32_t', SIZE) + +f.write('#define MATRIX_SIZE %d\n' % SIZE) + + +f.write('#endif') diff --git a/sw/applications/example_data_processing_from_flash/main.c b/sw/applications/example_data_processing_from_flash/main.c new file mode 100644 index 000000000..01f7dab7d --- /dev/null +++ b/sw/applications/example_data_processing_from_flash/main.c @@ -0,0 +1,87 @@ +// Copyright 2024 EPFL +// Solderpad Hardware License, Version 2.1, see LICENSE.md for details. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +// +// File: sw/applications/example_data_processing_from_flash/main.c +// Author: Francesco Poluzzi +// Date: 29/07/2024 + +/** + * @file main.c + * @brief Example of data processing (matrix multiplication) reading data from flash memory + * + * Simple example that read a matrix from flash memory in many step and performs + * matrix multiplication. This is useful for applications where the + * data size does not fit in the available SRAM memory, so some data needs to be + * stored as "flash_only" and read trough the spi interface. This usually requires + * filling a buffer and tiling the data processing. +*/ + +#include +#include +#include + +#include "x-heep.h" +#include "w25q128jw.h" +#include "main.h" +#include "dma_sdk.h" + +#define TILING_ROWS 2 + + /* By default, printfs are activated for FPGA and disabled for simulation. */ +#define PRINTF_IN_FPGA 1 +#define PRINTF_IN_SIM 0 +#if TARGET_SIM && PRINTF_IN_SIM + #define PRINTF(fmt, ...) printf(fmt, ## __VA_ARGS__) +#elif PRINTF_IN_FPGA && !TARGET_SIM + #define PRINTF(fmt, ...) printf(fmt, ## __VA_ARGS__) +#else + #define PRINTF(...) +#endif + +int32_t buffer_data[MATRIX_SIZE*TILING_ROWS] = {0}; +int32_t output_matrix[MATRIX_SIZE*MATRIX_SIZE] = {0}; + +int main(int argc, char *argv[]) { + + soc_ctrl_t soc_ctrl; + soc_ctrl.base_addr = mmio_region_from_addr((uintptr_t)SOC_CTRL_START_ADDRESS); + + #ifdef TARGET_SIM + PRINTF("This application is meant to run on FPGA only\n"); + return EXIT_SUCCESS; + #endif + + if ( get_spi_flash_mode(&soc_ctrl) == SOC_CTRL_SPI_FLASH_MODE_SPIMEMIO ) { + PRINTF("This application cannot work with the memory mapped SPI FLASH" + "module - do not use the FLASH_EXEC linker script for this application\n"); + return EXIT_SUCCESS; + } + + // Pick the correct spi device based on simulation type + spi_host_t* spi = spi_flash; + + // Init SPI host and SPI<->Flash bridge parameters + if (w25q128jw_init(spi) != FLASH_OK){ + PRINTF("Error initializing SPI flash\n"); + return EXIT_FAILURE; + } + + for (int i = 0; i < MATRIX_SIZE; i+=TILING_ROWS) { + // read first half matrix A from flash and perform matmul + if(fill_buffer(&A[i*MATRIX_SIZE], buffer_data, MATRIX_SIZE*TILING_ROWS)!=FLASH_OK){ + PRINTF("Error reading from flash\n"); + return EXIT_FAILURE; + } + matmul(buffer_data, B, &output_matrix[i*MATRIX_SIZE], TILING_ROWS, MATRIX_SIZE, MATRIX_SIZE); + } + + for(int i = 0; i < MATRIX_SIZE*MATRIX_SIZE; i++){ + if (output_matrix[i] != C[i]){ + PRINTF("Result[%d][%d]:golden model %d : %d\n", (i/MATRIX_SIZE), (i % MATRIX_SIZE), output_matrix[i], C[i]); + return EXIT_FAILURE; + } + } + PRINTF("All tests passed!\n"); + return EXIT_SUCCESS; +} diff --git a/sw/applications/example_data_processing_from_flash/main.h b/sw/applications/example_data_processing_from_flash/main.h new file mode 100644 index 000000000..0e588e78b --- /dev/null +++ b/sw/applications/example_data_processing_from_flash/main.h @@ -0,0 +1,42 @@ +// Copyright 2024 EPFL +// Solderpad Hardware License, Version 2.1, see LICENSE.md for details. +// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +// +// File: sw/applications/example_data_processing_from_flash/main.h +// Author: Francesco Poluzzi +// Date: 29/07/2024 + +#ifndef MAIN_H_ +#define MAIN_H_ + +#include +#include +#include + +#include "x-heep.h" +#include "w25q128jw.h" +#include "matrices.h" + +w25q_error_codes_t fill_buffer(uint32_t *source, uint32_t *buffer, uint32_t len); +void matmul(int32_t *A, int32_t *B, int32_t *res, int rowsA, int colsA, int colsB); + +w25q_error_codes_t fill_buffer(uint32_t *source, uint32_t *buffer, uint32_t len){ + uint32_t *source_flash = heep_get_flash_address_offset(source); + w25q_error_codes_t status = w25q128jw_read_standard(source_flash, buffer, len*4); + return status; +} + +void matmul(int32_t *A, int32_t *B, int32_t *res, int rowsA, int colsA, int colsB) { + for (int i = 0; i < rowsA; i++) { + for (int j = 0; j < colsB; j++) { + int32_t sum = 0; + for (int k = 0; k < colsA; k++) { + sum += A[i*colsA + k] * B[k*colsB + j]; + } + res[i*colsB + j] = sum; + } + } +} + + +#endif // DATA_H_ diff --git a/sw/applications/example_data_processing_from_flash/matrices.h b/sw/applications/example_data_processing_from_flash/matrices.h new file mode 100644 index 000000000..323d1a06b --- /dev/null +++ b/sw/applications/example_data_processing_from_flash/matrices.h @@ -0,0 +1,206 @@ +#ifndef MATRICES_H_ +#define MATRICES_H_ +// This file is automatically generated +int32_t __attribute__((section(".xheep_data_flash_only"))) __attribute__ ((aligned (16)))A[] = { +8,0,9,3,0,0,7,3,4,4,4,0,5,1,9,3,9,1,0,4,1,1,9,4,6,9,8,1,3,3,2,6,5,6,8,7,4,3,3,1,1,9,8,9,6,3,1,6,4,3,6,1,9,0,6,7,5,0,6,5,1,5,6,2, +3,1,8,2,9,8,1,3,0,2,4,6,6,5,7,1,5,5,5,8,6,5,4,9,2,6,7,1,7,2,5,0,9,9,7,6,2,1,6,5,4,9,5,3,1,5,6,9,3,4,4,1,1,7,2,5,8,0,6,4,3,1,8,2, +3,8,8,0,7,5,1,9,1,2,2,2,0,6,4,6,2,4,7,6,0,9,9,8,5,1,9,5,9,8,2,2,7,7,7,5,9,0,3,4,5,3,9,0,2,2,0,7,2,3,1,1,5,5,3,6,4,4,3,7,5,6,0,4, +9,4,4,2,0,4,3,5,7,5,7,5,3,6,5,4,5,7,4,2,4,0,2,8,6,8,4,0,1,3,8,5,4,8,5,1,6,0,7,6,3,1,1,6,2,5,4,9,4,9,5,1,3,7,0,1,0,2,6,3,8,0,1,6, +3,7,8,9,5,1,7,5,5,8,9,7,2,1,2,1,0,3,5,5,3,0,3,0,8,3,3,5,6,3,7,2,2,6,6,1,7,1,7,6,7,1,7,2,0,6,5,1,7,6,6,4,6,3,7,2,1,0,5,9,1,1,1,1, +4,5,6,7,5,3,5,0,2,9,1,7,1,5,6,6,8,8,1,4,5,8,5,2,5,8,8,5,9,5,2,5,6,4,1,2,9,7,1,1,0,6,9,1,2,2,6,3,7,6,6,1,2,0,1,1,8,9,7,0,4,9,0,3, +5,9,0,0,6,3,8,2,4,5,2,9,1,4,4,8,9,3,5,7,1,6,8,8,7,9,3,7,7,4,8,4,9,6,3,1,5,0,6,7,9,6,9,6,4,9,0,6,0,2,1,4,9,4,7,6,0,1,8,2,8,4,2,9, +5,0,0,9,3,7,3,3,8,4,2,0,1,9,5,5,0,0,4,9,8,7,1,3,3,4,3,0,0,3,3,0,2,5,1,8,6,0,2,0,4,2,3,2,9,5,5,2,8,9,4,2,9,7,7,8,8,3,8,9,3,9,1,9, +6,8,4,2,5,3,3,5,1,0,0,8,1,3,9,9,5,5,9,0,5,9,8,2,4,1,4,3,0,6,7,9,9,2,1,8,1,5,1,9,6,3,9,5,0,1,3,6,4,7,5,0,4,6,3,1,4,9,2,1,8,2,8,5, +9,8,5,1,8,0,0,0,1,5,2,6,2,3,2,6,6,7,3,6,6,3,5,9,8,8,1,7,4,4,1,2,0,2,4,3,0,0,5,5,3,8,6,1,4,6,4,8,5,9,7,9,8,1,0,9,8,1,9,6,4,4,0,2, +1,6,0,4,7,8,1,6,8,8,9,4,7,8,1,3,5,4,1,2,8,3,6,4,2,0,1,9,3,9,6,9,2,2,3,3,2,7,1,0,2,8,9,9,9,8,7,4,2,9,4,8,2,0,9,0,3,2,5,6,4,9,3,1, +0,9,9,8,5,4,5,4,1,9,3,3,0,1,6,3,8,6,6,6,3,8,5,7,8,9,4,1,8,2,6,0,5,3,6,7,1,9,8,7,9,0,5,5,3,7,0,1,2,9,4,3,8,3,2,6,1,0,5,5,6,0,4,8, +8,6,2,6,1,4,4,2,0,3,9,8,9,3,1,8,2,9,5,9,9,4,6,0,9,9,9,4,8,7,7,4,4,1,7,9,9,7,3,2,1,6,5,6,5,4,7,9,0,1,0,5,6,9,1,5,1,1,7,5,8,6,7,6, +7,6,5,8,6,2,3,1,2,8,3,9,5,9,3,9,8,8,2,4,7,0,7,4,1,1,9,8,9,7,4,9,3,4,8,3,6,1,1,7,4,9,7,6,8,3,9,1,2,8,2,1,1,6,0,1,2,1,2,2,2,1,0,1, +3,2,7,7,9,2,1,4,0,0,4,4,4,1,4,3,2,1,1,6,4,0,4,6,2,4,9,1,1,3,6,9,0,0,0,0,4,4,6,7,5,9,0,4,1,7,7,0,5,9,4,5,4,1,9,1,3,0,8,4,9,1,8,3, +9,9,3,9,1,9,4,5,3,6,0,5,8,4,3,9,0,2,7,6,1,9,7,4,0,0,9,4,1,6,3,6,7,9,3,9,4,6,6,1,1,7,0,8,0,3,1,0,5,9,3,9,4,7,7,1,1,7,7,1,1,0,2,1, +0,8,7,7,8,0,9,0,4,3,9,1,3,8,3,8,4,2,1,2,2,9,0,2,4,6,1,3,1,8,9,0,1,7,9,0,1,7,2,3,7,7,7,0,0,1,4,4,8,4,8,7,8,9,9,8,9,3,1,6,5,4,5,2, +6,1,9,3,1,9,0,6,0,0,1,5,3,0,0,4,7,7,2,4,8,8,9,3,8,8,9,4,5,3,8,4,1,2,7,5,4,4,9,3,7,5,2,9,4,5,0,3,2,3,7,2,2,8,7,1,4,4,9,2,1,7,7,6, +6,3,0,2,7,7,2,8,8,7,1,6,8,1,5,6,7,7,7,4,9,8,4,8,7,6,0,8,0,9,8,0,8,8,1,4,7,8,7,3,3,9,8,6,5,7,8,9,0,8,6,6,7,4,8,3,6,0,2,8,3,9,3,1, +5,9,0,5,3,9,5,4,6,8,4,9,9,6,8,2,5,8,0,1,3,8,5,9,8,3,1,4,9,0,9,8,1,6,6,9,9,5,0,4,9,4,2,5,3,0,2,9,8,1,6,3,7,3,8,2,9,9,9,6,0,7,4,5, +7,0,7,7,1,7,7,3,2,5,4,5,7,5,7,2,8,7,2,0,2,8,3,9,7,5,1,0,5,8,7,2,1,9,2,3,3,7,7,1,4,3,2,2,8,3,0,7,4,6,1,5,0,3,6,5,0,9,4,2,3,1,5,0, +9,4,2,7,3,2,5,8,5,1,7,2,1,9,1,6,7,3,7,0,2,7,9,4,3,1,9,6,1,3,2,5,9,9,1,9,0,5,4,2,3,3,3,3,1,7,2,2,9,9,8,4,1,1,1,1,6,6,5,4,0,3,1,2, +1,9,3,6,6,3,4,9,3,4,2,2,4,3,5,4,0,6,5,1,1,1,2,7,9,4,0,0,3,7,1,8,9,0,7,7,1,3,7,7,5,7,9,7,0,0,8,1,9,0,3,9,3,9,0,8,4,5,4,5,6,0,9,4, +5,6,4,1,1,8,9,4,3,2,5,9,5,4,5,6,9,4,1,7,1,3,0,0,5,9,5,2,3,2,5,5,7,2,2,9,3,1,2,8,5,0,1,0,8,9,2,9,3,4,6,9,5,4,7,4,7,9,6,1,0,8,2,8, +5,3,4,4,8,1,5,5,2,4,2,1,1,5,6,3,2,4,9,1,1,5,3,1,3,3,8,0,4,8,8,4,7,0,1,1,6,2,1,0,8,2,0,4,4,4,5,4,0,7,7,8,5,5,0,0,0,1,8,8,7,4,7,9, +1,7,2,6,1,6,7,6,2,9,6,2,5,7,7,8,1,5,7,3,3,4,9,8,7,6,5,5,2,8,7,8,7,1,6,0,5,2,2,4,2,3,3,2,0,0,3,4,5,2,2,9,2,9,7,7,9,5,9,0,1,5,3,0, +7,4,1,9,4,5,0,6,7,4,1,2,7,4,0,8,8,3,7,0,5,3,2,2,4,2,7,0,0,5,0,4,6,9,6,2,2,4,5,3,4,4,2,8,7,3,9,4,5,8,5,2,9,4,1,3,2,9,2,2,4,3,9,8, +6,7,8,8,8,8,9,1,1,5,0,5,5,4,2,0,3,0,4,2,1,0,2,6,2,8,1,4,1,6,8,0,0,5,1,3,8,0,2,3,6,6,3,3,4,8,9,2,8,3,1,3,7,2,1,4,9,9,4,4,3,1,2,1, +0,9,9,6,9,3,9,7,5,3,9,3,0,2,9,6,2,2,5,6,8,2,9,6,8,3,6,7,4,4,3,8,6,1,2,6,6,0,9,0,0,9,3,9,9,8,4,8,6,8,0,6,1,3,0,8,4,3,5,3,0,6,2,2, +1,7,1,4,3,5,6,3,7,2,3,1,6,3,5,2,9,3,7,0,6,9,6,5,3,9,6,0,2,3,1,0,6,2,5,8,2,3,0,0,0,4,3,9,4,6,3,5,2,0,3,8,8,2,8,2,5,6,9,7,3,2,9,9, +5,5,4,0,2,4,0,4,5,2,7,6,6,8,5,3,5,5,2,7,3,8,7,5,5,3,6,0,8,6,3,1,7,4,7,1,0,4,3,0,7,9,5,0,6,0,7,3,3,8,2,5,1,4,4,1,6,4,2,5,5,6,8,0, +8,5,9,6,7,9,8,2,9,1,5,1,0,5,9,6,1,9,8,7,6,9,1,0,1,2,8,4,7,4,5,6,9,1,5,8,7,2,4,3,8,3,8,9,0,6,3,1,6,5,7,0,3,1,3,8,5,7,0,8,8,2,7,3, +7,2,8,3,9,8,9,1,6,5,0,4,5,7,3,9,9,0,9,9,2,6,4,3,3,3,3,9,5,5,7,4,2,4,7,2,3,5,5,9,8,6,3,1,5,7,6,8,9,4,1,8,8,5,4,9,0,7,5,4,5,3,6,9, +0,4,8,3,0,9,2,7,1,2,8,5,6,2,8,5,2,0,4,8,2,5,8,2,0,5,7,8,8,0,8,9,3,7,9,5,4,9,4,2,6,9,7,1,5,4,6,3,2,6,3,9,8,4,1,0,1,6,2,0,5,3,7,6, +6,4,6,1,0,7,3,4,6,2,7,1,3,9,0,5,5,4,7,0,0,3,4,8,2,6,6,9,9,0,2,6,5,9,9,7,7,0,6,2,2,7,8,3,8,6,0,4,7,7,0,9,2,2,1,5,1,8,2,3,7,7,1,9, +0,4,2,8,9,7,3,4,1,5,3,3,0,6,4,1,1,8,1,4,9,6,4,0,8,0,2,7,2,2,1,2,8,3,2,3,7,5,9,1,7,8,5,5,6,2,0,0,1,4,3,5,2,8,4,2,7,7,0,5,7,3,4,0, +1,7,4,5,1,3,9,1,8,2,3,7,0,2,9,3,5,3,3,9,2,6,0,5,7,4,9,7,9,6,9,6,4,1,5,3,7,3,0,2,3,9,7,7,8,2,5,8,4,0,8,3,3,0,4,3,0,5,7,3,7,3,9,7, +4,5,5,0,8,1,5,7,8,1,2,5,8,3,0,6,2,9,6,4,5,5,6,6,0,3,8,0,2,0,9,9,1,7,9,4,8,8,7,5,8,1,5,0,0,4,7,1,2,0,2,0,6,7,8,0,1,3,4,0,8,6,9,5, +6,6,9,6,5,1,2,7,1,6,5,5,5,7,2,8,3,5,6,0,8,7,6,9,3,8,8,8,5,3,4,8,5,6,9,2,7,5,7,3,1,7,2,2,9,6,1,9,2,4,4,3,9,2,5,1,6,7,7,2,9,8,6,0, +9,4,4,3,0,3,4,7,1,0,8,4,8,3,1,4,2,5,9,0,0,1,8,5,1,9,3,0,8,9,9,7,4,2,0,3,7,5,8,8,9,1,6,8,3,2,1,6,7,1,6,9,5,9,9,3,5,2,3,4,7,2,1,1, +4,8,0,1,3,6,6,2,5,2,7,2,5,5,7,0,6,4,6,4,8,0,6,4,0,3,6,7,9,7,4,6,8,9,8,7,8,5,0,5,4,5,4,2,8,6,7,8,2,2,0,8,6,4,3,9,7,1,2,3,5,2,5,2, +8,7,0,9,4,4,0,7,5,9,1,8,7,6,9,3,5,6,8,7,8,8,6,9,4,8,6,1,2,8,5,1,1,3,3,3,6,2,8,0,7,3,1,3,2,4,1,1,3,5,6,1,0,9,7,7,7,9,3,4,3,3,6,7, +3,2,8,4,1,0,4,9,4,2,9,5,7,0,9,0,7,8,1,1,8,9,9,3,4,0,7,9,1,4,7,7,9,6,1,8,1,4,1,2,1,6,8,5,8,9,5,1,2,4,3,2,4,6,9,0,6,7,0,8,5,5,2,4, +2,8,7,9,4,3,4,7,0,1,6,9,2,4,9,0,4,2,4,7,6,2,7,7,6,1,5,7,0,2,4,8,4,9,0,1,4,0,1,5,4,9,1,6,8,6,7,9,6,7,6,5,2,0,1,7,1,0,8,0,1,2,5,2, +0,6,8,8,3,3,5,7,1,1,7,5,2,6,2,0,4,2,7,0,7,9,6,9,1,8,4,3,5,7,1,9,3,3,0,5,6,2,0,5,1,6,8,0,1,2,0,6,7,7,9,6,5,6,2,6,9,4,2,7,4,9,6,8, +3,3,9,1,5,2,9,1,4,4,8,9,3,8,1,4,7,9,0,2,4,8,4,5,6,0,7,4,8,9,6,9,9,3,4,9,6,2,2,6,4,0,5,2,5,3,2,3,4,1,3,4,1,9,5,4,9,3,0,3,4,1,2,8, +4,2,0,9,7,5,7,2,9,0,8,6,0,1,5,6,8,3,4,7,5,9,2,0,8,7,6,6,7,1,3,5,3,7,6,2,1,8,2,0,4,1,6,9,3,0,5,7,1,1,6,8,3,4,1,2,7,6,5,6,6,1,1,2, +6,3,5,8,4,9,2,0,9,7,5,4,3,5,7,0,5,7,7,4,4,0,5,3,4,6,0,0,2,2,7,7,0,5,7,2,6,5,3,5,9,9,4,1,6,7,7,3,4,8,6,6,1,1,7,1,3,4,4,4,4,2,1,1, +7,1,2,0,5,9,2,1,3,9,3,7,4,9,5,1,6,5,7,2,0,5,2,4,8,0,5,2,6,6,7,9,8,7,7,8,5,2,4,6,9,3,4,8,8,1,3,4,5,2,2,7,3,9,2,8,8,8,8,8,1,4,1,4, +8,6,3,2,5,1,1,0,9,9,9,8,3,9,5,4,6,2,0,0,4,6,7,1,0,0,0,2,5,2,5,4,9,1,1,5,6,7,6,0,6,4,3,6,5,2,8,7,3,4,0,7,5,4,6,8,8,9,9,6,2,3,2,9, +0,4,9,6,2,5,0,6,0,6,2,0,5,9,7,9,9,7,9,7,3,0,9,7,9,2,5,0,7,5,7,6,7,7,9,9,1,7,1,6,1,3,9,3,6,4,4,9,8,9,6,4,8,5,8,1,5,9,2,5,4,7,2,7, +1,1,3,6,0,1,9,3,5,0,5,0,0,3,0,3,7,7,5,7,5,8,0,4,9,8,8,2,3,7,1,9,8,3,2,1,4,7,8,4,3,7,6,0,2,7,6,2,4,6,2,4,9,2,5,0,0,0,7,5,3,5,7,1, +7,5,9,1,5,8,8,6,5,1,8,4,3,2,1,9,7,8,1,2,3,5,6,0,6,1,0,3,7,9,1,3,0,2,0,5,4,7,3,9,3,4,6,6,6,8,2,0,4,8,3,1,1,2,0,6,9,9,9,8,3,4,7,7, +4,9,4,5,0,9,6,5,5,2,5,5,5,5,1,9,4,9,8,1,5,2,9,8,1,9,9,0,0,7,4,8,7,1,8,8,7,3,3,2,2,4,5,0,1,2,3,6,9,0,0,2,1,5,5,7,7,0,7,6,5,5,7,6, +9,1,9,3,8,2,2,9,7,9,4,9,5,2,6,5,5,3,7,2,8,8,7,7,9,2,1,4,0,2,2,8,8,5,9,9,0,5,2,1,5,5,3,3,7,0,7,3,5,9,8,2,6,0,3,7,8,8,4,6,6,3,3,3, +0,8,6,6,5,9,4,8,7,8,4,8,3,8,7,9,4,4,5,5,6,0,9,4,9,2,8,7,0,1,2,5,3,6,1,9,2,7,4,6,4,7,9,5,6,0,4,1,1,2,6,5,2,1,1,9,6,2,0,8,0,4,7,5, +8,5,6,2,3,3,9,4,4,1,9,2,7,0,6,8,1,5,6,7,3,9,9,4,5,6,9,6,7,9,0,2,8,5,1,3,9,2,8,3,5,3,9,2,5,6,3,7,0,2,4,8,2,8,4,2,2,1,8,9,2,1,7,4, +3,8,3,6,2,1,1,6,1,1,7,9,3,4,5,4,8,7,2,3,9,8,8,1,8,0,8,5,8,1,1,2,2,3,9,5,6,1,0,3,1,5,2,1,6,4,4,7,0,4,9,8,7,6,6,9,6,3,0,6,7,6,3,5, +2,1,9,4,2,4,3,9,1,9,0,9,9,2,2,1,5,2,2,9,2,4,6,2,3,3,4,0,0,8,8,4,6,2,2,5,6,7,5,6,1,3,9,7,0,1,2,2,5,9,2,1,3,1,8,8,1,3,6,9,6,0,9,2, +5,4,8,8,6,8,9,1,7,6,2,0,7,8,6,1,0,6,9,2,7,6,8,1,3,6,2,1,5,1,0,4,9,1,5,2,4,4,4,5,6,4,4,6,8,5,6,7,8,5,3,1,3,3,6,9,6,0,0,8,1,8,8,6, +9,0,5,0,9,6,4,8,3,9,9,8,2,8,0,0,9,5,2,1,2,0,1,5,2,1,9,6,3,8,7,0,1,0,9,1,0,1,6,0,8,7,4,5,6,4,5,6,5,9,5,8,9,4,2,0,8,2,6,5,4,5,4,5, +8,7,5,6,8,4,8,2,4,6,5,0,2,1,1,0,8,3,0,0,6,7,6,5,5,7,0,9,4,2,1,0,8,1,5,0,4,5,5,1,4,6,6,5,5,2,2,7,9,8,6,6,4,3,9,5,7,6,5,8,5,7,7,3, +2,4,8,3,7,6,5,0,3,8,0,4,8,7,6,3,6,0,3,2,8,7,4,6,2,1,6,3,5,7,5,1,5,3,8,9,9,3,0,7,2,6,7,5,5,7,3,3,9,7,6,3,6,4,3,2,5,3,5,0,1,2,7,3, +6,0,1,2,3,9,7,8,4,6,3,8,3,0,5,2,9,1,9,6,9,6,2,1,0,6,0,1,2,5,6,4,9,8,9,4,1,2,6,6,4,7,1,2,7,3,7,9,9,2,6,0,4,4,2,5,0,0,4,6,2,4,8,0, +}; + +const int32_t B[] = { +1,1,9,1,9,6,7,6,2,8,2,8,5,6,3,0,2,4,0,1,7,5,9,1,7,4,7,3,2,2,8,0,3,1,3,7,1,9,2,5,6,5,2,3,7,1,6,3,3,2,1,4,2,4,8,9,4,0,8,3,6,4,0,9, +6,1,6,9,1,4,3,4,2,3,4,8,0,0,1,2,7,7,9,6,1,5,8,7,6,7,1,8,0,2,7,1,4,5,7,4,2,7,6,0,0,1,7,9,0,4,3,8,8,9,4,3,4,7,6,3,4,0,8,9,5,1,1,7, +3,3,4,7,0,4,1,5,2,1,2,5,6,6,1,4,4,2,8,7,5,4,0,5,8,1,7,2,3,4,7,7,6,3,1,5,6,2,8,5,7,8,7,7,9,3,5,9,9,1,1,1,6,8,5,5,9,7,9,5,8,9,0,9, +2,9,2,2,4,4,6,7,4,7,4,2,4,2,7,2,2,2,9,6,7,2,1,5,0,9,5,2,8,6,8,6,2,7,8,2,0,1,0,2,9,0,3,9,9,6,9,2,1,7,1,1,4,6,7,9,8,8,5,3,1,1,8,5, +2,2,8,2,0,6,7,3,0,1,2,0,5,2,6,9,3,5,2,0,9,7,6,7,2,5,2,3,0,6,0,4,5,1,6,4,7,8,0,1,0,7,1,6,6,5,4,7,2,3,0,3,8,0,7,4,5,0,3,8,6,3,5,0, +9,1,3,8,5,9,4,9,0,2,9,7,1,1,0,8,4,7,8,5,3,2,3,0,9,8,3,7,5,8,8,5,9,5,6,5,2,7,3,3,7,2,2,7,0,0,4,9,8,8,0,6,0,9,3,9,6,5,7,0,8,2,2,3, +4,3,2,5,2,0,4,6,7,1,5,1,6,4,1,0,4,6,1,1,3,8,8,9,1,1,9,9,7,5,0,8,5,5,9,0,4,1,7,5,2,2,7,8,5,1,1,0,0,2,0,1,7,9,2,0,3,7,7,8,6,9,4,0, +6,0,4,1,4,2,0,2,5,4,0,6,9,9,1,1,8,7,5,0,3,3,8,6,1,1,3,1,9,2,4,6,2,5,6,6,8,4,6,1,3,0,7,1,3,3,0,3,3,2,7,4,6,0,6,7,7,7,0,4,9,4,9,4, +1,9,5,5,4,5,7,7,2,4,9,4,6,0,3,5,2,6,8,0,3,0,5,5,1,6,9,2,6,9,7,3,8,0,6,1,0,0,4,4,2,3,3,7,8,1,7,4,7,0,9,2,1,4,2,7,0,3,0,7,7,7,4,0, +5,0,9,9,7,4,0,5,7,3,7,5,2,4,4,9,5,4,5,7,5,1,2,1,3,8,8,5,1,6,6,3,9,8,1,1,9,4,7,9,8,8,4,5,0,9,5,3,0,3,5,7,4,2,5,5,2,9,9,7,7,9,2,3, +4,9,9,2,5,3,1,7,6,2,5,2,5,9,3,1,1,9,0,3,1,1,2,5,0,7,6,0,4,0,0,5,5,9,8,4,1,0,9,8,9,7,1,5,8,5,7,1,1,3,7,1,3,4,7,8,7,8,8,5,2,7,5,5, +0,9,7,2,6,8,5,7,0,3,6,9,1,2,5,7,7,2,9,6,6,9,7,1,0,6,6,4,3,3,7,1,8,0,7,2,8,9,2,1,0,1,7,9,5,7,6,8,5,4,0,1,7,9,8,9,0,5,4,9,8,5,5,9, +9,9,3,4,5,3,7,5,7,3,3,2,1,5,7,5,0,8,4,5,8,9,4,3,9,8,2,6,3,9,3,1,3,6,5,3,9,0,8,4,5,5,5,9,4,0,9,6,0,4,4,6,2,5,8,2,0,9,0,0,0,0,7,9, +4,9,3,6,2,7,0,5,9,6,9,4,8,6,2,1,9,0,2,2,6,9,5,0,5,8,7,6,3,8,6,9,8,9,8,2,8,2,9,4,2,7,2,6,6,9,0,1,9,8,9,0,0,5,3,5,8,7,9,1,4,9,8,1, +3,5,1,8,4,8,7,4,0,4,9,8,0,8,6,7,0,7,9,1,6,6,4,8,2,0,8,9,7,8,9,0,1,4,2,0,9,4,9,5,3,0,4,0,6,8,2,0,3,9,7,4,8,3,4,9,4,6,9,6,2,9,9,6, +5,2,1,9,2,2,6,4,4,3,4,4,6,0,2,9,0,8,4,6,3,4,1,6,6,5,4,4,5,0,0,3,4,4,1,1,4,9,8,0,1,6,2,6,1,3,7,3,4,1,5,9,0,1,9,2,7,3,6,7,1,4,7,7, +7,7,9,0,8,0,2,4,2,3,7,5,7,4,2,0,8,8,3,7,1,4,7,2,7,9,4,3,0,8,1,6,9,8,6,0,3,4,7,8,8,6,7,1,7,9,9,9,6,0,3,9,4,8,8,3,8,9,5,0,4,4,4,7, +7,8,3,4,5,8,1,6,7,5,2,0,9,5,9,7,1,8,6,4,4,9,3,8,6,2,8,3,0,7,6,5,9,6,5,8,0,9,8,7,4,4,1,1,8,7,8,7,2,2,8,8,3,1,9,2,2,5,8,6,3,3,7,8, +1,3,6,6,2,8,8,1,2,5,2,4,8,3,8,5,0,8,4,9,9,3,4,4,3,6,6,7,3,3,8,5,0,9,6,9,0,2,5,8,9,3,1,0,8,8,4,4,3,5,9,8,6,1,2,0,9,4,2,9,4,0,0,1, +8,1,7,6,0,2,2,7,6,0,1,7,6,9,0,9,7,8,4,9,6,2,4,3,3,8,8,8,5,6,3,2,2,7,1,7,8,6,6,1,4,0,8,3,5,0,0,3,5,2,3,4,2,4,9,2,1,0,4,3,3,2,0,5, +3,8,0,3,8,6,8,3,8,8,7,2,5,4,6,5,5,8,2,8,8,1,4,0,8,9,3,2,0,9,7,2,9,4,6,2,5,0,2,5,9,1,7,7,9,9,4,5,3,7,6,3,3,9,4,8,5,4,6,4,0,8,8,2, +0,0,8,9,8,3,3,9,7,2,6,9,2,9,4,6,8,3,8,7,7,6,4,7,8,5,8,6,1,3,0,2,2,9,4,8,0,1,3,6,4,2,9,2,1,4,7,0,3,8,5,6,6,1,6,2,0,0,2,4,1,4,4,4, +6,8,7,2,1,9,3,3,8,5,8,2,7,5,9,8,5,6,5,9,8,6,3,2,7,1,1,2,7,6,7,1,1,6,8,5,0,8,4,4,3,6,8,1,7,6,0,9,2,6,0,2,2,8,6,2,6,9,7,3,3,3,5,4, +6,0,5,0,9,4,5,1,9,8,1,4,5,7,2,2,9,0,3,7,3,2,9,2,6,5,3,7,2,6,1,3,1,5,7,1,4,6,0,6,4,9,1,5,0,1,8,0,5,9,8,5,2,1,0,7,3,2,5,8,1,7,5,3, +0,5,8,3,4,8,3,3,6,1,2,9,6,8,3,6,6,9,8,1,5,2,0,9,6,7,1,7,6,3,0,9,0,3,5,6,2,4,2,8,2,7,5,7,6,5,2,2,0,2,8,9,3,6,7,6,1,5,2,9,0,1,7,5, +9,0,0,5,5,8,3,0,9,7,6,8,5,7,2,4,9,8,2,2,8,3,1,6,5,1,8,6,2,0,8,5,5,8,0,3,1,8,0,0,6,8,4,1,4,1,5,0,0,9,0,0,2,2,3,3,1,8,6,6,3,7,1,3, +6,6,0,9,4,8,7,5,0,3,1,4,0,1,1,2,8,7,4,4,8,3,1,1,6,3,7,9,2,0,8,9,6,5,8,7,0,8,8,6,3,4,9,1,5,0,9,8,8,2,0,4,2,5,7,0,7,5,1,6,5,8,6,9, +9,6,7,5,2,9,9,1,7,1,0,4,4,9,5,8,9,3,2,8,4,0,7,3,5,8,2,6,2,1,7,0,5,0,1,9,3,2,7,7,4,1,6,4,9,6,3,5,6,8,2,5,3,9,1,5,3,2,7,1,9,1,2,8, +1,0,7,9,9,1,7,7,0,5,6,8,6,8,7,4,9,6,3,7,9,3,2,5,2,4,6,7,8,9,7,5,6,9,7,4,3,7,0,1,7,1,1,7,8,4,9,8,7,1,0,2,6,8,4,9,1,9,1,3,9,7,4,5, +1,9,7,9,0,0,4,3,2,4,4,8,0,6,1,8,8,2,0,9,0,7,0,5,4,8,9,8,7,7,8,5,9,2,6,2,2,9,6,7,1,1,1,7,7,4,3,0,8,5,5,0,1,1,0,9,3,8,3,0,9,3,8,7, +4,7,5,5,2,4,5,1,3,4,6,7,7,4,3,0,7,7,8,4,0,3,4,9,0,4,6,6,4,3,9,5,5,5,2,6,2,1,8,0,8,5,0,8,2,5,7,2,6,4,3,4,7,4,3,5,0,0,1,3,0,6,7,4, +1,7,8,7,4,6,1,9,2,1,3,1,4,5,8,6,8,0,2,8,8,7,6,5,5,4,3,7,0,0,3,6,7,8,2,4,0,0,7,0,8,0,8,7,1,2,1,5,4,0,6,9,4,6,0,4,0,6,6,4,6,2,3,8, +3,2,5,5,6,6,0,8,2,5,8,5,8,9,8,6,6,2,5,0,4,4,5,9,6,3,9,5,7,6,1,6,2,6,5,8,2,2,4,1,0,6,2,1,9,7,9,5,9,7,8,3,1,2,1,0,7,5,4,4,6,4,5,8, +1,4,1,3,8,8,1,0,5,0,2,4,8,3,4,0,7,0,0,9,6,6,0,3,8,3,2,8,2,3,5,5,4,9,5,3,7,9,8,6,6,3,4,6,7,7,3,1,1,5,4,2,0,9,5,1,4,5,4,0,8,2,4,8, +5,4,4,9,9,1,0,6,9,8,4,6,0,3,8,9,4,9,5,6,2,7,0,5,7,8,0,3,7,0,1,3,1,4,7,4,7,6,3,4,7,2,4,8,9,2,4,1,7,1,9,9,5,5,4,0,5,4,5,8,6,8,1,2, +9,0,0,2,7,4,2,1,3,1,7,3,6,2,5,9,3,8,5,5,8,8,2,9,3,5,2,6,9,3,0,4,3,7,8,3,7,2,6,5,8,2,9,7,1,1,9,0,8,5,8,0,1,3,1,5,9,8,1,9,1,9,2,9, +6,7,5,6,2,5,7,6,0,9,5,7,4,3,0,6,1,8,7,9,5,7,2,8,1,5,4,3,4,7,4,7,5,0,0,4,2,8,0,2,9,9,5,1,7,3,0,7,3,3,3,0,9,7,6,8,5,6,0,2,1,5,3,5, +7,7,8,2,6,6,6,8,2,9,8,3,7,5,7,9,2,1,4,8,0,4,7,6,1,7,1,0,8,3,5,7,9,1,0,9,5,9,6,6,7,1,8,1,5,6,9,6,0,1,2,9,9,7,8,2,5,8,6,1,5,2,9,3, +1,7,5,1,6,1,4,2,8,5,1,7,0,3,0,4,1,3,2,8,0,3,6,1,8,9,4,1,7,1,2,0,3,8,7,8,1,6,9,6,5,7,6,3,3,3,9,8,2,1,0,6,6,2,4,2,5,0,8,2,6,4,6,3, +2,6,1,2,4,1,3,3,9,5,8,6,2,1,4,7,7,3,1,6,4,3,2,5,8,9,9,6,5,0,0,3,1,1,4,2,7,6,4,8,9,8,1,5,6,7,0,3,3,6,4,8,8,8,8,9,3,8,3,5,5,4,4,5, +2,3,0,1,6,0,0,1,6,3,0,9,6,8,9,5,1,4,0,7,0,5,5,2,2,8,5,1,8,2,9,9,1,9,4,5,9,6,6,5,9,2,7,6,4,4,5,2,9,5,4,6,8,4,0,7,6,1,5,3,0,9,5,1, +2,5,4,4,4,8,2,8,8,6,6,9,6,4,1,7,7,8,1,6,8,7,9,4,2,4,1,4,2,0,5,8,8,9,6,9,7,6,1,0,9,7,1,5,2,0,7,7,3,4,5,1,0,7,3,1,5,4,4,9,6,1,0,8, +2,6,8,2,6,9,8,4,3,6,5,9,8,0,0,6,7,1,8,4,0,1,8,1,2,8,2,2,2,8,1,6,1,5,9,8,9,5,6,3,2,1,4,2,9,3,2,0,9,6,8,8,3,3,7,6,7,0,0,4,8,4,0,6, +9,8,0,2,7,2,8,4,0,6,1,8,3,9,8,4,0,0,6,3,0,5,9,8,0,6,8,5,1,9,7,5,4,8,5,5,1,4,3,2,4,5,5,0,5,5,3,8,0,2,5,2,1,3,1,6,1,6,8,2,8,4,1,3, +1,0,1,5,5,2,9,9,4,1,0,0,3,6,4,0,8,5,0,6,2,9,4,5,6,2,8,8,5,5,6,0,7,4,6,3,6,9,6,1,4,3,5,4,0,3,2,6,6,5,8,1,5,7,3,0,4,5,4,8,0,0,5,4, +5,7,1,4,4,4,2,7,3,2,7,7,8,6,5,1,1,0,3,1,4,6,7,3,7,1,6,3,7,5,6,6,8,4,9,1,2,7,3,0,2,8,8,3,9,3,7,2,8,5,0,9,4,5,1,3,4,6,6,8,6,9,7,7, +1,4,8,6,7,9,7,5,6,7,4,2,0,5,4,8,2,2,4,3,4,2,3,7,2,0,4,9,6,9,1,2,6,3,2,0,4,9,9,4,9,7,7,8,4,3,4,7,8,4,9,1,9,3,1,3,4,2,5,6,2,2,8,6, +3,5,9,4,5,9,7,1,6,7,7,3,1,9,3,2,8,5,7,7,8,1,7,7,0,0,2,3,7,3,6,8,6,3,7,6,6,3,6,0,1,9,9,3,0,9,2,2,3,0,2,6,3,3,2,8,5,6,2,6,9,6,7,0, +6,5,6,4,9,5,8,1,4,2,1,7,0,7,2,9,7,7,3,8,3,2,3,7,0,0,2,7,6,7,0,6,6,8,4,9,8,5,6,3,4,4,7,0,6,6,8,2,0,4,8,2,4,2,6,0,9,7,0,9,5,2,4,1, +4,5,1,2,4,3,7,7,9,5,0,7,3,2,0,8,4,1,6,5,9,8,8,1,2,3,4,0,2,4,0,3,2,6,1,0,9,2,2,3,4,0,7,3,3,0,4,7,7,1,2,9,7,8,5,5,6,3,4,1,8,9,3,5, +1,2,9,2,1,6,5,1,5,7,5,0,2,6,5,7,6,6,8,9,1,8,3,3,6,8,2,3,0,7,8,0,9,9,8,9,7,6,1,8,8,3,7,5,5,7,6,5,5,9,0,8,6,3,1,9,5,6,2,3,4,9,2,7, +5,1,9,8,5,2,6,7,8,7,1,2,1,1,6,8,0,0,1,0,4,3,1,8,3,4,1,8,4,7,3,3,0,3,6,7,7,5,6,3,0,7,6,7,9,3,9,4,1,9,1,2,1,8,8,9,6,6,1,0,8,9,8,6, +9,4,9,5,4,3,6,1,2,9,8,6,9,1,4,4,6,0,3,6,4,6,5,0,4,2,0,1,6,8,2,6,4,6,5,5,6,8,6,8,8,2,9,9,2,9,7,4,9,3,1,3,2,1,2,2,5,8,2,2,4,2,7,0, +5,1,3,4,8,7,2,7,3,2,1,4,0,0,4,8,5,6,6,7,9,0,7,6,0,8,1,2,3,0,5,9,1,3,6,1,8,2,7,1,7,5,9,5,1,9,5,9,1,8,5,0,8,2,9,0,8,1,6,9,1,5,1,8, +4,6,2,3,5,2,7,1,6,9,9,5,2,6,1,3,6,3,3,3,7,6,5,1,4,6,2,3,0,6,0,7,4,6,0,1,9,1,5,3,3,7,3,9,0,2,8,8,8,1,1,9,0,9,7,5,3,8,8,6,7,4,0,9, +7,8,8,4,4,9,3,1,1,5,2,7,5,6,2,2,9,3,0,8,1,7,1,8,5,5,3,0,9,9,6,4,6,0,4,2,3,6,2,8,4,8,4,9,9,6,1,0,0,0,6,1,9,7,7,2,8,4,7,8,4,4,6,2, +2,4,9,4,4,3,2,9,1,4,5,2,2,4,1,9,0,0,8,0,1,5,8,5,9,0,8,3,7,8,3,3,2,1,9,5,6,0,7,6,2,1,8,4,4,4,3,2,9,3,2,8,4,1,6,3,6,2,1,4,3,0,0,5, +9,4,8,3,1,9,6,4,0,9,7,7,6,3,9,4,0,3,2,2,1,9,0,6,5,2,0,7,8,3,3,4,6,0,6,0,0,5,7,8,3,4,6,5,8,2,7,8,9,7,9,0,8,1,9,8,5,7,4,4,9,8,5,7, +3,3,3,1,4,2,9,1,7,3,7,7,9,2,7,3,1,8,6,3,6,2,0,2,0,7,6,9,6,1,9,6,2,3,7,0,1,6,7,0,0,5,8,1,0,2,2,5,8,3,3,4,1,6,8,9,3,8,0,9,2,1,6,6, +0,7,1,3,6,0,7,0,3,9,4,1,5,2,6,3,7,6,1,3,8,4,6,3,3,4,6,6,0,6,5,6,3,6,9,4,4,0,0,8,0,5,3,7,4,0,9,4,2,2,9,1,8,7,5,3,8,6,1,9,9,8,9,0, +4,8,3,0,7,6,1,6,3,7,6,5,0,1,3,4,7,3,7,0,7,8,2,8,4,0,3,3,3,2,6,3,9,1,2,6,5,6,1,7,2,8,8,5,8,0,1,4,3,8,4,4,5,6,3,4,2,9,1,7,4,0,4,5, +8,4,8,6,5,5,1,2,2,9,9,2,4,7,0,1,1,8,6,2,9,1,7,0,8,9,3,2,6,9,1,4,6,6,2,8,1,6,7,3,0,7,7,4,3,9,3,5,6,5,6,5,8,9,5,3,1,0,9,5,4,6,7,6, +7,8,3,7,7,2,5,3,4,1,7,3,8,0,0,5,2,3,6,4,5,2,0,3,3,3,1,2,6,1,1,1,4,7,6,0,4,9,1,2,8,5,0,3,3,2,5,0,1,4,5,9,0,3,6,8,2,2,4,1,2,3,7,3, +9,5,2,1,0,7,2,1,3,5,2,3,0,5,6,2,2,9,0,4,1,6,5,3,0,4,8,2,2,1,2,1,2,2,1,7,7,2,0,3,4,7,3,6,8,0,9,0,0,8,3,2,0,4,6,7,9,6,0,1,7,1,7,6, +}; + +const int32_t C[] = { +1223,1282,1286,1163,1319,1270,1192,1100,1142,1261,1291,1367,1260,1311,985,1232,1313,1316,1148,1320,1277,1275,1145,1199,1157,1203,1225,1211,1177,1281,1164,1239,1209,1454,1377,1145,1189,1335,1306,1108,1302,1233,1421,1194,1339,1065,1322,1063,1169,979,1109,1155,976,1341,1258,1173,1250,1486,1204,1322,1273,1303,1130,1377, +1184,1267,1312,1237,1443,1455,1188,1232,1260,1222,1312,1451,1244,1331,1078,1464,1396,1375,1279,1437,1466,1272,1208,1262,1248,1352,1314,1335,1209,1309,1263,1277,1264,1509,1546,1222,1369,1428,1334,1090,1392,1323,1378,1303,1411,1190,1443,1195,1305,1244,1177,1218,1132,1317,1370,1300,1356,1338,1210,1421,1310,1349,1236,1435, +1162,1146,1395,1317,1216,1378,1119,1124,1091,1251,1202,1479,1236,1287,1005,1364,1472,1348,1223,1445,1362,1273,1148,1252,1226,1323,1226,1294,1205,1235,1192,1299,1135,1351,1441,1303,1192,1422,1313,1142,1138,1213,1390,1262,1400,1148,1242,1149,1390,1197,1230,1127,1164,1269,1347,1231,1377,1294,1109,1386,1400,1285,1202,1375, +1085,1269,1161,1032,1288,1306,1093,1075,1208,1217,1133,1354,1087,1180,994,1148,1230,1282,1151,1255,1213,1176,1122,1190,1027,1230,1284,1184,1022,1073,1237,1162,1222,1300,1273,1038,1101,1271,1263,1053,1266,1276,1277,1185,1288,1092,1256,1066,1070,1100,1139,1110,1041,1201,1214,1307,1153,1334,1146,1282,1220,1292,1202,1281, +953,1262,1262,1113,1165,1134,1165,1034,1155,1150,1092,1340,1127,1129,991,1264,1190,1241,1146,1305,1178,1086,1038,1146,925,1348,1187,1146,1084,1170,1147,1201,1109,1331,1327,1101,1191,1195,1240,1088,1269,1097,1275,1367,1394,1097,1289,1092,1121,1008,1014,1078,1185,1328,1277,1274,1192,1304,1097,1331,1288,1287,1139,1227, +1201,1282,1518,1325,1281,1510,1265,1336,1105,1327,1407,1443,1225,1295,1066,1483,1340,1349,1354,1403,1371,1315,1151,1265,1189,1335,1343,1363,1137,1399,1248,1254,1465,1378,1333,1240,1131,1468,1371,1139,1253,1175,1496,1213,1473,1246,1402,1272,1330,1226,1126,1186,1212,1376,1462,1329,1229,1447,1227,1339,1347,1301,1240,1524, +1377,1419,1524,1328,1441,1503,1332,1263,1372,1402,1486,1771,1459,1449,1219,1424,1629,1493,1295,1539,1427,1451,1453,1399,1276,1583,1497,1480,1279,1354,1389,1403,1376,1571,1552,1346,1348,1654,1440,1173,1324,1504,1554,1499,1542,1332,1499,1277,1431,1402,1203,1382,1206,1560,1479,1448,1313,1516,1372,1582,1508,1404,1374,1553, +1180,1190,1170,1150,1253,1280,1261,1120,1132,1291,1259,1295,1148,1178,936,1279,1199,1307,1136,1266,1352,1219,1137,1104,1051,1323,1299,1210,1202,1416,1149,1190,1192,1345,1331,1059,1264,1186,1238,1078,1212,1136,1433,1338,1238,1081,1314,980,1253,1209,1241,996,1074,1264,1301,1235,1360,1275,1076,1355,1130,1254,1272,1195, +1159,1328,1348,1187,1256,1466,1220,1187,1064,1249,1357,1457,1216,1173,1179,1494,1289,1263,1350,1375,1310,1373,1248,1356,1142,1296,1226,1265,1158,1135,1179,1185,1210,1338,1376,1222,1213,1348,1378,1129,1272,1097,1444,1236,1363,1248,1324,1170,1316,1302,1266,1319,1195,1216,1356,1352,1313,1320,1173,1359,1298,1234,1253,1485, +1134,1192,1510,1136,1287,1364,1271,1096,1336,1308,1148,1414,1194,1245,1032,1431,1381,1276,1130,1384,1336,1264,1240,1175,1239,1336,1183,1249,1064,1289,1208,1102,1247,1302,1428,1224,1265,1470,1235,1161,1156,1305,1444,1343,1369,1177,1340,1132,1237,1177,1092,1239,1110,1324,1379,1318,1259,1278,1188,1466,1312,1262,1205,1355, +1266,1520,1489,1292,1362,1379,1379,1383,1309,1375,1416,1341,1262,1346,1139,1468,1367,1283,1245,1376,1341,1328,1405,1194,1162,1568,1256,1316,1109,1523,1281,1251,1550,1493,1500,1225,1303,1342,1463,1098,1279,1224,1440,1471,1384,1199,1433,1338,1395,1243,1313,1311,1093,1536,1311,1466,1223,1480,1327,1313,1491,1332,1396,1461, +1324,1267,1330,1251,1403,1288,1188,1214,1312,1302,1313,1591,1341,1331,1203,1456,1421,1408,1342,1529,1301,1337,1204,1372,1206,1499,1416,1278,1280,1291,1305,1313,1258,1588,1452,1262,1314,1473,1316,1285,1467,1271,1521,1386,1488,1250,1570,1182,1258,1285,1140,1369,1305,1405,1438,1359,1400,1532,1314,1458,1338,1451,1351,1364, +1508,1591,1551,1501,1560,1630,1454,1467,1378,1516,1488,1608,1383,1444,1297,1613,1483,1759,1421,1635,1655,1449,1270,1550,1260,1637,1451,1499,1405,1380,1486,1452,1522,1566,1612,1445,1283,1683,1534,1209,1565,1462,1665,1582,1626,1309,1625,1376,1302,1344,1358,1280,1260,1595,1679,1500,1399,1654,1363,1613,1365,1399,1545,1702, +1128,1402,1315,1329,1340,1389,1269,1399,1237,1236,1196,1382,1177,1206,1166,1486,1421,1321,1176,1538,1402,1373,1244,1194,1180,1494,1352,1365,1053,1302,1324,1224,1425,1421,1437,1106,1273,1479,1411,1069,1432,1156,1353,1414,1474,1224,1352,1368,1351,1155,1216,1164,1160,1468,1376,1301,1283,1407,1340,1365,1333,1314,1222,1562, +990,1242,1037,945,1056,1066,1122,1041,1072,1106,1025,1176,971,1006,867,1205,1076,1045,1000,1134,1225,1119,1020,1013,914,1099,1048,1067,931,982,1033,1069,1108,1191,1107,972,1094,1217,1063,856,1183,1130,1222,1157,1123,796,1215,1122,1048,969,815,1089,996,1210,1176,1192,1055,1217,1003,1157,1077,1052,1133,1251, +1284,1200,1269,1326,1294,1339,1278,1318,1181,1223,1209,1465,1143,1136,1127,1486,1193,1233,1248,1465,1402,1356,1180,1231,1176,1432,1200,1408,1160,1184,1267,1200,1191,1474,1389,1208,1165,1362,1425,1053,1281,1076,1472,1331,1252,1040,1517,1310,1238,1248,1084,1152,967,1341,1425,1250,1309,1399,1241,1257,1382,1239,1175,1577, +1157,1371,1479,1324,1290,1274,1173,1187,1301,1333,1326,1392,1165,1215,985,1438,1376,1284,1211,1396,1195,1319,1162,1383,1117,1438,1185,1208,1183,1294,1112,1369,1307,1449,1440,1203,1413,1294,1443,1230,1321,1264,1402,1575,1427,1266,1471,1020,1234,1245,1201,1196,1241,1327,1444,1219,1381,1343,1251,1407,1293,1369,1284,1303, +1316,1298,1260,1190,1373,1338,1219,1183,1240,1283,1256,1493,1236,1335,1122,1382,1292,1488,1302,1486,1338,1254,1162,1173,1297,1483,1244,1220,1166,1161,1344,1272,1290,1480,1411,1317,1103,1441,1318,1080,1426,1259,1527,1254,1328,1124,1486,1371,1274,1181,1027,1319,1105,1419,1442,1367,1249,1373,1263,1297,1258,1317,1227,1527, +1421,1598,1719,1432,1649,1684,1592,1420,1513,1671,1607,1690,1512,1581,1246,1737,1578,1567,1514,1660,1608,1495,1644,1490,1460,1731,1507,1492,1354,1732,1465,1436,1612,1657,1650,1527,1527,1676,1606,1398,1527,1522,1674,1585,1600,1498,1731,1449,1478,1458,1463,1573,1379,1600,1567,1585,1439,1563,1439,1575,1620,1505,1612,1670, +1491,1497,1680,1447,1639,1595,1469,1385,1371,1551,1666,1664,1403,1545,1403,1621,1512,1657,1560,1631,1536,1573,1433,1514,1314,1649,1409,1603,1415,1605,1462,1469,1523,1675,1690,1356,1478,1533,1601,1331,1565,1380,1688,1687,1424,1429,1693,1375,1481,1428,1447,1426,1364,1620,1623,1724,1355,1714,1367,1620,1474,1547,1523,1614, +1090,1249,1258,1115,1331,1239,1173,1167,1179,1179,1203,1371,1159,1269,1009,1150,1245,1181,1104,1338,1191,1301,1036,1221,1125,1263,1207,1256,1169,1232,1197,1194,1278,1346,1321,997,1116,1309,1316,1143,1253,1186,1246,1267,1269,1089,1401,1067,1059,1099,1098,1109,1089,1309,1330,1325,1136,1422,1227,1181,1224,1284,1296,1325, +1083,1217,1287,1048,1226,1301,1124,1133,1146,1134,1156,1229,1271,1223,1073,1232,1203,1169,1079,1252,1233,1235,1179,1147,1137,1240,1198,1207,1135,1142,1101,1184,1170,1434,1480,1202,1022,1193,1354,1134,1161,1055,1393,1101,1390,1119,1408,1067,1225,1142,1141,1134,982,1215,1252,1163,1391,1336,1110,1216,1293,1274,1213,1374, +1176,1248,1367,1209,1350,1327,1126,1169,1186,1257,1147,1409,1134,1158,1140,1539,1249,1262,1208,1267,1171,1228,1130,1483,1033,1346,1135,1305,1283,1225,1075,1250,1112,1364,1485,1199,1257,1356,1297,1102,1262,1223,1307,1367,1397,1109,1360,1064,1102,1259,1421,1132,1150,1122,1323,1293,1342,1352,1120,1478,1299,1183,1290,1328, +1358,1196,1378,1279,1255,1332,1182,1268,1170,1229,1412,1412,1192,1322,1065,1309,1291,1437,1206,1262,1288,1387,1202,1326,1237,1347,1386,1400,1304,1272,1176,1260,1337,1353,1438,1130,1291,1371,1493,1071,1218,1283,1566,1423,1335,1169,1460,1183,1396,1247,1090,1229,1152,1443,1453,1404,1296,1502,1227,1393,1356,1435,1306,1545, +970,1102,1135,1132,1034,1115,1110,1029,968,1150,1057,1154,1067,1083,1050,1148,1048,1194,1057,1091,1223,1172,1002,1175,842,1109,1236,1167,1003,1080,1207,1133,1084,1245,1215,1080,1015,1208,1115,949,1090,1113,1203,1106,1225,993,1243,1012,1082,1110,1004,989,1072,1076,1100,1213,1163,1220,937,1160,1132,1206,1271,1157, +1280,1299,1484,1423,1264,1417,1198,1259,1318,1303,1342,1413,1185,1310,1112,1504,1318,1388,1303,1392,1330,1217,1124,1375,1184,1439,1286,1431,1277,1300,1269,1324,1198,1410,1436,1153,1171,1297,1529,1139,1252,1276,1397,1376,1339,1280,1301,1146,1227,1303,1277,1239,1122,1313,1444,1336,1289,1461,1322,1437,1257,1302,1310,1431, +1213,1324,1265,1154,1335,1331,1249,1177,1102,1299,1174,1296,1159,1095,1117,1293,1148,1228,1118,1345,1221,1292,1112,1155,1161,1335,1152,1185,1161,1244,1133,1151,1287,1381,1380,1096,1145,1420,1294,1142,1364,1169,1359,1304,1370,1133,1458,1201,1186,1127,1257,1200,1028,1197,1323,1221,1332,1368,1115,1191,1290,1125,1327,1335, +1100,1107,1206,1076,1070,1217,1152,1037,976,1124,1102,1303,1049,1040,882,1175,1105,1061,1042,1170,1089,1200,1062,1149,1001,1083,1126,1249,1103,1233,1170,1129,1187,1130,1274,933,1092,1276,1166,982,1200,1136,1238,1307,1227,953,1190,1037,1182,1145,936,850,1108,1180,1121,1178,1162,1225,1059,1234,1170,1117,1057,1164, +1304,1421,1468,1398,1297,1510,1405,1379,1285,1250,1266,1486,1317,1492,1127,1487,1396,1510,1326,1485,1468,1341,1380,1525,1189,1391,1401,1442,1377,1416,1318,1342,1377,1510,1619,1288,1212,1407,1511,1086,1297,1355,1607,1403,1533,1261,1387,1344,1291,1234,1317,1152,1280,1513,1394,1379,1461,1464,1440,1650,1456,1457,1417,1467, +1311,1229,1205,1189,1294,1243,1263,1098,1123,1304,1394,1277,1192,1149,1133,1228,1157,1342,1180,1163,1268,1249,1113,1244,1099,1237,1215,1302,1102,1304,1141,1175,1185,1392,1483,1056,1062,1223,1203,1080,1165,1221,1384,1235,1295,1041,1492,1081,1176,1246,1169,1099,897,1234,1279,1242,1253,1482,1052,1325,1231,1235,1262,1267, +1040,1219,1342,1241,1334,1251,1081,1293,1204,1209,1230,1364,1124,1250,975,1353,1284,1270,1159,1251,1291,1236,1125,1121,1154,1273,1190,1220,1133,1240,1114,1134,1208,1417,1376,1149,1219,1342,1313,1052,1175,1109,1288,1249,1294,1029,1356,1157,1294,1130,1236,1131,1045,1275,1329,1190,1158,1222,1145,1239,1212,1243,1217,1354, +1330,1514,1426,1478,1427,1534,1396,1449,1113,1412,1455,1612,1408,1417,1252,1604,1356,1498,1443,1472,1434,1509,1309,1542,1292,1482,1586,1417,1344,1534,1440,1396,1500,1590,1601,1427,1239,1447,1447,1338,1503,1249,1509,1459,1763,1201,1585,1278,1501,1317,1409,1322,1357,1424,1436,1494,1504,1462,1386,1541,1526,1580,1334,1504, +1483,1510,1662,1516,1472,1567,1511,1383,1427,1441,1486,1693,1423,1445,1277,1653,1566,1564,1252,1712,1527,1504,1368,1474,1343,1638,1479,1562,1473,1475,1400,1462,1536,1550,1565,1394,1529,1659,1619,1351,1574,1540,1647,1672,1703,1358,1640,1358,1459,1364,1329,1423,1398,1645,1623,1495,1576,1619,1410,1576,1638,1504,1511,1513, +1378,1291,1411,1401,1335,1462,1228,1371,1250,1265,1322,1481,1251,1293,1165,1519,1344,1376,1263,1528,1354,1316,1168,1275,1161,1352,1151,1340,1317,1165,1286,1229,1292,1526,1369,1343,1357,1465,1506,1065,1534,1125,1546,1396,1442,1091,1466,1272,1352,1308,1147,1242,1180,1487,1382,1336,1331,1464,1227,1231,1398,1345,1305,1532, +1346,1268,1352,1280,1401,1465,1207,1261,1254,1325,1211,1445,1266,1284,1084,1275,1388,1362,1081,1393,1339,1344,1202,1257,1253,1346,1235,1335,1205,1225,1189,1267,1311,1467,1462,1328,1183,1386,1372,1146,1313,1354,1377,1324,1560,1051,1474,1183,1329,1275,1320,1132,1053,1471,1323,1273,1426,1453,1205,1349,1508,1382,1197,1463, +1022,1187,1170,1044,1151,1246,1027,1219,1050,1128,1098,1206,1071,1097,1007,1357,1094,1118,1119,1173,1158,1171,1093,1157,1052,1307,1048,1041,1028,1172,1076,1129,1159,1224,1297,1159,1100,1159,1144,1040,1137,1017,1259,1165,1290,1100,1200,1175,1063,1165,1072,1022,1080,1204,1242,1138,1170,1136,1153,1163,1132,1100,1126,1205, +1228,1387,1427,1403,1300,1425,1408,1294,1135,1292,1385,1536,1215,1375,1090,1372,1493,1488,1375,1443,1291,1323,1196,1449,1011,1387,1405,1524,1237,1315,1375,1284,1439,1430,1453,1275,1203,1455,1334,1082,1336,1212,1446,1398,1447,1109,1415,1167,1347,1258,1260,1182,1166,1460,1312,1474,1164,1448,1142,1484,1380,1336,1312,1462, +1229,1355,1264,1183,1314,1315,1133,1150,1185,1272,1267,1278,1256,1081,1103,1341,1182,1357,1212,1377,1320,1300,1159,1211,1155,1350,1139,1159,1123,1117,1120,1224,1267,1341,1296,1181,1190,1433,1408,1056,1392,1231,1416,1354,1320,1066,1387,1219,1231,1083,1171,1302,1194,1261,1386,1159,1144,1254,1142,1345,1164,1230,1272,1376, +1402,1490,1593,1472,1540,1586,1420,1415,1467,1578,1512,1550,1450,1479,1264,1497,1579,1482,1403,1634,1640,1530,1355,1386,1494,1515,1378,1446,1330,1336,1452,1408,1570,1617,1621,1422,1320,1645,1575,1282,1514,1496,1689,1515,1551,1392,1592,1417,1496,1390,1331,1436,1293,1555,1537,1461,1428,1662,1461,1603,1505,1478,1485,1641, +1190,1351,1391,1151,1359,1261,1272,1151,1193,1410,1220,1442,1176,1321,1145,1331,1298,1288,1138,1432,1265,1303,1234,1344,1097,1368,1299,1257,1225,1254,1342,1328,1216,1474,1431,1321,1194,1382,1412,1126,1384,1312,1382,1311,1391,1184,1442,1234,1173,1217,1092,1163,1187,1294,1353,1395,1298,1525,1167,1290,1331,1287,1237,1428, +1304,1416,1446,1406,1444,1463,1304,1344,1205,1344,1408,1391,1263,1330,1190,1426,1445,1377,1141,1490,1381,1376,1240,1404,1244,1378,1310,1436,1337,1454,1351,1288,1410,1408,1562,1208,1295,1477,1469,1192,1434,1246,1467,1463,1576,1277,1378,1198,1375,1277,1300,1163,1179,1544,1309,1334,1374,1525,1258,1383,1395,1343,1357,1443, +1337,1425,1424,1300,1416,1506,1314,1263,1283,1442,1345,1599,1210,1381,1185,1491,1360,1514,1366,1549,1449,1436,1297,1274,1278,1592,1432,1358,1241,1418,1492,1221,1363,1523,1521,1200,1309,1466,1375,1285,1432,1284,1492,1419,1474,1272,1567,1251,1258,1427,1298,1269,1276,1309,1573,1506,1367,1432,1366,1467,1307,1432,1391,1526, +1245,1479,1359,1192,1393,1455,1247,1338,1192,1281,1363,1339,1314,1433,1229,1360,1377,1332,1284,1331,1385,1395,1346,1348,1263,1295,1340,1301,1159,1368,1222,1257,1361,1454,1507,1271,1256,1206,1537,1251,1334,1178,1573,1343,1532,1225,1547,1291,1358,1286,1343,1219,1201,1442,1395,1281,1329,1515,1276,1401,1372,1362,1373,1679, +1088,1321,1295,1136,1190,1421,1235,1158,1223,1093,1118,1345,1176,1361,1049,1237,1373,1226,1196,1435,1316,1245,1186,1244,1044,1246,1207,1342,1137,1222,1302,1160,1238,1386,1398,1125,1219,1352,1315,976,1279,1157,1435,1272,1340,1212,1151,1148,1147,1207,1109,1078,1104,1456,1245,1357,1238,1354,1232,1349,1244,1180,1291,1399, +1233,1346,1483,1244,1296,1440,1206,1207,1228,1387,1335,1338,1222,1302,1034,1380,1488,1306,1266,1492,1447,1316,1269,1265,1181,1368,1261,1244,1149,1343,1204,1310,1313,1503,1547,1292,1255,1242,1249,1197,1355,1234,1505,1377,1462,1245,1408,1104,1243,1398,1216,1132,1221,1395,1361,1429,1450,1494,1145,1375,1395,1375,1295,1414, +1150,1376,1431,1299,1328,1327,1091,1375,1134,1150,1289,1330,1179,1324,1130,1429,1436,1311,1203,1401,1274,1414,1187,1409,1205,1395,1449,1332,1164,1307,1128,1333,1378,1352,1505,1192,1250,1254,1451,1217,1289,1257,1433,1468,1507,1226,1471,1181,1337,1189,1240,1139,1172,1376,1394,1321,1324,1470,1213,1393,1332,1401,1269,1547, +1086,1274,1427,1184,1336,1347,1301,1288,1076,1234,1239,1313,1176,1249,1188,1370,1234,1309,1243,1253,1244,1162,1137,1358,1024,1365,1262,1301,1150,1258,1228,1221,1250,1336,1448,1214,1060,1271,1290,1135,1225,1045,1454,1293,1480,1147,1399,1131,1121,1131,1116,1150,1134,1318,1381,1327,1183,1343,1102,1294,1311,1241,1247,1276, +1055,1338,1289,1170,1280,1362,1196,1278,1246,1310,1316,1358,1177,1180,1127,1391,1160,1306,1197,1344,1291,1294,1137,1177,1097,1365,1251,1240,1111,1305,1330,1218,1345,1410,1325,1109,1232,1329,1290,1099,1453,1200,1285,1355,1391,1092,1356,1205,1247,1158,1168,1232,1166,1421,1269,1371,1216,1398,1251,1336,1261,1328,1173,1321, +1241,1362,1541,1375,1528,1481,1285,1364,1179,1334,1358,1569,1284,1388,1337,1545,1414,1401,1245,1493,1384,1470,1260,1417,1267,1581,1456,1544,1325,1443,1378,1432,1360,1517,1612,1293,1353,1448,1561,1323,1417,1354,1493,1485,1468,1348,1504,1294,1413,1278,1469,1253,1298,1438,1467,1442,1423,1520,1282,1510,1463,1438,1355,1512, +1191,1405,1548,1192,1355,1385,1281,1306,1116,1400,1443,1404,1205,1296,1223,1375,1174,1249,1177,1294,1233,1342,1279,1290,1032,1370,1345,1204,1249,1404,1243,1196,1357,1300,1416,1119,1227,1290,1448,1139,1231,1347,1457,1401,1401,1252,1517,1270,1319,1150,1263,1046,1187,1352,1436,1425,1350,1436,1271,1350,1371,1359,1370,1384, +1533,1515,1630,1488,1528,1655,1407,1376,1435,1595,1587,1596,1514,1517,1354,1704,1603,1606,1510,1715,1590,1563,1342,1497,1435,1593,1392,1554,1467,1607,1335,1566,1479,1775,1667,1446,1608,1589,1735,1394,1572,1454,1692,1573,1659,1501,1695,1421,1608,1406,1575,1572,1313,1565,1659,1484,1697,1825,1410,1592,1599,1564,1547,1710, +1030,1264,1235,1155,1239,1140,1107,1169,1228,1181,1199,1289,1264,1173,908,1223,1267,1189,1040,1262,1244,1091,1075,1137,1063,1274,1222,1202,1090,1111,969,1306,1205,1427,1291,1148,953,1258,1254,1058,1239,1108,1343,1147,1290,1008,1357,1026,1152,999,1101,1209,994,1239,1195,1079,1115,1298,1073,1232,1165,1155,1254,1254, +1243,1402,1384,1183,1246,1257,1266,1330,1115,1206,1321,1437,1353,1240,1078,1420,1196,1383,1183,1344,1188,1398,1211,1321,1227,1379,1400,1246,1291,1312,1190,1233,1403,1285,1511,1135,1150,1454,1366,1224,1258,1221,1410,1342,1498,1066,1384,1252,1288,1102,1202,1247,1224,1436,1536,1461,1352,1494,1232,1360,1440,1282,1332,1466, +1376,1432,1337,1363,1390,1476,1213,1241,1248,1363,1401,1387,1244,1207,1079,1454,1381,1566,1314,1472,1399,1322,1191,1356,1247,1391,1336,1360,1269,1270,1294,1360,1366,1462,1550,1256,1130,1431,1423,1110,1321,1340,1438,1383,1399,1126,1480,1170,1290,1251,1342,1232,1060,1371,1438,1266,1461,1509,1254,1567,1297,1286,1327,1459, +1238,1391,1654,1282,1535,1583,1349,1371,1349,1438,1396,1503,1400,1483,1352,1670,1451,1452,1393,1511,1507,1553,1343,1431,1373,1456,1367,1364,1333,1462,1290,1251,1432,1511,1557,1338,1462,1445,1472,1429,1484,1300,1658,1546,1579,1316,1561,1295,1411,1270,1516,1399,1360,1430,1484,1458,1469,1569,1336,1635,1471,1468,1405,1548, +1328,1454,1420,1339,1301,1584,1286,1280,1242,1267,1371,1399,1361,1255,1125,1574,1424,1452,1350,1505,1338,1342,1278,1317,1284,1571,1323,1374,1275,1421,1342,1274,1397,1487,1589,1303,1386,1468,1493,1298,1385,1243,1476,1502,1498,1285,1414,1261,1274,1307,1370,1280,1183,1533,1502,1422,1490,1479,1370,1480,1419,1377,1417,1481, +1222,1364,1443,1416,1382,1408,1431,1338,1335,1312,1306,1510,1331,1404,1159,1485,1364,1526,1255,1513,1490,1320,1246,1408,1261,1466,1481,1469,1303,1305,1353,1331,1239,1519,1619,1349,1219,1522,1492,1206,1306,1366,1531,1346,1561,1139,1528,1252,1285,1321,1207,1237,1181,1438,1533,1434,1404,1478,1258,1462,1425,1431,1400,1589, +1207,1377,1473,1278,1359,1422,1204,1284,1197,1383,1316,1329,1130,1287,1145,1371,1422,1446,1296,1427,1422,1393,1162,1300,1248,1385,1149,1205,1164,1347,1224,1188,1328,1362,1530,1244,1269,1378,1281,1228,1304,1222,1561,1470,1516,1302,1417,1272,1254,1233,1184,1200,1226,1510,1500,1344,1353,1468,1197,1424,1285,1343,1358,1503, +1191,1379,1246,1083,1210,1174,1160,1093,1102,1200,1219,1429,1167,1147,923,1368,1318,1166,1231,1362,1215,1256,1084,1156,1002,1320,1218,1141,1110,1254,1116,1175,1212,1297,1225,1082,1283,1247,1229,1081,1218,1143,1336,1235,1273,986,1269,1137,1107,975,1089,1161,1112,1296,1385,1268,1172,1429,1053,1191,1338,1190,1197,1337, +1259,1436,1359,1390,1411,1479,1330,1340,1282,1402,1434,1360,1272,1425,1205,1464,1312,1423,1284,1440,1498,1374,1303,1352,1285,1402,1470,1302,1314,1571,1313,1321,1376,1566,1517,1295,1295,1339,1354,1200,1421,1357,1432,1424,1544,1293,1445,1228,1226,1258,1330,1254,1275,1477,1365,1285,1438,1490,1414,1492,1384,1388,1358,1277, +1203,1315,1492,1177,1365,1245,1219,1234,1241,1305,1174,1385,1160,1270,1017,1348,1315,1297,1118,1263,1216,1289,1330,1083,1083,1391,1298,1197,1140,1290,1254,1276,1399,1398,1534,1247,1368,1413,1429,1207,1287,1267,1412,1361,1376,1170,1480,1240,1385,1103,1117,1211,1131,1291,1320,1385,1357,1369,1198,1306,1478,1417,1300,1326, +1277,1318,1539,1185,1440,1354,1365,1235,1312,1446,1350,1412,1227,1379,1083,1407,1381,1347,1233,1348,1337,1269,1350,1304,1212,1405,1226,1215,1164,1413,1163,1254,1348,1431,1470,1297,1250,1341,1255,1221,1268,1348,1484,1347,1474,1210,1514,1269,1228,1253,1159,1259,1213,1468,1432,1361,1359,1421,1314,1402,1464,1348,1241,1340, +1276,1309,1326,1354,1357,1323,1325,1275,1202,1251,1403,1463,1174,1212,1064,1536,1341,1326,1305,1491,1351,1375,1168,1253,1217,1436,1278,1363,1195,1441,1184,1246,1358,1420,1478,1120,1412,1381,1337,1141,1416,1238,1449,1368,1412,1217,1425,1182,1378,1282,1199,1218,1140,1381,1329,1357,1345,1478,1152,1357,1294,1417,1230,1416, +1071,1204,1308,1204,1446,1269,1175,1132,1209,1188,1315,1368,1169,1283,1042,1331,1380,1409,1113,1452,1307,1186,1166,1205,1120,1335,1265,1279,1207,1236,1194,1144,1336,1483,1401,1154,1251,1352,1293,1073,1423,1138,1343,1257,1280,1237,1323,1077,1118,1105,1228,1177,1158,1301,1205,1194,1234,1343,1162,1376,1295,1242,1234,1213, +}; + +#define MATRIX_SIZE 64 +#endif \ No newline at end of file