From 99ca2d2f147ccddc960aec8712860b58e964d200 Mon Sep 17 00:00:00 2001 From: Xavier Arteaga Date: Fri, 11 Dec 2020 18:02:12 +0100 Subject: [PATCH] Add polar interleaver --- .../srslte/phy/fec/polar/polar_interleaver.h | 67 ++ lib/src/phy/fec/polar/CMakeLists.txt | 1 + lib/src/phy/fec/polar/polar_interleaver.c | 50 + lib/src/phy/fec/polar/test/CMakeLists.txt | 7 +- .../fec/polar/test/polar_interleaver_gold.h | 1042 +++++++++++++++++ .../fec/polar/test/polar_interleaver_test.c | 50 + 6 files changed, 1216 insertions(+), 1 deletion(-) create mode 100644 lib/include/srslte/phy/fec/polar/polar_interleaver.h create mode 100644 lib/src/phy/fec/polar/polar_interleaver.c create mode 100644 lib/src/phy/fec/polar/test/polar_interleaver_gold.h create mode 100644 lib/src/phy/fec/polar/test/polar_interleaver_test.c diff --git a/lib/include/srslte/phy/fec/polar/polar_interleaver.h b/lib/include/srslte/phy/fec/polar/polar_interleaver.h new file mode 100644 index 000000000..9638d45a0 --- /dev/null +++ b/lib/include/srslte/phy/fec/polar/polar_interleaver.h @@ -0,0 +1,67 @@ +/** + * + * \section COPYRIGHT + * + * Copyright 2013-2020 Software Radio Systems Limited + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the distribution. + * + */ + +#ifndef SRSLTE_POLAR_INTERLEAVER_H +#define SRSLTE_POLAR_INTERLEAVER_H + +#include "srslte/config.h" +#include +#include + +#define SRSLTE_POLAR_INTERLEAVER_K_MAX_IL 164 + +/** + * * @brief Implements generic Polar code interleaver as described in TS 38.212 V15.9.0 Section 5.3.1.1 + * + * @attention The input and output data cannot be the same. + * + * @param in Input data pointer + * @param out Output data pointer + * @param S Data element size in bytes + * @param K Number of elements + * @param dir Set to true for encoder and false for decoder + */ +SRSLTE_API void srslte_polar_interleaver_run(const void* in, void* out, uint32_t S, uint32_t K, bool dir); + +#define SRSLTE_POLAR_INTERLEAVE_GEN(NAME, TYPE) \ + static inline void srslte_polar_interleaver_run_##NAME(const TYPE* in, void* out, uint32_t K, bool dir) \ + { \ + srslte_polar_interleaver_run(in, out, (uint32_t)sizeof(TYPE), K, dir); \ + } + +/** + * @brief Implements Polar code interleaver as described in TS 38.212 V15.9.0 Section 5.3.1.1 + * + * @attention The input and output data cannot be the same. + * + * @param in unsigned 16 bit Input data + * @param out unsigned 16 bit Output data + * @param K Number of elements + * @param dir Set to true for encoder and false for decoder + */ +SRSLTE_POLAR_INTERLEAVE_GEN(u16, uint16_t) + +/** + * @brief Implements Polar code interleaver as described in TS 38.212 V15.9.0 Section 5.3.1.1 + * + * @attention The input and output data cannot be the same. + * + * @param in unsigned 8 bit Input data + * @param out unsigned 8 bit Output data + * @param K Number of elements + * @param dir Set to true for encoder and false for decoder + */ +SRSLTE_POLAR_INTERLEAVE_GEN(u8, uint8_t) + +#undef SRSLTE_POLAR_INTERLEAVE_GEN + +#endif // SRSLTE_POLAR_INTERLEAVER_H diff --git a/lib/src/phy/fec/polar/CMakeLists.txt b/lib/src/phy/fec/polar/CMakeLists.txt index d65572433..729b1df19 100644 --- a/lib/src/phy/fec/polar/CMakeLists.txt +++ b/lib/src/phy/fec/polar/CMakeLists.txt @@ -25,6 +25,7 @@ set(FEC_SOURCES ${FEC_SOURCES} ${AVX2_SOURCES} polar/polar_decoder_ssc_s.c polar/polar_decoder_ssc_c.c polar/polar_decoder_vector.c + polar/polar_interleaver.c polar/polar_rm.c PARENT_SCOPE) diff --git a/lib/src/phy/fec/polar/polar_interleaver.c b/lib/src/phy/fec/polar/polar_interleaver.c new file mode 100644 index 000000000..af6041690 --- /dev/null +++ b/lib/src/phy/fec/polar/polar_interleaver.c @@ -0,0 +1,50 @@ +/** + * + * section COPYRIGHT + * + * Copyright 2013-2020 Software Radio Systems Limited + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the distribution. + * + */ + +#include "srslte/phy/fec/polar/polar_interleaver.h" +#include "srslte/phy/utils/vector.h" +#include +#include + +// Table 5.3.1.1-1: Interleaving pattern +static const uint16_t polar_interleaver_pattern[SRSLTE_POLAR_INTERLEAVER_K_MAX_IL] = { + 0, 2, 4, 7, 9, 14, 19, 20, 24, 25, 26, 28, 31, 34, 42, 45, 49, 50, 51, 53, 54, + 56, 58, 59, 61, 62, 65, 66, 67, 69, 70, 71, 72, 76, 77, 81, 82, 83, 87, 88, 89, 91, + 93, 95, 98, 101, 104, 106, 108, 110, 111, 113, 115, 118, 119, 120, 122, 123, 126, 127, 129, 132, 134, + 138, 139, 140, 1, 3, 5, 8, 10, 15, 21, 27, 29, 32, 35, 43, 46, 52, 55, 57, 60, 63, + 68, 73, 78, 84, 90, 92, 94, 96, 99, 102, 105, 107, 109, 112, 114, 116, 121, 124, 128, 130, 133, + 135, 141, 6, 11, 16, 22, 30, 33, 36, 44, 47, 64, 74, 79, 85, 97, 100, 103, 117, 125, 131, + 136, 142, 12, 17, 23, 37, 48, 75, 80, 86, 137, 143, 13, 18, 38, 144, 39, 145, 40, 146, 41, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163}; + +void srslte_polar_interleaver_run(const void* in, void* out, uint32_t S, uint32_t K, bool dir) +{ + if (in == NULL || out == NULL) { + return; + } + + const uint8_t* in_ptr = (const uint8_t*)in; + uint8_t* out_ptr = (uint8_t*)out; + + uint32_t k = 0; + for (uint32_t m = 0; m < SRSLTE_POLAR_INTERLEAVER_K_MAX_IL; m++) { + if (polar_interleaver_pattern[m] >= SRSLTE_POLAR_INTERLEAVER_K_MAX_IL - K) { + uint32_t pi_k = polar_interleaver_pattern[m] - (SRSLTE_POLAR_INTERLEAVER_K_MAX_IL - K); + if (dir) { + memcpy(out_ptr + S * k, in_ptr + S * pi_k, S); + } else { + memcpy(out_ptr + S * pi_k, in_ptr + S * k, S); + } + k++; + } + } +} \ No newline at end of file diff --git a/lib/src/phy/fec/polar/test/CMakeLists.txt b/lib/src/phy/fec/polar/test/CMakeLists.txt index c44753a20..4d1fbd276 100644 --- a/lib/src/phy/fec/polar/test/CMakeLists.txt +++ b/lib/src/phy/fec/polar/test/CMakeLists.txt @@ -85,4 +85,9 @@ polar_tests_lite(-3) # Unit tests full set(test_name POLAR-UNIT-TEST) set(test_command polar_chain_test) -polar_tests(101) \ No newline at end of file +polar_tests(101) + +# Polar inter-leaver test +add_executable(polar_interleaver_test polar_interleaver_test.c) +target_link_libraries(polar_interleaver_test srslte_phy) +add_test(polar_interleaver_test polar_interleaver_test) \ No newline at end of file diff --git a/lib/src/phy/fec/polar/test/polar_interleaver_gold.h b/lib/src/phy/fec/polar/test/polar_interleaver_gold.h new file mode 100644 index 000000000..889997ef2 --- /dev/null +++ b/lib/src/phy/fec/polar/test/polar_interleaver_gold.h @@ -0,0 +1,1042 @@ +/** + * + * \section COPYRIGHT + * + * Copyright 2013-2020 Software Radio Systems Limited + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the distribution. + * + */ + +typedef struct { + int K; + int indexes[164]; +} polar_interleaver_gold_t; + +static const polar_interleaver_gold_t polar_interleaver_gold[] = { + {24, + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + }}, + {25, + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + }}, + {26, + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + }}, + {27, + { + 1, 2, 3, 4, 5, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + }}, + {28, + { + 2, 3, 4, 5, 0, 6, 1, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + }}, + {29, + { + 3, 4, 5, 0, 6, 1, 7, 2, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + }}, + {30, + { + 0, 4, 5, 6, 1, 7, 2, 8, 3, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + }}, + {31, + { + 1, 5, 6, 7, 0, 2, 8, 3, 9, 4, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + }}, + {32, + { + 0, 2, 6, 7, 8, 1, 3, 9, 4, 10, 5, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + }}, + {33, + { + 1, 3, 7, 8, 9, 2, 4, 10, 0, 5, 11, 6, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + }}, + {34, + { + 2, 4, 8, 9, 10, 0, 3, 5, 11, 1, 6, 12, 7, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + }}, + {35, + { + 0, 3, 5, 9, 10, 11, 1, 4, 6, 12, 2, 7, 13, 8, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + }}, + {36, + { + 1, 4, 6, 10, 11, 12, 0, 2, 5, 7, 13, 3, 8, 14, 9, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + }}, + {37, + { + 0, 2, 5, 7, 11, 12, 13, 1, 3, 6, 8, 14, 4, 9, 15, 10, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + }}, + {38, + { + 0, 1, 3, 6, 8, 12, 13, 14, 2, 4, 7, 9, 15, 5, 10, 16, 11, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + }}, + {39, + { + 1, 2, 4, 7, 9, 13, 14, 15, 3, 5, 8, 10, 16, 0, 6, 11, 17, 12, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + }}, + {40, + { + 2, 3, 5, 8, 10, 14, 15, 16, 0, 4, 6, 9, 11, 17, 1, 7, 12, 18, 13, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + }}, + {41, + { + 0, 3, 4, 6, 9, 11, 15, 16, 17, 1, 5, 7, 10, 12, 18, 2, 8, 13, 19, 14, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + }}, + {42, + { + 0, 1, 4, 5, 7, 10, 12, 16, 17, 18, 2, 6, 8, 11, 13, 19, 3, 9, 14, 20, 15, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + }}, + {43, + { + 1, 2, 5, 6, 8, 11, 13, 17, 18, 19, 0, 3, 7, 9, 12, 14, 20, 4, 10, 15, 21, 16, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + }}, + {44, + { + 0, 2, 3, 6, 7, 9, 12, 14, 18, 19, 20, 1, 4, 8, 10, 13, 15, 21, 5, 11, 16, 22, + 17, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + }}, + {45, + { + 0, 1, 3, 4, 7, 8, 10, 13, 15, 19, 20, 21, 2, 5, 9, 11, 14, 16, 22, 6, 12, 17, 23, + 18, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + }}, + {46, + { + 0, 1, 2, 4, 5, 8, 9, 11, 14, 16, 20, 21, 22, 3, 6, 10, 12, 15, 17, 23, 7, 13, 18, + 24, 19, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + }}, + {47, + { + 1, 2, 3, 5, 6, 9, 10, 12, 15, 17, 21, 22, 23, 4, 7, 11, 13, 16, 18, 24, 0, 8, 14, 19, + 25, 20, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + }}, + {48, + { + 2, 3, 4, 6, 7, 10, 11, 13, 16, 18, 22, 23, 24, 0, 5, 8, 12, 14, 17, 19, 25, 1, 9, 15, + 20, 26, 21, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + }}, + {49, + { + 0, 3, 4, 5, 7, 8, 11, 12, 14, 17, 19, 23, 24, 25, 1, 6, 9, 13, 15, 18, 20, 26, 2, 10, 16, + 21, 27, 22, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + }}, + {50, + { + 1, 4, 5, 6, 8, 9, 12, 13, 15, 18, 20, 24, 25, 26, 0, 2, 7, 10, 14, 16, 19, 21, 27, 3, 11, + 17, 22, 28, 23, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + }}, + {51, + { + 0, 2, 5, 6, 7, 9, 10, 13, 14, 16, 19, 21, 25, 26, 27, 1, 3, 8, 11, 15, 17, 20, 22, 28, 4, 12, + 18, 23, 29, 24, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + }}, + {52, + { + 1, 3, 6, 7, 8, 10, 11, 14, 15, 17, 20, 22, 26, 27, 28, 0, 2, 4, 9, 12, 16, 18, 21, 23, 29, 5, + 13, 19, 24, 30, 25, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + }}, + {53, + { + 0, 2, 4, 7, 8, 9, 11, 12, 15, 16, 18, 21, 23, 27, 28, 29, 1, 3, 5, 10, 13, 17, 19, 22, 24, 30, 6, + 14, 20, 25, 31, 26, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + }}, + {54, + { + 0, 1, 3, 5, 8, 9, 10, 12, 13, 16, 17, 19, 22, 24, 28, 29, 30, 2, 4, 6, 11, 14, 18, 20, 23, 25, 31, + 7, 15, 21, 26, 32, 27, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + }}, + {55, + { + 1, 2, 4, 6, 9, 10, 11, 13, 14, 17, 18, 20, 23, 25, 29, 30, 31, 0, 3, 5, 7, 12, 15, 19, 21, 24, 26, 32, + 8, 16, 22, 27, 33, 28, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + }}, + {56, + { + 0, 2, 3, 5, 7, 10, 11, 12, 14, 15, 18, 19, 21, 24, 26, 30, 31, 32, 1, 4, 6, 8, 13, 16, 20, 22, 25, 27, + 33, 9, 17, 23, 28, 34, 29, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + }}, + {57, + { + 1, 3, 4, 6, 8, 11, 12, 13, 15, 16, 19, 20, 22, 25, 27, 31, 32, 33, 0, + 2, 5, 7, 9, 14, 17, 21, 23, 26, 28, 34, 10, 18, 24, 29, 35, 30, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + }}, + {58, + { + 0, 2, 4, 5, 7, 9, 12, 13, 14, 16, 17, 20, 21, 23, 26, 28, 32, 33, 34, 1, + 3, 6, 8, 10, 15, 18, 22, 24, 27, 29, 35, 11, 19, 25, 30, 36, 31, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + }}, + {59, + { + 1, 3, 5, 6, 8, 10, 13, 14, 15, 17, 18, 21, 22, 24, 27, 29, 33, 34, 35, 0, + 2, 4, 7, 9, 11, 16, 19, 23, 25, 28, 30, 36, 12, 20, 26, 31, 37, 32, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + }}, + {60, + { + 0, 2, 4, 6, 7, 9, 11, 14, 15, 16, 18, 19, 22, 23, 25, 28, 30, 34, 35, 36, + 1, 3, 5, 8, 10, 12, 17, 20, 24, 26, 29, 31, 37, 13, 21, 27, 32, 38, 33, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + }}, + {61, + { + 1, 3, 5, 7, 8, 10, 12, 15, 16, 17, 19, 20, 23, 24, 26, 29, 31, 35, 36, 37, 2, + 4, 6, 9, 11, 13, 18, 21, 25, 27, 30, 32, 38, 0, 14, 22, 28, 33, 39, 34, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + }}, + {62, + { + 2, 4, 6, 8, 9, 11, 13, 16, 17, 18, 20, 21, 24, 25, 27, 30, 32, 36, 37, 38, 0, + 3, 5, 7, 10, 12, 14, 19, 22, 26, 28, 31, 33, 39, 1, 15, 23, 29, 34, 40, 35, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + }}, + {63, + { + 0, 3, 5, 7, 9, 10, 12, 14, 17, 18, 19, 21, 22, 25, 26, 28, 31, 33, 37, 38, 39, + 1, 4, 6, 8, 11, 13, 15, 20, 23, 27, 29, 32, 34, 40, 2, 16, 24, 30, 35, 41, 36, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + }}, + {64, + { + 1, 4, 6, 8, 10, 11, 13, 15, 18, 19, 20, 22, 23, 26, 27, 29, 32, 34, 38, 39, 40, 2, + 5, 7, 9, 12, 14, 16, 21, 24, 28, 30, 33, 35, 41, 0, 3, 17, 25, 31, 36, 42, 37, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + }}, + {65, + { + 2, 5, 7, 9, 11, 12, 14, 16, 19, 20, 21, 23, 24, 27, 28, 30, 33, 35, 39, 40, 41, 0, + 3, 6, 8, 10, 13, 15, 17, 22, 25, 29, 31, 34, 36, 42, 1, 4, 18, 26, 32, 37, 43, 38, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + }}, + {66, + { + 0, 3, 6, 8, 10, 12, 13, 15, 17, 20, 21, 22, 24, 25, 28, 29, 31, 34, 36, 40, 41, 42, + 1, 4, 7, 9, 11, 14, 16, 18, 23, 26, 30, 32, 35, 37, 43, 2, 5, 19, 27, 33, 38, 44, + 39, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + }}, + {67, + { + 1, 4, 7, 9, 11, 13, 14, 16, 18, 21, 22, 23, 25, 26, 29, 30, 32, 35, 37, 41, 42, 43, 2, + 5, 8, 10, 12, 15, 17, 19, 24, 27, 31, 33, 36, 38, 44, 0, 3, 6, 20, 28, 34, 39, 45, 40, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + }}, + {68, + { + 2, 5, 8, 10, 12, 14, 15, 17, 19, 22, 23, 24, 26, 27, 30, 31, 33, 36, 38, 42, 43, 44, 0, + 3, 6, 9, 11, 13, 16, 18, 20, 25, 28, 32, 34, 37, 39, 45, 1, 4, 7, 21, 29, 35, 40, 46, + 41, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + }}, + {69, + { + 0, 3, 6, 9, 11, 13, 15, 16, 18, 20, 23, 24, 25, 27, 28, 31, 32, 34, 37, 39, 43, 44, 45, + 1, 4, 7, 10, 12, 14, 17, 19, 21, 26, 29, 33, 35, 38, 40, 46, 2, 5, 8, 22, 30, 36, 41, + 47, 42, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + }}, + {70, + { + 1, 4, 7, 10, 12, 14, 16, 17, 19, 21, 24, 25, 26, 28, 29, 32, 33, 35, 38, 40, 44, 45, 46, 0, + 2, 5, 8, 11, 13, 15, 18, 20, 22, 27, 30, 34, 36, 39, 41, 47, 3, 6, 9, 23, 31, 37, 42, 48, + 43, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + }}, + {71, + { + 0, 2, 5, 8, 11, 13, 15, 17, 18, 20, 22, 25, 26, 27, 29, 30, 33, 34, 36, 39, 41, 45, 46, 47, + 1, 3, 6, 9, 12, 14, 16, 19, 21, 23, 28, 31, 35, 37, 40, 42, 48, 4, 7, 10, 24, 32, 38, 43, + 49, 44, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + }}, + {72, + { + 1, 3, 6, 9, 12, 14, 16, 18, 19, 21, 23, 26, 27, 28, 30, 31, 34, 35, 37, 40, 42, 46, 47, 48, + 0, 2, 4, 7, 10, 13, 15, 17, 20, 22, 24, 29, 32, 36, 38, 41, 43, 49, 5, 8, 11, 25, 33, 39, + 44, 50, 45, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + }}, + {73, + { + 0, 2, 4, 7, 10, 13, 15, 17, 19, 20, 22, 24, 27, 28, 29, 31, 32, 35, 36, 38, 41, 43, 47, 48, 49, + 1, 3, 5, 8, 11, 14, 16, 18, 21, 23, 25, 30, 33, 37, 39, 42, 44, 50, 6, 9, 12, 26, 34, 40, 45, + 51, 46, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + }}, + {74, + { + 1, 3, 5, 8, 11, 14, 16, 18, 20, 21, 23, 25, 28, 29, 30, 32, 33, 36, 37, 39, 42, 44, 48, 49, 50, + 0, 2, 4, 6, 9, 12, 15, 17, 19, 22, 24, 26, 31, 34, 38, 40, 43, 45, 51, 7, 10, 13, 27, 35, 41, + 46, 52, 47, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + }}, + {75, + { + 0, 2, 4, 6, 9, 12, 15, 17, 19, 21, 22, 24, 26, 29, 30, 31, 33, 34, 37, 38, 40, 43, 45, 49, 50, + 51, 1, 3, 5, 7, 10, 13, 16, 18, 20, 23, 25, 27, 32, 35, 39, 41, 44, 46, 52, 8, 11, 14, 28, 36, + 42, 47, 53, 48, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + }}, + {76, + { + 0, 1, 3, 5, 7, 10, 13, 16, 18, 20, 22, 23, 25, 27, 30, 31, 32, 34, 35, 38, 39, 41, 44, 46, 50, 51, + 52, 2, 4, 6, 8, 11, 14, 17, 19, 21, 24, 26, 28, 33, 36, 40, 42, 45, 47, 53, 9, 12, 15, 29, 37, 43, + 48, 54, 49, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + }}, + {77, + { + 0, 1, 2, 4, 6, 8, 11, 14, 17, 19, 21, 23, 24, 26, 28, 31, 32, 33, 35, 36, 39, 40, 42, 45, 47, 51, + 52, 53, 3, 5, 7, 9, 12, 15, 18, 20, 22, 25, 27, 29, 34, 37, 41, 43, 46, 48, 54, 10, 13, 16, 30, 38, + 44, 49, 55, 50, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + }}, + {78, + { + 1, 2, 3, 5, 7, 9, 12, 15, 18, 20, 22, 24, 25, 27, 29, 32, 33, 34, 36, 37, 40, 41, 43, 46, 48, 52, + 53, 54, 4, 6, 8, 10, 13, 16, 19, 21, 23, 26, 28, 30, 35, 38, 42, 44, 47, 49, 55, 11, 14, 17, 31, 39, + 45, 50, 56, 0, 51, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + }}, + {79, + { + 2, 3, 4, 6, 8, 10, 13, 16, 19, 21, 23, 25, 26, 28, 30, 33, 34, 35, 37, 38, 41, 42, 44, 47, 49, 53, 54, + 55, 5, 7, 9, 11, 14, 17, 20, 22, 24, 27, 29, 31, 36, 39, 43, 45, 48, 50, 56, 0, 12, 15, 18, 32, 40, 46, + 51, 57, 1, 52, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + }}, + {80, + { + 3, 4, 5, 7, 9, 11, 14, 17, 20, 22, 24, 26, 27, 29, 31, 34, 35, 36, 38, 39, 42, 43, 45, 48, 50, 54, 55, + 56, 0, 6, 8, 10, 12, 15, 18, 21, 23, 25, 28, 30, 32, 37, 40, 44, 46, 49, 51, 57, 1, 13, 16, 19, 33, 41, + 47, 52, 58, 2, 53, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + }}, + {81, + { + 0, 4, 5, 6, 8, 10, 12, 15, 18, 21, 23, 25, 27, 28, 30, 32, 35, 36, 37, 39, 40, 43, 44, 46, 49, 51, 55, + 56, 57, 1, 7, 9, 11, 13, 16, 19, 22, 24, 26, 29, 31, 33, 38, 41, 45, 47, 50, 52, 58, 2, 14, 17, 20, 34, + 42, 48, 53, 59, 3, 54, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + }}, + {82, + { + 0, 1, 5, 6, 7, 9, 11, 13, 16, 19, 22, 24, 26, 28, 29, 31, 33, 36, 37, 38, 40, 41, 44, 45, 47, 50, 52, 56, + 57, 58, 2, 8, 10, 12, 14, 17, 20, 23, 25, 27, 30, 32, 34, 39, 42, 46, 48, 51, 53, 59, 3, 15, 18, 21, 35, 43, + 49, 54, 60, 4, 55, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + }}, + {83, + { + 0, 1, 2, 6, 7, 8, 10, 12, 14, 17, 20, 23, 25, 27, 29, 30, 32, 34, 37, 38, 39, 41, 42, 45, 46, 48, 51, 53, + 57, 58, 59, 3, 9, 11, 13, 15, 18, 21, 24, 26, 28, 31, 33, 35, 40, 43, 47, 49, 52, 54, 60, 4, 16, 19, 22, 36, + 44, 50, 55, 61, 5, 56, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + }}, + {84, + { + 1, 2, 3, 7, 8, 9, 11, 13, 15, 18, 21, 24, 26, 28, 30, 31, 33, 35, 38, 39, 40, 42, 43, 46, 47, 49, 52, 54, + 58, 59, 60, 4, 10, 12, 14, 16, 19, 22, 25, 27, 29, 32, 34, 36, 41, 44, 48, 50, 53, 55, 61, 5, 17, 20, 23, 37, + 45, 51, 56, 62, 0, 6, 57, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + }}, + {85, + { + 2, 3, 4, 8, 9, 10, 12, 14, 16, 19, 22, 25, 27, 29, 31, 32, 34, 36, 39, 40, 41, 43, + 44, 47, 48, 50, 53, 55, 59, 60, 61, 5, 11, 13, 15, 17, 20, 23, 26, 28, 30, 33, 35, 37, + 42, 45, 49, 51, 54, 56, 62, 0, 6, 18, 21, 24, 38, 46, 52, 57, 63, 1, 7, 58, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + }}, + {86, + { + 3, 4, 5, 9, 10, 11, 13, 15, 17, 20, 23, 26, 28, 30, 32, 33, 35, 37, 40, 41, 42, 44, + 45, 48, 49, 51, 54, 56, 60, 61, 62, 0, 6, 12, 14, 16, 18, 21, 24, 27, 29, 31, 34, 36, + 38, 43, 46, 50, 52, 55, 57, 63, 1, 7, 19, 22, 25, 39, 47, 53, 58, 64, 2, 8, 59, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + }}, + {87, + { + 0, 4, 5, 6, 10, 11, 12, 14, 16, 18, 21, 24, 27, 29, 31, 33, 34, 36, 38, 41, 42, 43, + 45, 46, 49, 50, 52, 55, 57, 61, 62, 63, 1, 7, 13, 15, 17, 19, 22, 25, 28, 30, 32, 35, + 37, 39, 44, 47, 51, 53, 56, 58, 64, 2, 8, 20, 23, 26, 40, 48, 54, 59, 65, 3, 9, 60, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + }}, + {88, + { + 0, 1, 5, 6, 7, 11, 12, 13, 15, 17, 19, 22, 25, 28, 30, 32, 34, 35, 37, 39, 42, 43, + 44, 46, 47, 50, 51, 53, 56, 58, 62, 63, 64, 2, 8, 14, 16, 18, 20, 23, 26, 29, 31, 33, + 36, 38, 40, 45, 48, 52, 54, 57, 59, 65, 3, 9, 21, 24, 27, 41, 49, 55, 60, 66, 4, 10, + 61, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + }}, + {89, + { + 1, 2, 6, 7, 8, 12, 13, 14, 16, 18, 20, 23, 26, 29, 31, 33, 35, 36, 38, 40, 43, 44, 45, + 47, 48, 51, 52, 54, 57, 59, 63, 64, 65, 3, 9, 15, 17, 19, 21, 24, 27, 30, 32, 34, 37, 39, + 41, 46, 49, 53, 55, 58, 60, 66, 4, 10, 22, 25, 28, 42, 50, 56, 61, 67, 0, 5, 11, 62, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + }}, + {90, + { + 2, 3, 7, 8, 9, 13, 14, 15, 17, 19, 21, 24, 27, 30, 32, 34, 36, 37, 39, 41, 44, 45, 46, + 48, 49, 52, 53, 55, 58, 60, 64, 65, 66, 4, 10, 16, 18, 20, 22, 25, 28, 31, 33, 35, 38, 40, + 42, 47, 50, 54, 56, 59, 61, 67, 0, 5, 11, 23, 26, 29, 43, 51, 57, 62, 68, 1, 6, 12, 63, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + }}, + {91, + { + 3, 4, 8, 9, 10, 14, 15, 16, 18, 20, 22, 25, 28, 31, 33, 35, 37, 38, 40, 42, 45, 46, 47, + 49, 50, 53, 54, 56, 59, 61, 65, 66, 67, 0, 5, 11, 17, 19, 21, 23, 26, 29, 32, 34, 36, 39, + 41, 43, 48, 51, 55, 57, 60, 62, 68, 1, 6, 12, 24, 27, 30, 44, 52, 58, 63, 69, 2, 7, 13, + 64, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + }}, + {92, + { + 0, 4, 5, 9, 10, 11, 15, 16, 17, 19, 21, 23, 26, 29, 32, 34, 36, 38, 39, 41, 43, 46, 47, + 48, 50, 51, 54, 55, 57, 60, 62, 66, 67, 68, 1, 6, 12, 18, 20, 22, 24, 27, 30, 33, 35, 37, + 40, 42, 44, 49, 52, 56, 58, 61, 63, 69, 2, 7, 13, 25, 28, 31, 45, 53, 59, 64, 70, 3, 8, + 14, 65, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + }}, + {93, + { + 0, 1, 5, 6, 10, 11, 12, 16, 17, 18, 20, 22, 24, 27, 30, 33, 35, 37, 39, 40, 42, 44, 47, 48, + 49, 51, 52, 55, 56, 58, 61, 63, 67, 68, 69, 2, 7, 13, 19, 21, 23, 25, 28, 31, 34, 36, 38, 41, + 43, 45, 50, 53, 57, 59, 62, 64, 70, 3, 8, 14, 26, 29, 32, 46, 54, 60, 65, 71, 4, 9, 15, 66, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + }}, + {94, + { + 0, 1, 2, 6, 7, 11, 12, 13, 17, 18, 19, 21, 23, 25, 28, 31, 34, 36, 38, 40, 41, 43, 45, 48, + 49, 50, 52, 53, 56, 57, 59, 62, 64, 68, 69, 70, 3, 8, 14, 20, 22, 24, 26, 29, 32, 35, 37, 39, + 42, 44, 46, 51, 54, 58, 60, 63, 65, 71, 4, 9, 15, 27, 30, 33, 47, 55, 61, 66, 72, 5, 10, 16, + 67, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + }}, + {95, + { + 0, 1, 2, 3, 7, 8, 12, 13, 14, 18, 19, 20, 22, 24, 26, 29, 32, 35, 37, 39, 41, 42, 44, 46, + 49, 50, 51, 53, 54, 57, 58, 60, 63, 65, 69, 70, 71, 4, 9, 15, 21, 23, 25, 27, 30, 33, 36, 38, + 40, 43, 45, 47, 52, 55, 59, 61, 64, 66, 72, 5, 10, 16, 28, 31, 34, 48, 56, 62, 67, 73, 6, 11, + 17, 68, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + }}, + {96, + { + 1, 2, 3, 4, 8, 9, 13, 14, 15, 19, 20, 21, 23, 25, 27, 30, 33, 36, 38, 40, 42, 43, 45, 47, + 50, 51, 52, 54, 55, 58, 59, 61, 64, 66, 70, 71, 72, 0, 5, 10, 16, 22, 24, 26, 28, 31, 34, 37, + 39, 41, 44, 46, 48, 53, 56, 60, 62, 65, 67, 73, 6, 11, 17, 29, 32, 35, 49, 57, 63, 68, 74, 7, + 12, 18, 69, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + }}, + {97, + { + 0, 2, 3, 4, 5, 9, 10, 14, 15, 16, 20, 21, 22, 24, 26, 28, 31, 34, 37, 39, 41, 43, 44, 46, 48, + 51, 52, 53, 55, 56, 59, 60, 62, 65, 67, 71, 72, 73, 1, 6, 11, 17, 23, 25, 27, 29, 32, 35, 38, 40, + 42, 45, 47, 49, 54, 57, 61, 63, 66, 68, 74, 7, 12, 18, 30, 33, 36, 50, 58, 64, 69, 75, 8, 13, 19, + 70, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + }}, + {98, + { + 0, 1, 3, 4, 5, 6, 10, 11, 15, 16, 17, 21, 22, 23, 25, 27, 29, 32, 35, 38, 40, 42, 44, 45, 47, + 49, 52, 53, 54, 56, 57, 60, 61, 63, 66, 68, 72, 73, 74, 2, 7, 12, 18, 24, 26, 28, 30, 33, 36, 39, + 41, 43, 46, 48, 50, 55, 58, 62, 64, 67, 69, 75, 8, 13, 19, 31, 34, 37, 51, 59, 65, 70, 76, 9, 14, + 20, 71, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + }}, + {99, + { + 0, 1, 2, 4, 5, 6, 7, 11, 12, 16, 17, 18, 22, 23, 24, 26, 28, 30, 33, 36, 39, 41, 43, 45, 46, + 48, 50, 53, 54, 55, 57, 58, 61, 62, 64, 67, 69, 73, 74, 75, 3, 8, 13, 19, 25, 27, 29, 31, 34, 37, + 40, 42, 44, 47, 49, 51, 56, 59, 63, 65, 68, 70, 76, 9, 14, 20, 32, 35, 38, 52, 60, 66, 71, 77, 10, + 15, 21, 72, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + }}, + {100, + { + 1, 2, 3, 5, 6, 7, 8, 12, 13, 17, 18, 19, 23, 24, 25, 27, 29, 31, 34, 37, 40, 42, 44, 46, 47, + 49, 51, 54, 55, 56, 58, 59, 62, 63, 65, 68, 70, 74, 75, 76, 4, 9, 14, 20, 26, 28, 30, 32, 35, 38, + 41, 43, 45, 48, 50, 52, 57, 60, 64, 66, 69, 71, 77, 0, 10, 15, 21, 33, 36, 39, 53, 61, 67, 72, 78, + 11, 16, 22, 73, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + }}, + {101, + { + 2, 3, 4, 6, 7, 8, 9, 13, 14, 18, 19, 20, 24, 25, 26, 28, 30, 32, 35, 38, 41, 43, 45, 47, 48, 50, + 52, 55, 56, 57, 59, 60, 63, 64, 66, 69, 71, 75, 76, 77, 0, 5, 10, 15, 21, 27, 29, 31, 33, 36, 39, 42, + 44, 46, 49, 51, 53, 58, 61, 65, 67, 70, 72, 78, 1, 11, 16, 22, 34, 37, 40, 54, 62, 68, 73, 79, 12, 17, + 23, 74, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + }}, + {102, + { + 0, 3, 4, 5, 7, 8, 9, 10, 14, 15, 19, 20, 21, 25, 26, 27, 29, 31, 33, 36, 39, 42, 44, 46, 48, 49, + 51, 53, 56, 57, 58, 60, 61, 64, 65, 67, 70, 72, 76, 77, 78, 1, 6, 11, 16, 22, 28, 30, 32, 34, 37, 40, + 43, 45, 47, 50, 52, 54, 59, 62, 66, 68, 71, 73, 79, 2, 12, 17, 23, 35, 38, 41, 55, 63, 69, 74, 80, 13, + 18, 24, 75, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + }}, + {103, + { + 0, 1, 4, 5, 6, 8, 9, 10, 11, 15, 16, 20, 21, 22, 26, 27, 28, 30, 32, 34, 37, 40, 43, 45, 47, 49, + 50, 52, 54, 57, 58, 59, 61, 62, 65, 66, 68, 71, 73, 77, 78, 79, 2, 7, 12, 17, 23, 29, 31, 33, 35, 38, + 41, 44, 46, 48, 51, 53, 55, 60, 63, 67, 69, 72, 74, 80, 3, 13, 18, 24, 36, 39, 42, 56, 64, 70, 75, 81, + 14, 19, 25, 76, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + }}, + {104, + { + 1, 2, 5, 6, 7, 9, 10, 11, 12, 16, 17, 21, 22, 23, 27, 28, 29, 31, 33, 35, 38, 41, 44, 46, 48, 50, + 51, 53, 55, 58, 59, 60, 62, 63, 66, 67, 69, 72, 74, 78, 79, 80, 0, 3, 8, 13, 18, 24, 30, 32, 34, 36, + 39, 42, 45, 47, 49, 52, 54, 56, 61, 64, 68, 70, 73, 75, 81, 4, 14, 19, 25, 37, 40, 43, 57, 65, 71, 76, + 82, 15, 20, 26, 77, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + }}, + {105, + { + 0, 2, 3, 6, 7, 8, 10, 11, 12, 13, 17, 18, 22, 23, 24, 28, 29, 30, 32, 34, 36, + 39, 42, 45, 47, 49, 51, 52, 54, 56, 59, 60, 61, 63, 64, 67, 68, 70, 73, 75, 79, 80, + 81, 1, 4, 9, 14, 19, 25, 31, 33, 35, 37, 40, 43, 46, 48, 50, 53, 55, 57, 62, 65, + 69, 71, 74, 76, 82, 5, 15, 20, 26, 38, 41, 44, 58, 66, 72, 77, 83, 16, 21, 27, 78, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + }}, + {106, + { + 0, 1, 3, 4, 7, 8, 9, 11, 12, 13, 14, 18, 19, 23, 24, 25, 29, 30, 31, 33, 35, 37, + 40, 43, 46, 48, 50, 52, 53, 55, 57, 60, 61, 62, 64, 65, 68, 69, 71, 74, 76, 80, 81, 82, + 2, 5, 10, 15, 20, 26, 32, 34, 36, 38, 41, 44, 47, 49, 51, 54, 56, 58, 63, 66, 70, 72, + 75, 77, 83, 6, 16, 21, 27, 39, 42, 45, 59, 67, 73, 78, 84, 17, 22, 28, 79, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + }}, + {107, + { + 1, 2, 4, 5, 8, 9, 10, 12, 13, 14, 15, 19, 20, 24, 25, 26, 30, 31, 32, 34, 36, 38, + 41, 44, 47, 49, 51, 53, 54, 56, 58, 61, 62, 63, 65, 66, 69, 70, 72, 75, 77, 81, 82, 83, + 0, 3, 6, 11, 16, 21, 27, 33, 35, 37, 39, 42, 45, 48, 50, 52, 55, 57, 59, 64, 67, 71, + 73, 76, 78, 84, 7, 17, 22, 28, 40, 43, 46, 60, 68, 74, 79, 85, 18, 23, 29, 80, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + }}, + {108, + { + 0, 2, 3, 5, 6, 9, 10, 11, 13, 14, 15, 16, 20, 21, 25, 26, 27, 31, 32, 33, 35, 37, + 39, 42, 45, 48, 50, 52, 54, 55, 57, 59, 62, 63, 64, 66, 67, 70, 71, 73, 76, 78, 82, 83, + 84, 1, 4, 7, 12, 17, 22, 28, 34, 36, 38, 40, 43, 46, 49, 51, 53, 56, 58, 60, 65, 68, + 72, 74, 77, 79, 85, 8, 18, 23, 29, 41, 44, 47, 61, 69, 75, 80, 86, 19, 24, 30, 81, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + }}, + {109, + { + 1, 3, 4, 6, 7, 10, 11, 12, 14, 15, 16, 17, 21, 22, 26, 27, 28, 32, 33, 34, 36, 38, + 40, 43, 46, 49, 51, 53, 55, 56, 58, 60, 63, 64, 65, 67, 68, 71, 72, 74, 77, 79, 83, 84, + 85, 0, 2, 5, 8, 13, 18, 23, 29, 35, 37, 39, 41, 44, 47, 50, 52, 54, 57, 59, 61, 66, + 69, 73, 75, 78, 80, 86, 9, 19, 24, 30, 42, 45, 48, 62, 70, 76, 81, 87, 20, 25, 31, 82, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + }}, + {110, + { + 0, 2, 4, 5, 7, 8, 11, 12, 13, 15, 16, 17, 18, 22, 23, 27, 28, 29, 33, 34, 35, 37, + 39, 41, 44, 47, 50, 52, 54, 56, 57, 59, 61, 64, 65, 66, 68, 69, 72, 73, 75, 78, 80, 84, + 85, 86, 1, 3, 6, 9, 14, 19, 24, 30, 36, 38, 40, 42, 45, 48, 51, 53, 55, 58, 60, 62, + 67, 70, 74, 76, 79, 81, 87, 10, 20, 25, 31, 43, 46, 49, 63, 71, 77, 82, 88, 21, 26, 32, + 83, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + }}, + {111, + { + 0, 1, 3, 5, 6, 8, 9, 12, 13, 14, 16, 17, 18, 19, 23, 24, 28, 29, 30, 34, 35, 36, 38, + 40, 42, 45, 48, 51, 53, 55, 57, 58, 60, 62, 65, 66, 67, 69, 70, 73, 74, 76, 79, 81, 85, 86, + 87, 2, 4, 7, 10, 15, 20, 25, 31, 37, 39, 41, 43, 46, 49, 52, 54, 56, 59, 61, 63, 68, 71, + 75, 77, 80, 82, 88, 11, 21, 26, 32, 44, 47, 50, 64, 72, 78, 83, 89, 22, 27, 33, 84, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + }}, + {112, + { + 1, 2, 4, 6, 7, 9, 10, 13, 14, 15, 17, 18, 19, 20, 24, 25, 29, 30, 31, 35, 36, 37, 39, + 41, 43, 46, 49, 52, 54, 56, 58, 59, 61, 63, 66, 67, 68, 70, 71, 74, 75, 77, 80, 82, 86, 87, + 88, 0, 3, 5, 8, 11, 16, 21, 26, 32, 38, 40, 42, 44, 47, 50, 53, 55, 57, 60, 62, 64, 69, + 72, 76, 78, 81, 83, 89, 12, 22, 27, 33, 45, 48, 51, 65, 73, 79, 84, 90, 23, 28, 34, 85, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + }}, + {113, + { + 0, 2, 3, 5, 7, 8, 10, 11, 14, 15, 16, 18, 19, 20, 21, 25, 26, 30, 31, 32, 36, 37, 38, + 40, 42, 44, 47, 50, 53, 55, 57, 59, 60, 62, 64, 67, 68, 69, 71, 72, 75, 76, 78, 81, 83, 87, + 88, 89, 1, 4, 6, 9, 12, 17, 22, 27, 33, 39, 41, 43, 45, 48, 51, 54, 56, 58, 61, 63, 65, + 70, 73, 77, 79, 82, 84, 90, 13, 23, 28, 34, 46, 49, 52, 66, 74, 80, 85, 91, 24, 29, 35, 86, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + }}, + {114, + { + 0, 1, 3, 4, 6, 8, 9, 11, 12, 15, 16, 17, 19, 20, 21, 22, 26, 27, 31, 32, 33, 37, 38, + 39, 41, 43, 45, 48, 51, 54, 56, 58, 60, 61, 63, 65, 68, 69, 70, 72, 73, 76, 77, 79, 82, 84, + 88, 89, 90, 2, 5, 7, 10, 13, 18, 23, 28, 34, 40, 42, 44, 46, 49, 52, 55, 57, 59, 62, 64, + 66, 71, 74, 78, 80, 83, 85, 91, 14, 24, 29, 35, 47, 50, 53, 67, 75, 81, 86, 92, 25, 30, 36, + 87, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + }}, + {115, + { + 0, 1, 2, 4, 5, 7, 9, 10, 12, 13, 16, 17, 18, 20, 21, 22, 23, 27, 28, 32, 33, 34, 38, + 39, 40, 42, 44, 46, 49, 52, 55, 57, 59, 61, 62, 64, 66, 69, 70, 71, 73, 74, 77, 78, 80, 83, + 85, 89, 90, 91, 3, 6, 8, 11, 14, 19, 24, 29, 35, 41, 43, 45, 47, 50, 53, 56, 58, 60, 63, + 65, 67, 72, 75, 79, 81, 84, 86, 92, 15, 25, 30, 36, 48, 51, 54, 68, 76, 82, 87, 93, 26, 31, + 37, 88, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + }}, + {116, + { + 1, 2, 3, 5, 6, 8, 10, 11, 13, 14, 17, 18, 19, 21, 22, 23, 24, 28, 29, 33, 34, 35, 39, 40, + 41, 43, 45, 47, 50, 53, 56, 58, 60, 62, 63, 65, 67, 70, 71, 72, 74, 75, 78, 79, 81, 84, 86, 90, + 91, 92, 4, 7, 9, 12, 15, 20, 25, 30, 36, 42, 44, 46, 48, 51, 54, 57, 59, 61, 64, 66, 68, 73, + 76, 80, 82, 85, 87, 93, 16, 26, 31, 37, 49, 52, 55, 69, 77, 83, 88, 94, 0, 27, 32, 38, 89, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + }}, + {117, + { + 2, 3, 4, 6, 7, 9, 11, 12, 14, 15, 18, 19, 20, 22, 23, 24, 25, 29, 30, 34, + 35, 36, 40, 41, 42, 44, 46, 48, 51, 54, 57, 59, 61, 63, 64, 66, 68, 71, 72, 73, + 75, 76, 79, 80, 82, 85, 87, 91, 92, 93, 5, 8, 10, 13, 16, 21, 26, 31, 37, 43, + 45, 47, 49, 52, 55, 58, 60, 62, 65, 67, 69, 74, 77, 81, 83, 86, 88, 94, 0, 17, + 27, 32, 38, 50, 53, 56, 70, 78, 84, 89, 95, 1, 28, 33, 39, 90, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + }}, + {118, + { + 3, 4, 5, 7, 8, 10, 12, 13, 15, 16, 19, 20, 21, 23, 24, 25, 26, 30, 31, 35, + 36, 37, 41, 42, 43, 45, 47, 49, 52, 55, 58, 60, 62, 64, 65, 67, 69, 72, 73, 74, + 76, 77, 80, 81, 83, 86, 88, 92, 93, 94, 0, 6, 9, 11, 14, 17, 22, 27, 32, 38, + 44, 46, 48, 50, 53, 56, 59, 61, 63, 66, 68, 70, 75, 78, 82, 84, 87, 89, 95, 1, + 18, 28, 33, 39, 51, 54, 57, 71, 79, 85, 90, 96, 2, 29, 34, 40, 91, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + }}, + {119, + { + 0, 4, 5, 6, 8, 9, 11, 13, 14, 16, 17, 20, 21, 22, 24, 25, 26, 27, 31, 32, + 36, 37, 38, 42, 43, 44, 46, 48, 50, 53, 56, 59, 61, 63, 65, 66, 68, 70, 73, 74, + 75, 77, 78, 81, 82, 84, 87, 89, 93, 94, 95, 1, 7, 10, 12, 15, 18, 23, 28, 33, + 39, 45, 47, 49, 51, 54, 57, 60, 62, 64, 67, 69, 71, 76, 79, 83, 85, 88, 90, 96, + 2, 19, 29, 34, 40, 52, 55, 58, 72, 80, 86, 91, 97, 3, 30, 35, 41, 92, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + }}, + {120, + { + 1, 5, 6, 7, 9, 10, 12, 14, 15, 17, 18, 21, 22, 23, 25, 26, 27, 28, 32, 33, + 37, 38, 39, 43, 44, 45, 47, 49, 51, 54, 57, 60, 62, 64, 66, 67, 69, 71, 74, 75, + 76, 78, 79, 82, 83, 85, 88, 90, 94, 95, 96, 2, 8, 11, 13, 16, 19, 24, 29, 34, + 40, 46, 48, 50, 52, 55, 58, 61, 63, 65, 68, 70, 72, 77, 80, 84, 86, 89, 91, 97, + 0, 3, 20, 30, 35, 41, 53, 56, 59, 73, 81, 87, 92, 98, 4, 31, 36, 42, 93, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + }}, + {121, + { + 2, 6, 7, 8, 10, 11, 13, 15, 16, 18, 19, 22, 23, 24, 26, 27, 28, 29, 33, 34, 38, + 39, 40, 44, 45, 46, 48, 50, 52, 55, 58, 61, 63, 65, 67, 68, 70, 72, 75, 76, 77, 79, + 80, 83, 84, 86, 89, 91, 95, 96, 97, 0, 3, 9, 12, 14, 17, 20, 25, 30, 35, 41, 47, + 49, 51, 53, 56, 59, 62, 64, 66, 69, 71, 73, 78, 81, 85, 87, 90, 92, 98, 1, 4, 21, + 31, 36, 42, 54, 57, 60, 74, 82, 88, 93, 99, 5, 32, 37, 43, 94, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + }}, + {122, + { + 0, 3, 7, 8, 9, 11, 12, 14, 16, 17, 19, 20, 23, 24, 25, 27, 28, 29, 30, 34, 35, + 39, 40, 41, 45, 46, 47, 49, 51, 53, 56, 59, 62, 64, 66, 68, 69, 71, 73, 76, 77, 78, + 80, 81, 84, 85, 87, 90, 92, 96, 97, 98, 1, 4, 10, 13, 15, 18, 21, 26, 31, 36, 42, + 48, 50, 52, 54, 57, 60, 63, 65, 67, 70, 72, 74, 79, 82, 86, 88, 91, 93, 99, 2, 5, + 22, 32, 37, 43, 55, 58, 61, 75, 83, 89, 94, 100, 6, 33, 38, 44, 95, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + }}, + {123, + { + 1, 4, 8, 9, 10, 12, 13, 15, 17, 18, 20, 21, 24, 25, 26, 28, 29, 30, 31, 35, 36, + 40, 41, 42, 46, 47, 48, 50, 52, 54, 57, 60, 63, 65, 67, 69, 70, 72, 74, 77, 78, 79, + 81, 82, 85, 86, 88, 91, 93, 97, 98, 99, 2, 5, 11, 14, 16, 19, 22, 27, 32, 37, 43, + 49, 51, 53, 55, 58, 61, 64, 66, 68, 71, 73, 75, 80, 83, 87, 89, 92, 94, 100, 3, 6, + 23, 33, 38, 44, 56, 59, 62, 76, 84, 90, 95, 101, 7, 34, 39, 45, 96, 102, 103, 104, 105, + 0, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + }}, + {124, + { + 2, 5, 9, 10, 11, 13, 14, 16, 18, 19, 21, 22, 25, 26, 27, 29, 30, 31, 32, 36, 37, + 41, 42, 43, 47, 48, 49, 51, 53, 55, 58, 61, 64, 66, 68, 70, 71, 73, 75, 78, 79, 80, + 82, 83, 86, 87, 89, 92, 94, 98, 99, 100, 3, 6, 12, 15, 17, 20, 23, 28, 33, 38, 44, + 50, 52, 54, 56, 59, 62, 65, 67, 69, 72, 74, 76, 81, 84, 88, 90, 93, 95, 101, 4, 7, + 24, 34, 39, 45, 57, 60, 63, 77, 85, 91, 96, 102, 8, 35, 40, 46, 97, 103, 104, 105, 0, + 106, 1, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + }}, + {125, + { + 3, 6, 10, 11, 12, 14, 15, 17, 19, 20, 22, 23, 26, 27, 28, 30, 31, 32, 33, 37, 38, + 42, 43, 44, 48, 49, 50, 52, 54, 56, 59, 62, 65, 67, 69, 71, 72, 74, 76, 79, 80, 81, + 83, 84, 87, 88, 90, 93, 95, 99, 100, 101, 4, 7, 13, 16, 18, 21, 24, 29, 34, 39, 45, + 51, 53, 55, 57, 60, 63, 66, 68, 70, 73, 75, 77, 82, 85, 89, 91, 94, 96, 102, 5, 8, + 25, 35, 40, 46, 58, 61, 64, 78, 86, 92, 97, 103, 9, 36, 41, 47, 98, 104, 105, 0, 106, + 1, 107, 2, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + }}, + {126, + { + 4, 7, 11, 12, 13, 15, 16, 18, 20, 21, 23, 24, 27, 28, 29, 31, 32, 33, 34, 38, 39, + 43, 44, 45, 49, 50, 51, 53, 55, 57, 60, 63, 66, 68, 70, 72, 73, 75, 77, 80, 81, 82, + 84, 85, 88, 89, 91, 94, 96, 100, 101, 102, 5, 8, 14, 17, 19, 22, 25, 30, 35, 40, 46, + 52, 54, 56, 58, 61, 64, 67, 69, 71, 74, 76, 78, 83, 86, 90, 92, 95, 97, 103, 6, 9, + 26, 36, 41, 47, 59, 62, 65, 79, 87, 93, 98, 104, 10, 37, 42, 48, 99, 105, 0, 106, 1, + 107, 2, 108, 3, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + }}, + {127, + { + 5, 8, 12, 13, 14, 16, 17, 19, 21, 22, 24, 25, 28, 29, 30, 32, 33, 34, 35, 39, 40, 44, + 45, 46, 50, 51, 52, 54, 56, 58, 61, 64, 67, 69, 71, 73, 74, 76, 78, 81, 82, 83, 85, 86, + 89, 90, 92, 95, 97, 101, 102, 103, 6, 9, 15, 18, 20, 23, 26, 31, 36, 41, 47, 53, 55, 57, + 59, 62, 65, 68, 70, 72, 75, 77, 79, 84, 87, 91, 93, 96, 98, 104, 7, 10, 27, 37, 42, 48, + 60, 63, 66, 80, 88, 94, 99, 105, 0, 11, 38, 43, 49, 100, 106, 1, 107, 2, 108, 3, 109, 4, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + }}, + {128, + { + 6, 9, 13, 14, 15, 17, 18, 20, 22, 23, 25, 26, 29, 30, 31, 33, 34, 35, 36, 40, 41, 45, + 46, 47, 51, 52, 53, 55, 57, 59, 62, 65, 68, 70, 72, 74, 75, 77, 79, 82, 83, 84, 86, 87, + 90, 91, 93, 96, 98, 102, 103, 104, 7, 10, 16, 19, 21, 24, 27, 32, 37, 42, 48, 54, 56, 58, + 60, 63, 66, 69, 71, 73, 76, 78, 80, 85, 88, 92, 94, 97, 99, 105, 0, 8, 11, 28, 38, 43, + 49, 61, 64, 67, 81, 89, 95, 100, 106, 1, 12, 39, 44, 50, 101, 107, 2, 108, 3, 109, 4, 110, + 5, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + }}, + {129, + { + 7, 10, 14, 15, 16, 18, 19, 21, 23, 24, 26, 27, 30, 31, 32, 34, 35, 36, 37, 41, 42, 46, + 47, 48, 52, 53, 54, 56, 58, 60, 63, 66, 69, 71, 73, 75, 76, 78, 80, 83, 84, 85, 87, 88, + 91, 92, 94, 97, 99, 103, 104, 105, 0, 8, 11, 17, 20, 22, 25, 28, 33, 38, 43, 49, 55, 57, + 59, 61, 64, 67, 70, 72, 74, 77, 79, 81, 86, 89, 93, 95, 98, 100, 106, 1, 9, 12, 29, 39, + 44, 50, 62, 65, 68, 82, 90, 96, 101, 107, 2, 13, 40, 45, 51, 102, 108, 3, 109, 4, 110, 5, + 111, 6, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + }}, + {130, + { + 0, 8, 11, 15, 16, 17, 19, 20, 22, 24, 25, 27, 28, 31, 32, 33, 35, 36, 37, 38, 42, 43, + 47, 48, 49, 53, 54, 55, 57, 59, 61, 64, 67, 70, 72, 74, 76, 77, 79, 81, 84, 85, 86, 88, + 89, 92, 93, 95, 98, 100, 104, 105, 106, 1, 9, 12, 18, 21, 23, 26, 29, 34, 39, 44, 50, 56, + 58, 60, 62, 65, 68, 71, 73, 75, 78, 80, 82, 87, 90, 94, 96, 99, 101, 107, 2, 10, 13, 30, + 40, 45, 51, 63, 66, 69, 83, 91, 97, 102, 108, 3, 14, 41, 46, 52, 103, 109, 4, 110, 5, 111, + 6, 112, 7, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + }}, + {131, + { + 1, 9, 12, 16, 17, 18, 20, 21, 23, 25, 26, 28, 29, 32, 33, 34, 36, 37, 38, 39, 43, 44, + 48, 49, 50, 54, 55, 56, 58, 60, 62, 65, 68, 71, 73, 75, 77, 78, 80, 82, 85, 86, 87, 89, + 90, 93, 94, 96, 99, 101, 105, 106, 107, 2, 10, 13, 19, 22, 24, 27, 30, 35, 40, 45, 51, 57, + 59, 61, 63, 66, 69, 72, 74, 76, 79, 81, 83, 88, 91, 95, 97, 100, 102, 108, 0, 3, 11, 14, + 31, 41, 46, 52, 64, 67, 70, 84, 92, 98, 103, 109, 4, 15, 42, 47, 53, 104, 110, 5, 111, 6, + 112, 7, 113, 8, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + }}, + {132, + { + 2, 10, 13, 17, 18, 19, 21, 22, 24, 26, 27, 29, 30, 33, 34, 35, 37, 38, 39, 40, 44, 45, + 49, 50, 51, 55, 56, 57, 59, 61, 63, 66, 69, 72, 74, 76, 78, 79, 81, 83, 86, 87, 88, 90, + 91, 94, 95, 97, 100, 102, 106, 107, 108, 0, 3, 11, 14, 20, 23, 25, 28, 31, 36, 41, 46, 52, + 58, 60, 62, 64, 67, 70, 73, 75, 77, 80, 82, 84, 89, 92, 96, 98, 101, 103, 109, 1, 4, 12, + 15, 32, 42, 47, 53, 65, 68, 71, 85, 93, 99, 104, 110, 5, 16, 43, 48, 54, 105, 111, 6, 112, + 7, 113, 8, 114, 9, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + }}, + {133, + { + 0, 3, 11, 14, 18, 19, 20, 22, 23, 25, 27, 28, 30, 31, 34, 35, 36, 38, 39, 40, 41, 45, 46, + 50, 51, 52, 56, 57, 58, 60, 62, 64, 67, 70, 73, 75, 77, 79, 80, 82, 84, 87, 88, 89, 91, 92, + 95, 96, 98, 101, 103, 107, 108, 109, 1, 4, 12, 15, 21, 24, 26, 29, 32, 37, 42, 47, 53, 59, 61, + 63, 65, 68, 71, 74, 76, 78, 81, 83, 85, 90, 93, 97, 99, 102, 104, 110, 2, 5, 13, 16, 33, 43, + 48, 54, 66, 69, 72, 86, 94, 100, 105, 111, 6, 17, 44, 49, 55, 106, 112, 7, 113, 8, 114, 9, 115, + 10, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + }}, + {134, + { + 1, 4, 12, 15, 19, 20, 21, 23, 24, 26, 28, 29, 31, 32, 35, 36, 37, 39, 40, 41, 42, 46, 47, + 51, 52, 53, 57, 58, 59, 61, 63, 65, 68, 71, 74, 76, 78, 80, 81, 83, 85, 88, 89, 90, 92, 93, + 96, 97, 99, 102, 104, 108, 109, 110, 2, 5, 13, 16, 22, 25, 27, 30, 33, 38, 43, 48, 54, 60, 62, + 64, 66, 69, 72, 75, 77, 79, 82, 84, 86, 91, 94, 98, 100, 103, 105, 111, 0, 3, 6, 14, 17, 34, + 44, 49, 55, 67, 70, 73, 87, 95, 101, 106, 112, 7, 18, 45, 50, 56, 107, 113, 8, 114, 9, 115, 10, + 116, 11, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + }}, + {135, + { + 2, 5, 13, 16, 20, 21, 22, 24, 25, 27, 29, 30, 32, 33, 36, 37, 38, 40, 41, 42, + 43, 47, 48, 52, 53, 54, 58, 59, 60, 62, 64, 66, 69, 72, 75, 77, 79, 81, 82, 84, + 86, 89, 90, 91, 93, 94, 97, 98, 100, 103, 105, 109, 110, 111, 0, 3, 6, 14, 17, 23, + 26, 28, 31, 34, 39, 44, 49, 55, 61, 63, 65, 67, 70, 73, 76, 78, 80, 83, 85, 87, + 92, 95, 99, 101, 104, 106, 112, 1, 4, 7, 15, 18, 35, 45, 50, 56, 68, 71, 74, 88, + 96, 102, 107, 113, 8, 19, 46, 51, 57, 108, 114, 9, 115, 10, 116, 11, 117, 12, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + }}, + {136, + { + 0, 3, 6, 14, 17, 21, 22, 23, 25, 26, 28, 30, 31, 33, 34, 37, 38, 39, 41, 42, + 43, 44, 48, 49, 53, 54, 55, 59, 60, 61, 63, 65, 67, 70, 73, 76, 78, 80, 82, 83, + 85, 87, 90, 91, 92, 94, 95, 98, 99, 101, 104, 106, 110, 111, 112, 1, 4, 7, 15, 18, + 24, 27, 29, 32, 35, 40, 45, 50, 56, 62, 64, 66, 68, 71, 74, 77, 79, 81, 84, 86, + 88, 93, 96, 100, 102, 105, 107, 113, 2, 5, 8, 16, 19, 36, 46, 51, 57, 69, 72, 75, + 89, 97, 103, 108, 114, 9, 20, 47, 52, 58, 109, 115, 10, 116, 11, 117, 12, 118, 13, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + }}, + {137, + { + 1, 4, 7, 15, 18, 22, 23, 24, 26, 27, 29, 31, 32, 34, 35, 38, 39, 40, 42, 43, + 44, 45, 49, 50, 54, 55, 56, 60, 61, 62, 64, 66, 68, 71, 74, 77, 79, 81, 83, 84, + 86, 88, 91, 92, 93, 95, 96, 99, 100, 102, 105, 107, 111, 112, 113, 0, 2, 5, 8, 16, + 19, 25, 28, 30, 33, 36, 41, 46, 51, 57, 63, 65, 67, 69, 72, 75, 78, 80, 82, 85, + 87, 89, 94, 97, 101, 103, 106, 108, 114, 3, 6, 9, 17, 20, 37, 47, 52, 58, 70, 73, + 76, 90, 98, 104, 109, 115, 10, 21, 48, 53, 59, 110, 116, 11, 117, 12, 118, 13, 119, 14, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + }}, + {138, + { + 0, 2, 5, 8, 16, 19, 23, 24, 25, 27, 28, 30, 32, 33, 35, 36, 39, 40, 41, 43, + 44, 45, 46, 50, 51, 55, 56, 57, 61, 62, 63, 65, 67, 69, 72, 75, 78, 80, 82, 84, + 85, 87, 89, 92, 93, 94, 96, 97, 100, 101, 103, 106, 108, 112, 113, 114, 1, 3, 6, 9, + 17, 20, 26, 29, 31, 34, 37, 42, 47, 52, 58, 64, 66, 68, 70, 73, 76, 79, 81, 83, + 86, 88, 90, 95, 98, 102, 104, 107, 109, 115, 4, 7, 10, 18, 21, 38, 48, 53, 59, 71, + 74, 77, 91, 99, 105, 110, 116, 11, 22, 49, 54, 60, 111, 117, 12, 118, 13, 119, 14, 120, + 15, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + }}, + {139, + { + 0, 1, 3, 6, 9, 17, 20, 24, 25, 26, 28, 29, 31, 33, 34, 36, 37, 40, 41, 42, + 44, 45, 46, 47, 51, 52, 56, 57, 58, 62, 63, 64, 66, 68, 70, 73, 76, 79, 81, 83, + 85, 86, 88, 90, 93, 94, 95, 97, 98, 101, 102, 104, 107, 109, 113, 114, 115, 2, 4, 7, + 10, 18, 21, 27, 30, 32, 35, 38, 43, 48, 53, 59, 65, 67, 69, 71, 74, 77, 80, 82, + 84, 87, 89, 91, 96, 99, 103, 105, 108, 110, 116, 5, 8, 11, 19, 22, 39, 49, 54, 60, + 72, 75, 78, 92, 100, 106, 111, 117, 12, 23, 50, 55, 61, 112, 118, 13, 119, 14, 120, 15, + 121, 16, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + }}, + {140, + { + 0, 1, 2, 4, 7, 10, 18, 21, 25, 26, 27, 29, 30, 32, 34, 35, 37, 38, 41, 42, + 43, 45, 46, 47, 48, 52, 53, 57, 58, 59, 63, 64, 65, 67, 69, 71, 74, 77, 80, 82, + 84, 86, 87, 89, 91, 94, 95, 96, 98, 99, 102, 103, 105, 108, 110, 114, 115, 116, 3, 5, + 8, 11, 19, 22, 28, 31, 33, 36, 39, 44, 49, 54, 60, 66, 68, 70, 72, 75, 78, 81, + 83, 85, 88, 90, 92, 97, 100, 104, 106, 109, 111, 117, 6, 9, 12, 20, 23, 40, 50, 55, + 61, 73, 76, 79, 93, 101, 107, 112, 118, 13, 24, 51, 56, 62, 113, 119, 14, 120, 15, 121, + 16, 122, 17, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + }}, + {141, + { + 1, 2, 3, 5, 8, 11, 19, 22, 26, 27, 28, 30, 31, 33, 35, 36, 38, 39, 42, 43, 44, + 46, 47, 48, 49, 53, 54, 58, 59, 60, 64, 65, 66, 68, 70, 72, 75, 78, 81, 83, 85, 87, + 88, 90, 92, 95, 96, 97, 99, 100, 103, 104, 106, 109, 111, 115, 116, 117, 4, 6, 9, 12, 20, + 23, 29, 32, 34, 37, 40, 45, 50, 55, 61, 67, 69, 71, 73, 76, 79, 82, 84, 86, 89, 91, + 93, 98, 101, 105, 107, 110, 112, 118, 7, 10, 13, 21, 24, 41, 51, 56, 62, 74, 77, 80, 94, + 102, 108, 113, 119, 0, 14, 25, 52, 57, 63, 114, 120, 15, 121, 16, 122, 17, 123, 18, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + }}, + {142, + { + 2, 3, 4, 6, 9, 12, 20, 23, 27, 28, 29, 31, 32, 34, 36, 37, 39, 40, 43, 44, 45, + 47, 48, 49, 50, 54, 55, 59, 60, 61, 65, 66, 67, 69, 71, 73, 76, 79, 82, 84, 86, 88, + 89, 91, 93, 96, 97, 98, 100, 101, 104, 105, 107, 110, 112, 116, 117, 118, 5, 7, 10, 13, 21, + 24, 30, 33, 35, 38, 41, 46, 51, 56, 62, 68, 70, 72, 74, 77, 80, 83, 85, 87, 90, 92, + 94, 99, 102, 106, 108, 111, 113, 119, 0, 8, 11, 14, 22, 25, 42, 52, 57, 63, 75, 78, 81, + 95, 103, 109, 114, 120, 1, 15, 26, 53, 58, 64, 115, 121, 16, 122, 17, 123, 18, 124, 19, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + }}, + {143, + { + 3, 4, 5, 7, 10, 13, 21, 24, 28, 29, 30, 32, 33, 35, 37, 38, 40, 41, 44, 45, 46, + 48, 49, 50, 51, 55, 56, 60, 61, 62, 66, 67, 68, 70, 72, 74, 77, 80, 83, 85, 87, 89, + 90, 92, 94, 97, 98, 99, 101, 102, 105, 106, 108, 111, 113, 117, 118, 119, 0, 6, 8, 11, 14, + 22, 25, 31, 34, 36, 39, 42, 47, 52, 57, 63, 69, 71, 73, 75, 78, 81, 84, 86, 88, 91, + 93, 95, 100, 103, 107, 109, 112, 114, 120, 1, 9, 12, 15, 23, 26, 43, 53, 58, 64, 76, 79, + 82, 96, 104, 110, 115, 121, 2, 16, 27, 54, 59, 65, 116, 122, 17, 123, 18, 124, 19, 125, 20, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + }}, + {144, + { + 0, 4, 5, 6, 8, 11, 14, 22, 25, 29, 30, 31, 33, 34, 36, 38, 39, 41, 42, 45, 46, + 47, 49, 50, 51, 52, 56, 57, 61, 62, 63, 67, 68, 69, 71, 73, 75, 78, 81, 84, 86, 88, + 90, 91, 93, 95, 98, 99, 100, 102, 103, 106, 107, 109, 112, 114, 118, 119, 120, 1, 7, 9, 12, + 15, 23, 26, 32, 35, 37, 40, 43, 48, 53, 58, 64, 70, 72, 74, 76, 79, 82, 85, 87, 89, + 92, 94, 96, 101, 104, 108, 110, 113, 115, 121, 2, 10, 13, 16, 24, 27, 44, 54, 59, 65, 77, + 80, 83, 97, 105, 111, 116, 122, 3, 17, 28, 55, 60, 66, 117, 123, 18, 124, 19, 125, 20, 126, + 21, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + }}, + {145, + { + 0, 1, 5, 6, 7, 9, 12, 15, 23, 26, 30, 31, 32, 34, 35, 37, 39, 40, 42, 43, 46, + 47, 48, 50, 51, 52, 53, 57, 58, 62, 63, 64, 68, 69, 70, 72, 74, 76, 79, 82, 85, 87, + 89, 91, 92, 94, 96, 99, 100, 101, 103, 104, 107, 108, 110, 113, 115, 119, 120, 121, 2, 8, 10, + 13, 16, 24, 27, 33, 36, 38, 41, 44, 49, 54, 59, 65, 71, 73, 75, 77, 80, 83, 86, 88, + 90, 93, 95, 97, 102, 105, 109, 111, 114, 116, 122, 3, 11, 14, 17, 25, 28, 45, 55, 60, 66, + 78, 81, 84, 98, 106, 112, 117, 123, 4, 18, 29, 56, 61, 67, 118, 124, 19, 125, 20, 126, 21, + 127, 22, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + }}, + {146, + { + 1, 2, 6, 7, 8, 10, 13, 16, 24, 27, 31, 32, 33, 35, 36, 38, 40, 41, 43, 44, 47, + 48, 49, 51, 52, 53, 54, 58, 59, 63, 64, 65, 69, 70, 71, 73, 75, 77, 80, 83, 86, 88, + 90, 92, 93, 95, 97, 100, 101, 102, 104, 105, 108, 109, 111, 114, 116, 120, 121, 122, 3, 9, 11, + 14, 17, 25, 28, 34, 37, 39, 42, 45, 50, 55, 60, 66, 72, 74, 76, 78, 81, 84, 87, 89, + 91, 94, 96, 98, 103, 106, 110, 112, 115, 117, 123, 4, 12, 15, 18, 26, 29, 46, 56, 61, 67, + 79, 82, 85, 99, 107, 113, 118, 124, 5, 19, 30, 57, 62, 68, 119, 125, 0, 20, 126, 21, 127, + 22, 128, 23, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + }}, + {147, + { + 2, 3, 7, 8, 9, 11, 14, 17, 25, 28, 32, 33, 34, 36, 37, 39, 41, 42, 44, 45, 48, + 49, 50, 52, 53, 54, 55, 59, 60, 64, 65, 66, 70, 71, 72, 74, 76, 78, 81, 84, 87, 89, + 91, 93, 94, 96, 98, 101, 102, 103, 105, 106, 109, 110, 112, 115, 117, 121, 122, 123, 4, 10, 12, + 15, 18, 26, 29, 35, 38, 40, 43, 46, 51, 56, 61, 67, 73, 75, 77, 79, 82, 85, 88, 90, + 92, 95, 97, 99, 104, 107, 111, 113, 116, 118, 124, 5, 13, 16, 19, 27, 30, 47, 57, 62, 68, + 80, 83, 86, 100, 108, 114, 119, 125, 0, 6, 20, 31, 58, 63, 69, 120, 126, 1, 21, 127, 22, + 128, 23, 129, 24, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + }}, + {148, + { + 3, 4, 8, 9, 10, 12, 15, 18, 26, 29, 33, 34, 35, 37, 38, 40, 42, 43, 45, 46, 49, 50, + 51, 53, 54, 55, 56, 60, 61, 65, 66, 67, 71, 72, 73, 75, 77, 79, 82, 85, 88, 90, 92, 94, + 95, 97, 99, 102, 103, 104, 106, 107, 110, 111, 113, 116, 118, 122, 123, 124, 5, 11, 13, 16, 19, 27, + 30, 36, 39, 41, 44, 47, 52, 57, 62, 68, 74, 76, 78, 80, 83, 86, 89, 91, 93, 96, 98, 100, + 105, 108, 112, 114, 117, 119, 125, 0, 6, 14, 17, 20, 28, 31, 48, 58, 63, 69, 81, 84, 87, 101, + 109, 115, 120, 126, 1, 7, 21, 32, 59, 64, 70, 121, 127, 2, 22, 128, 23, 129, 24, 130, 25, 131, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + }}, + {149, + { + 4, 5, 9, 10, 11, 13, 16, 19, 27, 30, 34, 35, 36, 38, 39, 41, 43, 44, 46, 47, 50, 51, + 52, 54, 55, 56, 57, 61, 62, 66, 67, 68, 72, 73, 74, 76, 78, 80, 83, 86, 89, 91, 93, 95, + 96, 98, 100, 103, 104, 105, 107, 108, 111, 112, 114, 117, 119, 123, 124, 125, 0, 6, 12, 14, 17, 20, + 28, 31, 37, 40, 42, 45, 48, 53, 58, 63, 69, 75, 77, 79, 81, 84, 87, 90, 92, 94, 97, 99, + 101, 106, 109, 113, 115, 118, 120, 126, 1, 7, 15, 18, 21, 29, 32, 49, 59, 64, 70, 82, 85, 88, + 102, 110, 116, 121, 127, 2, 8, 22, 33, 60, 65, 71, 122, 128, 3, 23, 129, 24, 130, 25, 131, 26, + 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + }}, + {150, + { + 0, 5, 6, 10, 11, 12, 14, 17, 20, 28, 31, 35, 36, 37, 39, 40, 42, 44, 45, 47, 48, 51, + 52, 53, 55, 56, 57, 58, 62, 63, 67, 68, 69, 73, 74, 75, 77, 79, 81, 84, 87, 90, 92, 94, + 96, 97, 99, 101, 104, 105, 106, 108, 109, 112, 113, 115, 118, 120, 124, 125, 126, 1, 7, 13, 15, 18, + 21, 29, 32, 38, 41, 43, 46, 49, 54, 59, 64, 70, 76, 78, 80, 82, 85, 88, 91, 93, 95, 98, + 100, 102, 107, 110, 114, 116, 119, 121, 127, 2, 8, 16, 19, 22, 30, 33, 50, 60, 65, 71, 83, 86, + 89, 103, 111, 117, 122, 128, 3, 9, 23, 34, 61, 66, 72, 123, 129, 4, 24, 130, 25, 131, 26, 132, + 27, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + }}, + {151, + { + 1, 6, 7, 11, 12, 13, 15, 18, 21, 29, 32, 36, 37, 38, 40, 41, 43, 45, 46, 48, 49, 52, + 53, 54, 56, 57, 58, 59, 63, 64, 68, 69, 70, 74, 75, 76, 78, 80, 82, 85, 88, 91, 93, 95, + 97, 98, 100, 102, 105, 106, 107, 109, 110, 113, 114, 116, 119, 121, 125, 126, 127, 2, 8, 14, 16, 19, + 22, 30, 33, 39, 42, 44, 47, 50, 55, 60, 65, 71, 77, 79, 81, 83, 86, 89, 92, 94, 96, 99, + 101, 103, 108, 111, 115, 117, 120, 122, 128, 3, 9, 17, 20, 23, 31, 34, 51, 61, 66, 72, 84, 87, + 90, 104, 112, 118, 123, 129, 4, 10, 24, 35, 62, 67, 73, 124, 130, 0, 5, 25, 131, 26, 132, 27, + 133, 28, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + }}, + {152, + { + 2, 7, 8, 12, 13, 14, 16, 19, 22, 30, 33, 37, 38, 39, 41, 42, 44, 46, 47, 49, 50, 53, + 54, 55, 57, 58, 59, 60, 64, 65, 69, 70, 71, 75, 76, 77, 79, 81, 83, 86, 89, 92, 94, 96, + 98, 99, 101, 103, 106, 107, 108, 110, 111, 114, 115, 117, 120, 122, 126, 127, 128, 3, 9, 15, 17, 20, + 23, 31, 34, 40, 43, 45, 48, 51, 56, 61, 66, 72, 78, 80, 82, 84, 87, 90, 93, 95, 97, 100, + 102, 104, 109, 112, 116, 118, 121, 123, 129, 4, 10, 18, 21, 24, 32, 35, 52, 62, 67, 73, 85, 88, + 91, 105, 113, 119, 124, 130, 0, 5, 11, 25, 36, 63, 68, 74, 125, 131, 1, 6, 26, 132, 27, 133, + 28, 134, 29, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + }}, + {153, + { + 3, 8, 9, 13, 14, 15, 17, 20, 23, 31, 34, 38, 39, 40, 42, 43, 45, 47, 48, 50, 51, 54, + 55, 56, 58, 59, 60, 61, 65, 66, 70, 71, 72, 76, 77, 78, 80, 82, 84, 87, 90, 93, 95, 97, + 99, 100, 102, 104, 107, 108, 109, 111, 112, 115, 116, 118, 121, 123, 127, 128, 129, 4, 10, 16, 18, 21, + 24, 32, 35, 41, 44, 46, 49, 52, 57, 62, 67, 73, 79, 81, 83, 85, 88, 91, 94, 96, 98, 101, + 103, 105, 110, 113, 117, 119, 122, 124, 130, 0, 5, 11, 19, 22, 25, 33, 36, 53, 63, 68, 74, 86, + 89, 92, 106, 114, 120, 125, 131, 1, 6, 12, 26, 37, 64, 69, 75, 126, 132, 2, 7, 27, 133, 28, + 134, 29, 135, 30, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + }}, + {154, + { + 4, 9, 10, 14, 15, 16, 18, 21, 24, 32, 35, 39, 40, 41, 43, 44, 46, 48, 49, 51, 52, 55, + 56, 57, 59, 60, 61, 62, 66, 67, 71, 72, 73, 77, 78, 79, 81, 83, 85, 88, 91, 94, 96, 98, + 100, 101, 103, 105, 108, 109, 110, 112, 113, 116, 117, 119, 122, 124, 128, 129, 130, 0, 5, 11, 17, 19, + 22, 25, 33, 36, 42, 45, 47, 50, 53, 58, 63, 68, 74, 80, 82, 84, 86, 89, 92, 95, 97, 99, + 102, 104, 106, 111, 114, 118, 120, 123, 125, 131, 1, 6, 12, 20, 23, 26, 34, 37, 54, 64, 69, 75, + 87, 90, 93, 107, 115, 121, 126, 132, 2, 7, 13, 27, 38, 65, 70, 76, 127, 133, 3, 8, 28, 134, + 29, 135, 30, 136, 31, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + }}, + {155, + { + 0, 5, 10, 11, 15, 16, 17, 19, 22, 25, 33, 36, 40, 41, 42, 44, 45, 47, 49, 50, + 52, 53, 56, 57, 58, 60, 61, 62, 63, 67, 68, 72, 73, 74, 78, 79, 80, 82, 84, 86, + 89, 92, 95, 97, 99, 101, 102, 104, 106, 109, 110, 111, 113, 114, 117, 118, 120, 123, 125, 129, + 130, 131, 1, 6, 12, 18, 20, 23, 26, 34, 37, 43, 46, 48, 51, 54, 59, 64, 69, 75, + 81, 83, 85, 87, 90, 93, 96, 98, 100, 103, 105, 107, 112, 115, 119, 121, 124, 126, 132, 2, + 7, 13, 21, 24, 27, 35, 38, 55, 65, 70, 76, 88, 91, 94, 108, 116, 122, 127, 133, 3, + 8, 14, 28, 39, 66, 71, 77, 128, 134, 4, 9, 29, 135, 30, 136, 31, 137, 32, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + }}, + {156, + { + 1, 6, 11, 12, 16, 17, 18, 20, 23, 26, 34, 37, 41, 42, 43, 45, 46, 48, 50, 51, + 53, 54, 57, 58, 59, 61, 62, 63, 64, 68, 69, 73, 74, 75, 79, 80, 81, 83, 85, 87, + 90, 93, 96, 98, 100, 102, 103, 105, 107, 110, 111, 112, 114, 115, 118, 119, 121, 124, 126, 130, + 131, 132, 0, 2, 7, 13, 19, 21, 24, 27, 35, 38, 44, 47, 49, 52, 55, 60, 65, 70, + 76, 82, 84, 86, 88, 91, 94, 97, 99, 101, 104, 106, 108, 113, 116, 120, 122, 125, 127, 133, + 3, 8, 14, 22, 25, 28, 36, 39, 56, 66, 71, 77, 89, 92, 95, 109, 117, 123, 128, 134, + 4, 9, 15, 29, 40, 67, 72, 78, 129, 135, 5, 10, 30, 136, 31, 137, 32, 138, 33, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + }}, + {157, + { + 0, 2, 7, 12, 13, 17, 18, 19, 21, 24, 27, 35, 38, 42, 43, 44, 46, 47, 49, 51, + 52, 54, 55, 58, 59, 60, 62, 63, 64, 65, 69, 70, 74, 75, 76, 80, 81, 82, 84, 86, + 88, 91, 94, 97, 99, 101, 103, 104, 106, 108, 111, 112, 113, 115, 116, 119, 120, 122, 125, 127, + 131, 132, 133, 1, 3, 8, 14, 20, 22, 25, 28, 36, 39, 45, 48, 50, 53, 56, 61, 66, + 71, 77, 83, 85, 87, 89, 92, 95, 98, 100, 102, 105, 107, 109, 114, 117, 121, 123, 126, 128, + 134, 4, 9, 15, 23, 26, 29, 37, 40, 57, 67, 72, 78, 90, 93, 96, 110, 118, 124, 129, + 135, 5, 10, 16, 30, 41, 68, 73, 79, 130, 136, 6, 11, 31, 137, 32, 138, 33, 139, 34, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + }}, + {158, + { + 1, 3, 8, 13, 14, 18, 19, 20, 22, 25, 28, 36, 39, 43, 44, 45, 47, 48, 50, 52, + 53, 55, 56, 59, 60, 61, 63, 64, 65, 66, 70, 71, 75, 76, 77, 81, 82, 83, 85, 87, + 89, 92, 95, 98, 100, 102, 104, 105, 107, 109, 112, 113, 114, 116, 117, 120, 121, 123, 126, 128, + 132, 133, 134, 2, 4, 9, 15, 21, 23, 26, 29, 37, 40, 46, 49, 51, 54, 57, 62, 67, + 72, 78, 84, 86, 88, 90, 93, 96, 99, 101, 103, 106, 108, 110, 115, 118, 122, 124, 127, 129, + 135, 0, 5, 10, 16, 24, 27, 30, 38, 41, 58, 68, 73, 79, 91, 94, 97, 111, 119, 125, + 130, 136, 6, 11, 17, 31, 42, 69, 74, 80, 131, 137, 7, 12, 32, 138, 33, 139, 34, 140, + 35, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + }}, + {159, + { + 2, 4, 9, 14, 15, 19, 20, 21, 23, 26, 29, 37, 40, 44, 45, 46, 48, 49, 51, 53, + 54, 56, 57, 60, 61, 62, 64, 65, 66, 67, 71, 72, 76, 77, 78, 82, 83, 84, 86, 88, + 90, 93, 96, 99, 101, 103, 105, 106, 108, 110, 113, 114, 115, 117, 118, 121, 122, 124, 127, 129, + 133, 134, 135, 0, 3, 5, 10, 16, 22, 24, 27, 30, 38, 41, 47, 50, 52, 55, 58, 63, + 68, 73, 79, 85, 87, 89, 91, 94, 97, 100, 102, 104, 107, 109, 111, 116, 119, 123, 125, 128, + 130, 136, 1, 6, 11, 17, 25, 28, 31, 39, 42, 59, 69, 74, 80, 92, 95, 98, 112, 120, + 126, 131, 137, 7, 12, 18, 32, 43, 70, 75, 81, 132, 138, 8, 13, 33, 139, 34, 140, 35, + 141, 36, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + }}, + {160, + { + 0, 3, 5, 10, 15, 16, 20, 21, 22, 24, 27, 30, 38, 41, 45, 46, 47, 49, 50, 52, + 54, 55, 57, 58, 61, 62, 63, 65, 66, 67, 68, 72, 73, 77, 78, 79, 83, 84, 85, 87, + 89, 91, 94, 97, 100, 102, 104, 106, 107, 109, 111, 114, 115, 116, 118, 119, 122, 123, 125, 128, + 130, 134, 135, 136, 1, 4, 6, 11, 17, 23, 25, 28, 31, 39, 42, 48, 51, 53, 56, 59, + 64, 69, 74, 80, 86, 88, 90, 92, 95, 98, 101, 103, 105, 108, 110, 112, 117, 120, 124, 126, + 129, 131, 137, 2, 7, 12, 18, 26, 29, 32, 40, 43, 60, 70, 75, 81, 93, 96, 99, 113, + 121, 127, 132, 138, 8, 13, 19, 33, 44, 71, 76, 82, 133, 139, 9, 14, 34, 140, 35, 141, + 36, 142, 37, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + }}, + {161, + { + 1, 4, 6, 11, 16, 17, 21, 22, 23, 25, 28, 31, 39, 42, 46, 47, 48, 50, 51, 53, 55, + 56, 58, 59, 62, 63, 64, 66, 67, 68, 69, 73, 74, 78, 79, 80, 84, 85, 86, 88, 90, 92, + 95, 98, 101, 103, 105, 107, 108, 110, 112, 115, 116, 117, 119, 120, 123, 124, 126, 129, 131, 135, 136, + 137, 0, 2, 5, 7, 12, 18, 24, 26, 29, 32, 40, 43, 49, 52, 54, 57, 60, 65, 70, 75, + 81, 87, 89, 91, 93, 96, 99, 102, 104, 106, 109, 111, 113, 118, 121, 125, 127, 130, 132, 138, 3, + 8, 13, 19, 27, 30, 33, 41, 44, 61, 71, 76, 82, 94, 97, 100, 114, 122, 128, 133, 139, 9, + 14, 20, 34, 45, 72, 77, 83, 134, 140, 10, 15, 35, 141, 36, 142, 37, 143, 38, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + }}, + {162, + { + 0, 2, 5, 7, 12, 17, 18, 22, 23, 24, 26, 29, 32, 40, 43, 47, 48, 49, 51, 52, 54, + 56, 57, 59, 60, 63, 64, 65, 67, 68, 69, 70, 74, 75, 79, 80, 81, 85, 86, 87, 89, 91, + 93, 96, 99, 102, 104, 106, 108, 109, 111, 113, 116, 117, 118, 120, 121, 124, 125, 127, 130, 132, 136, + 137, 138, 1, 3, 6, 8, 13, 19, 25, 27, 30, 33, 41, 44, 50, 53, 55, 58, 61, 66, 71, + 76, 82, 88, 90, 92, 94, 97, 100, 103, 105, 107, 110, 112, 114, 119, 122, 126, 128, 131, 133, 139, + 4, 9, 14, 20, 28, 31, 34, 42, 45, 62, 72, 77, 83, 95, 98, 101, 115, 123, 129, 134, 140, + 10, 15, 21, 35, 46, 73, 78, 84, 135, 141, 11, 16, 36, 142, 37, 143, 38, 144, 39, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + }}, + {163, + { + 1, 3, 6, 8, 13, 18, 19, 23, 24, 25, 27, 30, 33, 41, 44, 48, 49, 50, 52, 53, 55, + 57, 58, 60, 61, 64, 65, 66, 68, 69, 70, 71, 75, 76, 80, 81, 82, 86, 87, 88, 90, 92, + 94, 97, 100, 103, 105, 107, 109, 110, 112, 114, 117, 118, 119, 121, 122, 125, 126, 128, 131, 133, 137, + 138, 139, 0, 2, 4, 7, 9, 14, 20, 26, 28, 31, 34, 42, 45, 51, 54, 56, 59, 62, 67, + 72, 77, 83, 89, 91, 93, 95, 98, 101, 104, 106, 108, 111, 113, 115, 120, 123, 127, 129, 132, 134, + 140, 5, 10, 15, 21, 29, 32, 35, 43, 46, 63, 73, 78, 84, 96, 99, 102, 116, 124, 130, 135, + 141, 11, 16, 22, 36, 47, 74, 79, 85, 136, 142, 12, 17, 37, 143, 38, 144, 39, 145, 40, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + }}, + {0, {}}}; diff --git a/lib/src/phy/fec/polar/test/polar_interleaver_test.c b/lib/src/phy/fec/polar/test/polar_interleaver_test.c new file mode 100644 index 000000000..151ca85bb --- /dev/null +++ b/lib/src/phy/fec/polar/test/polar_interleaver_test.c @@ -0,0 +1,50 @@ +/** + * + * \section COPYRIGHT + * + * Copyright 2013-2020 Software Radio Systems Limited + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the distribution. + * + */ + +#include "polar_interleaver_gold.h" +#include "srslte/common/test_common.h" +#include "srslte/phy/fec/polar/polar_interleaver.h" + +int main(int argc, char** argv) +{ + uint32_t idx = 0; + while (polar_interleaver_gold[idx].K) { + uint32_t K = polar_interleaver_gold[idx].K; + + // Create indexes in order + uint16_t indexes_in[SRSLTE_POLAR_INTERLEAVER_K_MAX_IL]; + for (uint16_t i = 0; i < (uint16_t)K; i++) { + indexes_in[i] = i; + } + + // Run interleaver forward + uint16_t indexes_out[SRSLTE_POLAR_INTERLEAVER_K_MAX_IL]; + srslte_polar_interleaver_run_u16(indexes_in, indexes_out, K, true); + + // Check indexes + for (uint32_t i = 0; i < K; i++) { + TESTASSERT(polar_interleaver_gold[idx].indexes[i] == indexes_out[i]); + } + + // Run interleaver backwards + srslte_polar_interleaver_run_u16(indexes_out, indexes_in, K, false); + + // Check indexes + for (uint16_t i = 0; i < (uint16_t)K; i++) { + TESTASSERT(indexes_in[i] == i); + } + + idx++; + } + + return SRSLTE_SUCCESS; +} \ No newline at end of file